【问题标题】:Keras Predict Single Example with keras.predict?Keras 使用 keras.predict 预测单个示例?
【发布时间】:2020-12-16 00:26:47
【问题描述】:

我确信/希望这是一个非常简单的问题,但我无法找到任何答案。

我在 Keras 中创建了一个包含 366 个输入神经元和一个输出神经元的序列模型。它似乎可以很好地训练和评估,但是每当我尝试预测单个示例时,我都会得到一个形状为 (366, 1) 的 numpy 数组,尽管 model.output_shape(None, 1)

我知道here 存在一个非常相似的问题,但不幸的是,没有一个提议的解决方案能解决我的问题。

根据我的阅读,这是因为 Keras 将每个输入视为一个单独的示例来进行预测,但是,到目前为止,这对我没有帮助。 我尝试将输入作为大小为 (366, 1)(1, 366)(366,) 的 numpy 数组以及包含每个变体的列表传递,但没有任何效果((1, 366) 抛出错误,并且所有其他人的输出大小为(366, 1))。

如果有人能提供帮助,将不胜感激。谢谢。

代码如下:(如果不是很整洁,请见谅)

培训:

import example_generator as eg
import numpy as np
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential

training_data = np.load("../data/training_data.npy", allow_pickle=True)
testing_data = np.load("../data/testing_data.npy", allow_pickle=True)

model = Sequential([
    Dense(100, activation="relu"),
    Dense(30, activation="relu"),
    Dense(1, activation="linear")
])

model.compile(
    optimizer = "Adam",
    loss="mean_squared_error",
    metrics="mean_absolute_error"
)

model.fit(
    eg.yield_training_example(training_data, 366),
    epochs=1,
    steps_per_epoch = 14590,
    batch_size=50
)

model.evaluate(
    eg.yield_training_example(testing_data, 366),
    steps = 50
)

model.save("../models/model")

用于测试:

import example_generator as eg
import numpy as np
from tensorflow.keras.models import load_model

testing_data = np.load("../../data/testing_data.npy", allow_pickle=True)
model = load_model("../../data/models/feedforward")

testing_example = next(eg.yield_training_example(testing_data, 366))
X = testing_example[0]

prediction = model.predict(
    X
)

print(f"Prediction: {prediction}\nAnswer: {testing_example[1]}\n\n")

对于我用来返回示例的生成器:

import numpy as np

# Acts as an iterable of training examples
def yield_training_example(data, num_nn_inputs = 366):
    for eg in data[:, 1]:
        inc = 0
        while (inc <= (len(eg) - num_nn_inputs - 1)):
            yield (
                np.array(eg[inc:(inc + num_nn_inputs), :]).astype(np.float32),
                np.array(eg[(inc + num_nn_inputs), :]).astype(np.float32)
            )
            inc += 1

【问题讨论】:

  • 您也可以发布您的代码吗?
  • @Ziri 我加了。另外,感谢您的回复。
  • 我建议你开始使用 tf.data 来构建你的管道......它在后台处理了这么多......当然......你不会再有这个问题了跨度>

标签: python numpy machine-learning keras tf.keras


【解决方案1】:

好的,我最终解决了这个问题。我需要在制作模型时指定输入尺寸,如下所示:

model = Sequential([
    Dense(100, activation="relu", input_dim=366),
    Dense(30, activation="relu"),
    Dense(1, activation="linear")
])

从那里我只需要确保网络的所有输入都作为形状为 (1, 366) 的数组传递。

【讨论】:

    猜你喜欢
    • 2017-08-15
    • 2018-12-05
    • 2019-06-04
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多