Python / Tensorflow - 在这种情况下,所有精度值都为“1”是正常的吗?

时间:2017-03-26 04:29:47

标签: 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]])]

我已将标签0添加到后缀为_n.jpg的图片中,1为后缀为_m.jpg的图片,2为带后缀_c.jpg的图片1}}

我对卷积神经网络(CNN)有以下代码部分:

import numpy as np
import matplotlib.pyplot as plt
import cifar_tools
import tensorflow as tf

data, labels = cifar_tools.read_data('C:\\Users\\abc\\Desktop\\Testing')

x = tf.placeholder(tf.float32, [None, 150 * 150])
y = tf.placeholder(tf.float32, [None, 2])

w1 = tf.Variable(tf.random_normal([5, 5, 1, 64]))
b1 = tf.Variable(tf.random_normal([64]))

w2 = tf.Variable(tf.random_normal([5, 5, 64, 64]))
b2 = tf.Variable(tf.random_normal([64]))

w3 = tf.Variable(tf.random_normal([38*38*64, 1024]))
b3 = tf.Variable(tf.random_normal([1024]))

w_out = tf.Variable(tf.random_normal([1024, 2]))
b_out = tf.Variable(tf.random_normal([2]))

def conv_layer(x,w,b):
    conv = tf.nn.conv2d(x,w,strides=[1,1,1,1], padding = 'SAME')
    conv_with_b = tf.nn.bias_add(conv,b)
    conv_out = tf.nn.relu(conv_with_b)
    return conv_out

def maxpool_layer(conv,k=2):
    return tf.nn.max_pool(conv, ksize=[1,k,k,1], strides=[1,k,k,1], padding='SAME')

def model():
    x_reshaped = tf.reshape(x, shape=[-1, 150, 150, 1])

    conv_out1 = conv_layer(x_reshaped, w1, b1)
    maxpool_out1 = maxpool_layer(conv_out1)
    norm1 = tf.nn.lrn(maxpool_out1, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75)
    conv_out2 = conv_layer(norm1, w2, b2)
    norm2 = tf.nn.lrn(conv_out2, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75)
    maxpool_out2 = maxpool_layer(norm2)

    maxpool_reshaped = tf.reshape(maxpool_out2, [-1, w3.get_shape().as_list()[0]])
    local = tf.add(tf.matmul(maxpool_reshaped, w3), b3)
    local_out = tf.nn.relu(local)

    out = tf.add(tf.matmul(local_out, w_out), b_out)
    return out

model_op = model()

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(model_op, y))
train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)

correct_pred = tf.equal(tf.argmax(model_op, 1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    onehot_labels = tf.one_hot(labels, 2, on_value=1.,off_value=0.,axis=-1)
    onehot_vals = sess.run(onehot_labels)
    batch_size = 1
    for j in range(0, 5):
        print('EPOCH', j)
        for i in range(0, len(data), batch_size):
            batch_data = data[i:i+batch_size, :]
            batch_onehot_vals = onehot_vals[i:i+batch_size, :]
            _, accuracy_val = sess.run([train_op, accuracy], feed_dict={x: batch_data, y: batch_onehot_vals})
            print(i, accuracy_val)

        print('DONE WITH EPOCH')

当我运行该程序时,我得到以下5个时期:

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

根据上述数据,这些值(准确度)是否正常?我问的原因是,对于其他数据(但有10个类的大量数据),我注意到原始程序(我做了一些调整以使其适用于我的数据)返回结果(准确性),如下所示:

EPOCH 0
1 0.104
2 0.1
3 0.136
4 0.14
5 0.124
6 0.156
7 0.16
8 0.172
9 0.16
10 0.164
11 0.148
...
...
...

您认为我得到的结果是否正常(即只有01)?

修改-1

我已将batch_size更改为:

batch_size = len(data) // 2

我现在的输出如下:

EPOCH 0
0 0.466667
15 0.666667
DONE WITH EPOCH
EPOCH 1
0 0.666667
15 0.6
DONE WITH EPOCH
EPOCH 2
0 0.333333
15 0.333333
DONE WITH EPOCH
EPOCH 3
0 0.333333
15 0.333333
DONE WITH EPOCH
EPOCH 4
0 0.533333
15 0.666667
DONE WITH EPOCH

那会是正确的吗?所以,我有30张图片(我知道它们很少,但只是为了展示目的)。批量生产的最佳方法是什么?如果现在正确的话,是否有更好的方法来表示上述输出?或者,对于这么小的数据集,我们可以将它们全部放在一个批次中(即batch_size = len(data))?

例如,当我设置batch_size = len(data)时,我得到以下内容:

EPOCH 0
0 0.333333
DONE WITH EPOCH
EPOCH 1
0 0.666667
DONE WITH EPOCH
EPOCH 2
0 0.666667
DONE WITH EPOCH
EPOCH 3
0 0.333333
DONE WITH EPOCH
EPOCH 4
0 0.366667
DONE WITH EPOCH

感谢。

1 个答案:

答案 0 :(得分:1)

代码中batch_size的值为1,因此每次运行时都会

sess.run([train_op, accuracy], feed_dict={x: batch_data, y: batch_onehot_vals})
你只检查一张照片。然后你有以下两行:

correct_pred = tf.equal(tf.argmax(model_op, 1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))

所以,correct_pred只是1个数字(0或1),因为它基于一张图片(所以如果tf.argmax(model_op, 1)=tf.argmax(y,1)correct_pred=1。否则,它等于0)。< / p>

然后accuracy恰好等于这个数字。因此,它的值始终为0或1.

编辑1 的回应:在数值上,这些值是有意义的。你的batch_size=15,所以准确度应该是1/15 = 0.0667的整数倍,这确实是你表中所有值的情况。 它应该是1/15的整数倍的原因是由于这两行:

correct_pred = tf.equal(tf.argmax(model_op, 1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))

数组correct_pred只是一个0-1向量(因为它是tf.equal的结果)。 accuracy只是correct_pred中值的总和除以批量大小为15。

关于最佳批量大小,它取决于许多因素。例如,您可以在讨论here中阅读更多相关信息。