【问题标题】:How to transform test data according to model in CNN?如何根据 CNN 中的模型转换测试数据?
【发布时间】:2017-09-11 10:39:32
【问题描述】:

我是 Keras 的新手,我正在学习构建卷积神经网络模型。我正在使用 MNIST 数据集。

(X_train, y_train), (X_test, y_test) = mnist.load_data()

在构建和评估之后,我的准确率达到了 99% 以上。

model = NN_model() # Sequential model built with multiple Convolution and pooling layers

model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=3, batch_size=200, verbose=2)

scores = model.evaluate(X_test, y_test, verbose=0)

现在,我想手动检查结果,方法是选择随机图像,使用 matplotlib 打印,然后使用学习模型进行预测。例如,X_test[39] 数据看起来像 this

print(model.predict(X_test[39],verbose=2))

当我尝试这样做时,它要求我将预处理数据转换为 conv2d 数据,因为模型正在转换它。如何手动将此转换应用于测试数据?

ValueError: Error when checking : expected conv2d_1_input to have 4 dimensions, but got array with shape (1, 28, 28)

【问题讨论】:

    标签: python neural-network keras conv-neural-network


    【解决方案1】:

    模型没有转换任何东西,网络获取了一批形状为(num_samples, channels, width, height)的图像。在这种情况下,您只有一个样本,因此您应该通过添加新维度将 num_samples 设置为 1:

    sample = X_test[39]
    model.predict(sample[np.newaxis, :, :, :])
    

    或者您也可以将示例数组重新整形为(1, 1, 28, 28)

    【讨论】:

    • 标准 Keras 使用 channels_last(除非用户已明确更改),这意味着形状应为 (1,28,28,1)
    • @Daniel 阅读问题中的错误信息,已经是 (1, 1, 28, 28)。
    • @Daniel 丢弃第一个维度 (X_test[39]) 后的 (1,28,28)。
    • @Daniel 准确地说,输入是 (1,28, 28)。完整的输入是 (something, 1, 28, 28)。
    • @Daniel 请在评论前再次阅读问题。第一个维度被丢弃,因为 X_test[39] 作为输入(不是完整的 X_test)。
    【解决方案2】:

    我想你需要重塑数据(也许它是在训练时在模型内完成的,没有代码就不能说)。试试这样的:

    print(model.predict(X_test[39].reshape(-1, 28, 28, 1),verbose=2))
    

    【讨论】:

      猜你喜欢
      • 2019-12-10
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 2018-11-02
      • 2016-02-20
      • 1970-01-01
      相关资源
      最近更新 更多