python - TensorFlow 打印输入张量?

标签 python tensorflow

我正在构建一个 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/

相关文章:

python - 致命的 Python 错误 : PyImport_GetModuleDict: no module dictionary

tensorflow - 如何读取 tensorflow 检查点文件中保存的权重?

python - 将固定宽度的文本文件更改为定界

python - 在同一测试中重用 pytest fixture

python - 如果消息是回复,机器人应该获取用户的 ID

python - 文本预测 LSTM 神经网络的问题

Tensorflow Hub 图像模块 : Clarity on Preprocessing and Output values

python - Logits 的形状错误

testing - 限制 tf.data.Dataset 中的项目数

python - 类型别名和 NewType 的区别