我正在建立一个TF培训计划并试图诊断我们正在看到的一些问题。根问题是渐变总是楠。这是针对CIFAR10数据集的(我们从头开始编写自己的程序,以确保我们正确理解所有的机制)。
这里发布的代码太多了;所以它在这里:https://github.com/drcrook1/CIFAR10
此时我们相当肯定问题不在于学习率(我们将该吸盘降至1e-25并且仍然有nans;我们还将网络简化为单个mlp层。)
我们认为可能发生的是输入管道读入的值是错误的;因此,我们希望打印TFRecordReader管道中的值,以便仔细检查它是否正确地读取和解码样本。如您所知,如果您知道其名称或将其作为变量捕获,则只能打印TF值;所以提出了这一点;如何从迷你批次打印输入张量?
感谢您的任何提示!
答案 0 :(得分:1)
事实证明,您可以将示例和标签作为操作返回,然后在图形执行期间简单地打印它们。
def create_sess_ops():
'''
Creates and returns operations needed for running
a tensorflow training session
'''
GRAPH = tf.Graph()
with GRAPH.as_default():
examples, labels = Inputs.read_inputs(CONSTANTS.RecordPaths,
batch_size=CONSTANTS.BATCH_SIZE,
img_shape=CONSTANTS.IMAGE_SHAPE,
num_threads=CONSTANTS.INPUT_PIPELINE_THREADS)
examples = tf.reshape(examples, [CONSTANTS.BATCH_SIZE, CONSTANTS.IMAGE_SHAPE[0],
CONSTANTS.IMAGE_SHAPE[1], CONSTANTS.IMAGE_SHAPE[2]])
logits = Vgg3CIFAR10.inference(examples)
loss = Vgg3CIFAR10.loss(logits, labels)
OPTIMIZER = tf.train.AdamOptimizer(CONSTANTS.LEARNING_RATE)
#OPTIMIZER = tf.train.RMSPropOptimizer(CONSTANTS.LEARNING_RATE)
gradients = OPTIMIZER.compute_gradients(loss)
apply_gradient_op = OPTIMIZER.apply_gradients(gradients)
gradients_summary(gradients)
summaries_op = tf.summary.merge_all()
return [apply_gradient_op, summaries_op, loss, logits, examples, labels], GRAPH
请注意,在上面的代码中,我们使用输入队列运行器来获取示例和输入并将其输入到图形中。然后,我们将示例和标签作为操作返回到我们所有其他操作的旁边,然后可以在会话运行期间使用;
def main():
'''
Run and Train CIFAR 10
'''
print('starting...')
ops, GRAPH = create_sess_ops()
total_duration = 0.0
with tf.Session(graph=GRAPH) as SESSION:
COORDINATOR = tf.train.Coordinator()
THREADS = tf.train.start_queue_runners(SESSION, COORDINATOR)
SESSION.run(tf.global_variables_initializer())
SUMMARY_WRITER = tf.summary.FileWriter('Tensorboard/' + CONSTANTS.MODEL_NAME)
GRAPH_SAVER = tf.train.Saver()
for EPOCH in range(CONSTANTS.EPOCHS):
duration = 0
error = 0.0
start_time = time.time()
for batch in range(CONSTANTS.MINI_BATCHES):
_, summaries, cost_val, prediction = SESSION.run(ops)
print(np.where(np.isnan(prediction)))
print(prediction[0])
print(labels[0])
plt.imshow(examples[0])
plt.show()
error += cost_val
duration += time.time() - start_time
total_duration += duration
SUMMARY_WRITER.add_summary(summaries, EPOCH)
print('Epoch %d: loss = %.2f (%.3f sec)' % (EPOCH, error, duration))
if EPOCH == CONSTANTS.EPOCHS - 1 or error < 0.005:
print(
'Done training for %d epochs. (%.3f sec)' % (EPOCH, total_duration)
)
break
注意在上面的代码中我们采用了示例和标签操作,现在我们可以打印各种各样的东西。我们打印出来,如果有什么是南;随着我们打印预测数组本身,标签,我们甚至使用matplot lib绘制每个迷你批次中的示例图像。
这正是我想要做的。我需要这样做以验证我的问题。根本原因是由于标签被错误地读取而产生无限渐变;因为标签与示例不符。
答案 1 :(得分:0)
您是否看过tf.Print运营商? https://www.tensorflow.org/api_docs/python/tf/Print
如果使用您怀疑导致问题的其中一个节点的输入将其添加到图表中,您应该能够在stderr中看到结果。
您可能还会发现check_numerics运算符对调试问题非常有用:
答案 2 :(得分:0)
这似乎是官方TensorFlow Debugger的理想用例。
从页面上的第一个例子开始:
from tensorflow.python import debug as tf_debug
sess = tf_debug.LocalCLIDebugWrapperSession(sess)
sess.add_tensor_filter("has_inf_or_nan", tf_debug.has_inf_or_nan)
根据您的描述,您似乎也需要tf_debug.has_inf_or_nan
检查点来开始调试。