我已经使用张量流框架编写了一个算法并面对问题,tf.train.Optimizer.compute_gradients(loss)
为所有权重返回零。另一个问题是,如果我将批量大小大于约5,则tf.histogram_summary
用于权重会抛出一些值为NaN的错误。
我不能在这里提供一个可重复的例子,因为我的代码非常笨重,而且我在TF方面做得不够好。我会尝试在这里粘贴一些片段。
主循环:
images_ph = tf.placeholder(tf.float32, shape=some_shape)
labels_ph = tf.placeholder(tf.float32, shape=some_shape)
output = inference(BATCH_SIZE, images_ph)
loss = loss(labels_ph, output)
train_op = train(loss, global_step)
session = tf.Session()
session.run(tf.initialize_all_variables())
for i in xrange(MAX_STEPS):
images, labels = train_dataset.get_batch(BATCH_SIZE, yolo.INPUT_SIZE, yolo.OUTPUT_SIZE)
session.run([loss, train_op], feed_dict={images_ph : images, labels_ph : labels})
Train_op(这是问题发生):
def train(total_loss)
opt = tf.train.AdamOptimizer()
grads = opt.compute_gradients(total_loss)
# Here gradients are zeros
for grad, var in grads:
if grad is not None:
tf.histogram_summary("gradients/" + var.op.name, grad)
return opt.apply_gradients(grads, global_step=global_step)
损失(损失计算正确,因为它随样品而变化):
def loss(labels, output)
return tf.reduce_mean(tf.squared_difference(labels, output))
推理:一组带有ReLU的卷积层,后面是3个完全连接的层,最后一层有sigmoid激活。所有权重都由截断的正常rv初始化。所有标签都是固定长度的矢量,实数范围为[0,1]
。
提前感谢您的帮助!如果你对我的问题有一些假设,请分享我会试试。如果你愿意,我也可以分享整个代码。