TL; DR :使用Tensorflow优化器训练极小的神经网络时,我找不到我的错误。损失要么不移动要么一旦被卡住就会移动(看起来真的像0.633147那样是ln(2)......)。
问题和代码:我正在尝试在Tensorflow中实现Li等人(here)中的级联分类器的12-net部分。这是一个非常简单的网络,但我尝试的任何东西似乎都没有进行培训。
import tensorflow as tf
import tensorflow.contrib.slim as slim
import cv2
import numpy as np
input_tensor = tf.placeholder(tf.float32, shape=[1, 12, 12, 3])
input_label = tf.placeholder(tf.float16, shape=[1, 2])
conv_1 = slim.conv2d(input_tensor, 16, (3, 3), scope='conv1')
pool_1 = slim.max_pool2d(conv_1, (3, 3), 2, scope='pool1')
flatten = slim.flatten(pool_1)
fully_con = slim.fully_connected(flatten, 16, scope='full_con')
fully_con_2 = slim.fully_connected(fully_con, 2, scope='output')
probs = tf.nn.softmax(fully_con_2)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=input_label, logits=fully_con_2))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=.001).minimize(loss)
这定义了网络。它接收(现在,单个)12x12图像和标签,使用步幅1和16过滤器进行单个3x3卷积,使用步幅2进行3x3最大池,然后完全连接到16个要素,最后进行二进制分类。我能够执行代码的正向传递,所以我认为问题不在这里。这是我的训练循环 - 我有3个12x12图像(2个面,1个树),只是交替地将它们提供给优化器(显然不是最好的训练练习,但我只是想让它起作用):
if __name__ == '__main__':
im = cv2.imread('resized.jpg').reshape(1, 12, 12, 3).astype('float16')
im2 = cv2.imread('resized2.jpg').reshape(1, 12, 12, 3).astype('float16')
im3 = cv2.imread('resize3.jpg').reshape(1, 12, 12, 3).astype('float16')
im_lab_1 = np.array([[0, 1]], dtype='float16')
im_lab_2 = np.array([[0, 1]], dtype='float16')
im_lab_3 = np.array([[1, 0]], dtype='float16')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(loss, feed_dict={input_tensor: im3, input_label: im_lab_3}))
for i in range(50000):
if i % 3 == 0:
# _, l = sess.run([optimizer, loss], feed_dict=feed1)
# print(l)
optimizer.run(feed_dict={input_tensor: im, input_label: im_lab_1})
elif i % 4 == 0:
# _, l = sess.run([optimizer, loss], feed_dict=feed2)
# print(l)
optimizer.run(feed_dict={input_tensor: im2, input_label: im_lab_2})
elif i % 5 == 0:
optimizer.run(feed_dict={input_tensor: im3, input_label: im_lab_3})
print(sess.run(loss, feed_dict={input_tensor: im3, input_label: im_lab_3}))
我已经尝试了optimizer.run(...)
和注释掉的sess.run([optimizer, loss]...)
。第一个sess.run(loss...)
似乎吐出了正确的东西,但在那之后,损失就会卡住而且再也不会移动了。显然,我在这里做错了,任何帮助都会受到赞赏!