Python/Tensorflow - 我已经训练了卷积神经网络,如何测试它?

Posted

技术标签:

【中文标题】Python/Tensorflow - 我已经训练了卷积神经网络,如何测试它?【英文标题】:Python/Tensorflow - I have trained the convolutional neural network, how to test it? 【发布时间】:2017-08-19 06:59:05 【问题描述】:

我已经使用二进制文件中的以下数据(标签、文件名、数据(像素))训练了一个卷积神经网络 (CNN):

[array([2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1,
           0, 2, 1, 0, 2, 1, 0]), array(['10_c.jpg', '10_m.jpg', '10_n.jpg', '1_c.jpg',
           '1_m.jpg', '1_n.jpg', '2_c.jpg', '2_m.jpg',
           '2_n.jpg', '3_c.jpg', '3_m.jpg', '3_n.jpg',
           '4_c.jpg', '4_m.jpg', '4_n.jpg', '5_c.jpg',
           '5_m.jpg', '5_n.jpg', '6_c.jpg', '6_m.jpg',
           '6_n.jpg', '7_c.jpg', '7_m.jpg', '7_n.jpg',
           '8_c.jpg', '8_m.jpg', '8_n.jpg', '9_c.jpg',
           '9_m.jpg', '9_n.jpg'], 
          dtype='<U15'), array([[255, 252, 255, ..., 255, 255, 255],
           [136, 137, 138, ..., 114, 110, 111],
           [200, 200, 199, ..., 179, 178, 177],
           ..., 
           [146, 157, 165, ..., 202, 202, 201],
           [228, 225, 222, ..., 219, 221, 223],
           [128, 127, 127, ..., 133, 129, 127]])]

每批包含所有图像,运行 30 个 epoh:

EPOCH 0
0 0.476923
DONE WITH EPOCH
EPOCH 1
0 0.615385
DONE WITH EPOCH
EPOCH 2
0 0.615385
DONE WITH EPOCH
EPOCH 3
0 0.538462
DONE WITH EPOCH
EPOCH 4
0 0.384615
DONE WITH EPOCH
...
...
EPOCH 28
0 0.615385
DONE WITH EPOCH
EPOCH 29
0 0.692308
DONE WITH EPOCH

我的问题是我想尝试新图像(测试),并想知道返回的类(0,1,2)。在这种情况下我该怎么办?换句话说,我训练了 CNN,但是如何测试呢?

EDIT-1

对于评估准确性这一点,我在测试20张图片时得到了以下结果:

EPOCH 0
0 1.0
DONE WITH EPOCH
EPOCH 1
0 1.0
DONE WITH EPOCH
EPOCH 2
0 1.0
DONE WITH EPOCH
EPOCH 3
0 1.0
DONE WITH EPOCH
EPOCH 4
0 1.0
DONE WITH EPOCH
EPOCH 5
0 1.0
DONE WITH EPOCH
EPOCH 6
0 1.0
DONE WITH EPOCH
EPOCH 7
0 1.0
DONE WITH EPOCH
EPOCH 8
0 1.0
DONE WITH EPOCH
EPOCH 9
0 1.0
DONE WITH EPOCH
EPOCH 10
0 1.0
DONE WITH EPOCH
EPOCH 11
0 1.0
DONE WITH EPOCH
EPOCH 12
0 1.0
DONE WITH EPOCH
EPOCH 13
0 1.0
DONE WITH EPOCH
EPOCH 14
0 1.0
DONE WITH EPOCH
EPOCH 15
0 1.0
DONE WITH EPOCH
EPOCH 16
0 1.0
DONE WITH EPOCH
EPOCH 17
0 1.0
DONE WITH EPOCH
EPOCH 18
0 1.0
DONE WITH EPOCH
EPOCH 19
0 1.0
DONE WITH EPOCH
EPOCH 20
0 1.0
DONE WITH EPOCH
EPOCH 21
0 1.0
DONE WITH EPOCH
EPOCH 22
0 1.0
DONE WITH EPOCH
EPOCH 23
0 1.0
DONE WITH EPOCH
EPOCH 24
0 1.0
DONE WITH EPOCH
EPOCH 25
0 1.0
DONE WITH EPOCH
EPOCH 26
0 1.0
DONE WITH EPOCH
EPOCH 27
0 1.0
DONE WITH EPOCH
EPOCH 28
0 1.0
DONE WITH EPOCH
EPOCH 29
0 1.0
DONE WITH EPOCH

在应用获取网络为测试数据生成的标签点时,我得到了以下信息:

EPOCH 0
0 0.0
DONE WITH EPOCH
EPOCH 1
0 0.0
DONE WITH EPOCH
EPOCH 2
0 0.0
DONE WITH EPOCH
EPOCH 3
0 0.0
DONE WITH EPOCH
EPOCH 4
0 0.0
DONE WITH EPOCH
EPOCH 5
0 0.0
DONE WITH EPOCH
EPOCH 6
0 0.0
DONE WITH EPOCH
EPOCH 7
0 0.0
DONE WITH EPOCH
EPOCH 8
0 0.0
DONE WITH EPOCH
EPOCH 9
0 0.0
DONE WITH EPOCH
EPOCH 10
0 0.0
DONE WITH EPOCH
EPOCH 11
0 0.0
DONE WITH EPOCH
EPOCH 12
0 0.0
DONE WITH EPOCH
EPOCH 13
0 0.0
DONE WITH EPOCH
EPOCH 14
0 0.0
DONE WITH EPOCH
EPOCH 15
0 0.0
DONE WITH EPOCH
EPOCH 16
0 0.0
DONE WITH EPOCH
EPOCH 17
0 0.0
DONE WITH EPOCH
EPOCH 18
0 0.0
DONE WITH EPOCH
EPOCH 19
0 0.0
DONE WITH EPOCH
EPOCH 20
0 0.0
DONE WITH EPOCH
EPOCH 21
0 0.0
DONE WITH EPOCH
EPOCH 22
0 0.0
DONE WITH EPOCH
EPOCH 23
0 0.0
DONE WITH EPOCH
EPOCH 24
0 0.0
DONE WITH EPOCH
EPOCH 25
0 0.0
DONE WITH EPOCH
EPOCH 26
0 0.0
DONE WITH EPOCH
EPOCH 27
0 0.0
DONE WITH EPOCH
EPOCH 28
0 0.0
DONE WITH EPOCH
EPOCH 29
0 0.0
DONE WITH EPOCH 

为什么我得到01?拥有这些值是否有意义(即没有分数)?

EDIT-2

对于获取网络为测试数据生成的标签,在打印出每个时期的标签值和准确度时,我得到了以下信息(标签总是0,虽然我期待仅限02,准确度为1):

EPOCH 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0
DONE WITH EPOCH
EPOCH 1
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0
DONE WITH EPOCH
EPOCH 2
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0
DONE WITH EPOCH
EPOCH 3
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0
DONE WITH EPOCH
EPOCH 4
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0
DONE WITH EPOCH
EPOCH 5
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0
DONE WITH EPOCH
.....
.....
EPOCH 28
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0
DONE WITH EPOCH
EPOCH 29
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0
DONE WITH EPOCH

谢谢。

【问题讨论】:

【参考方案1】:

一般性讨论

一般来说,为了测试神经网络,你需要取出你没有用于训练的新标记数据,将网络应用到这些数据上(即应用前馈过程),并评估结果(与您知道正确的标签相比)。

如果您没有这样的新数据(也就是说,如果您将所有数据都用于训练)并且无法生成新数据,我建议您将训练数据分离到训练和测试中,然后重新运行从一开始就对训练数据进行训练。重要的是,测试数据将是未使用的数据,以便能够评估模型的性能。

评估准确性

现在,假设您从this 问题谈论网络, 您可以执行类似的操作来衡量测试数据的准确性:

accuracy_test = sess.run(accuracy, feed_dict=x: test_data, y: test_onehot_vals)

其中test_datatest_onehot_vals 是您的测试图片(以及相应的标签)。

回想一下,对于训练,您运行以下命令:

_, accuracy_val = sess.run([train_op, accuracy], feed_dict=x: batch_data, y: batch_onehot_vals)

注意,我在评估accuracy_test时没有使用train_op。这是因为当你测试你的表现时,你并没有优化权重或类似的东西(train_op 会这样做)。您只需应用您当前拥有的网络。

获取网络为测试数据生成的标签

最后,如果你想要你的测试数据的实际标签,你需要得到tf.argmax(model_op, 1)的值。所以你可以把它设置成一个单独的变量,例如在行的正上方

correct_pred = tf.equal(tf.argmax(model_op, 1), tf.argmax(y,1))

你可以这样做:

res_model=tf.argmax(model_op, 1)
correct_pred = tf.equal(res_model, tf.argmax(y,1))

然后与accuracy_test一起评估如下:

res, accuracy_test = sess.run([res_model,accuracy], feed_dict=x: test_data, y: test_onehot_vals).

将网络应用于未标记的数据

完成网络测试后,假设您对结果感到满意,您可以继续将网络应用于新的和未标记的数据。例如通过做

res_new = sess.run(res_model, feed_dict=x: new_data).

请注意,为了生成res_model(这基本上意味着只是在输入上应用网络),您不需要任何标签,因此您的 feed_dict 中不需要y 值。 res_new 将是新标签。

【讨论】:

以上是关于Python/Tensorflow - 我已经训练了卷积神经网络,如何测试它?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 nodejs (tensorflow.js) 中训练模型?

python,tensorflow,CNN实现mnist数据集的训练与验证正确率

python3 TensorFlow训练数据集准备 下载一些百度图片 入门级爬虫示例

在 Java tensorflow v.1.2.0 中使用 Python tensorflow v.0.9.0 加载预训练模型

BP神经网络训练自己的数据(Tensorflow2.x版本)

BP神经网络训练自己的数据(Tensorflow2.x版本)