【发布时间】:2016-02-29 02:40:01
【问题描述】:
我正在尝试为自定义数据集制作卷积神经网络。分类器只有两个类。我能够正确读取输入图像,并且还为它们分配了两个相应类的 batch_labels。代码执行没有错误,但输出异常。 由于某种原因,准确率始终为 50%。
image=inputs()
image_batch=tf.train.batch([image],batch_size=150)
label_batch_pos=tf.train.batch([tf.constant([0,1])],batch_size=75) # label_batch for first class
label_batch_neg=tf.train.batch([tf.constant([1,0])],batch_size=75) # label_batch for second class
label_batch=tf.concat(0,[label_batch_pos,label_batch_neg])
W_conv1 = weight_variable([5, 5, 3, 32])
b_conv1 = bias_variable([32])
image_4d = tf.reshape(image, [-1,32,32,3])
h_conv1 = tf.nn.relu(conv2d(image_4d, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
W_fc1 = weight_variable([8 * 8 * 64, 1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 8*8*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
h_fc1_drop = tf.nn.dropout(h_fc1, 0.5)
W_fc2 = weight_variable([1024, 2])
b_fc2 = bias_variable([2])
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
cross_entropy = -tf.reduce_sum(tf.cast(label_batch,tf.float32)*tf.log(y_conv+1e-9))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
tf.train.start_queue_runners(sess=sess)
correct_prediction=tf.equal(tf.argmax(y_conv,1), tf.argmax(label_batch,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
for i in range(100):
train_step.run(session=sess)
print(sess.run(accuracy))
print(sess.run(correct_prediction))
当我打印 correct_prediction 张量时,无论如何我都会得到以下输出。
[ True True True True True True True True True True True True
True True True True True True True True True True True True
True True True True True True True True True True True True
True True True True True True True True True True True True
True True True True True True True True True True True True
True True True True True True True True True True True True
True True True False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False]
准确度始终为 0.5,就好像权重根本没有更新一样。当我在每个训练步骤后打印权重时,它们保持不变。我想我有一些编码错误。会不会是网络一次又一次地在同一张图像上训练?但即便如此,权重也必须更新。我有 150 个训练示例,每个类有 75 个。 有人可以指出我正确的方向吗?
编辑: 这就是我初始化权重的方式
def weight_variable(shape,name):
initial = tf.truncated_normal(shape, stddev=0.5)
return tf.Variable(initial,name=name)
def bias_variable(shape,name):
initial = tf.constant(1.0, shape=shape)
return tf.Variable(initial,name=name)
【问题讨论】:
标签: python machine-learning computer-vision tensorflow deep-learning