3

我已经训练卷积神经网络(CNN)与我在二进制文件中有如下数据(标签,文件名,数据(像素)):Python/Tensorflow - 我已经训练了卷积神经网络,如何测试它?

[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 epohs被运行:

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,虽然我期待要么0或仅2和准确性给出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 

感谢。

回答

6

一般性讨论

在一般情况下,为了测试神经网络,你需要,你没有训练使用,应用在网络上的这个数据(即新标记数据,可以使用饲料转发过程),并评估结果的准确性(与您知道的标签相比较)。

如果您没有这样的新数据(即,如果您使用所有数据进行培训)并且您无法生成新数据,我会建议将您的培训数据分开,并将其分为培训和测试,以及从一开始就重新运行训练数据。为了能够评估模型的性能,测试数据将成为未使用的数据非常重要。

评估准确性

现在,假设你是从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将成为新的标签。