我正在构建一个 TF 培训计划,并试图诊断我们在其中遇到的一些问题。根本问题是梯度总是 nan。这是针对 CIFAR10 数据集的(我们从头开始编写自己的程序以确保我们正确理解所有机制)。
这里的代码太多了;所以它在这里:https://github.com/drcrook1/CIFAR10
在这一点上,我们相当确定问题不是学习率(我们将那个傻瓜降低到 1e-25,但仍然得到 nans;我们还将网络简化为单个 mlp 层)。
我们认为可能发生的情况是输入管道读取的值是错误的;因此,我们想要打印来自 TFRecordReader 管道的值,以仔细检查它实际上是否正确读取和解码样本。如您所知,只有知道其名称或将其捕获为变量才能打印 TF 值;这样就提出了要点;如何从小批量打印输入张量?
感谢任何提示!
最佳答案
事实证明,您可以将示例和标签作为操作返回,然后在图形执行期间简单地打印它们。
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
请注意,在上面的代码中,我们使用输入队列运行器来获取示例和输入并将其馈送到图中。然后,我们将示例和标签作为操作与所有其他操作一起返回,然后可以在 session 运行期间使用这些操作;
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
请注意,在上面的代码中,我们采用了示例和标签操作,现在我们可以打印各种内容。如果有任何东西是 nan,我们打印出来;与此同时,我们打印预测数组本身、标签,我们甚至使用 matplot 库在每个小批量中绘制示例图像。
这正是我想要做的。我需要这样做来验证我的问题。根本原因是由于标签被错误读取而产生无限梯度;因为标签与示例不匹配。
关于python - TensorFlow 打印输入张量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43681907/