TensorFlow打印输入张量?

时间:2017-04-28 13:52:28

标签: python tensorflow

我正在建立一个TF培训计划并试图诊断我们正在看到的一些问题。根问题是渐变总是楠。这是针对CIFAR10数据集的(我们从头开始编写自己的程序,以确保我们正确理解所有的机制)。

这里发布的代码太多了;所以它在这里:https://github.com/drcrook1/CIFAR10

此时我们相当肯定问题不在于学习率(我们将该吸盘降至1e-25并且仍然有nans;我们还将网络简化为单个mlp层。)

我们认为可能发生的是输入管道读入的值是错误的;因此,我们希望打印TFRecordReader管道中的值,以便仔细检查它是否正确地读取和解码样本。如您所知,如果您知道其名称或将其作为变量捕获,则只能打印TF值;所以提出了这一点;如何从迷你批次打印输入张量?

感谢您的任何提示!

3 个答案:

答案 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运算符对调试问题非常有用:

How to check NaN in gradients in Tensorflow when updating?

答案 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检查点来开始调试。