Skip to main content
 首页 » 编程设计

python之TensorFlow 打印输入张量

2025年02月15日26飞鱼

我正在构建一个 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 库在每个小批量中绘制示例图像。

这正是我想要做的。我需要这样做来验证我的问题。根本原因是由于标签被错误读取而产生无限梯度;因为标签与示例不匹配。