Skip to main content
 首页 » 编程设计

python之如何在 tf.estimator.Estimator() 中记录 tensorflow 层输出

2024年09月03日31mengfanrong

在此tutorial ,他们通过为 tf.nn.softmax 节点命名成功地记录了 softmax 函数。

tf.nn.softmax(logits, name="softmax_tensor") # giving name to the node 
. 
. 
. 
tensors_to_log = {"probadfabilities": "softmax_tensor"} # logging the node 
 
logging_hook = tf.train.LoggingTensorHook( 
    tensors=tensors_to_log, every_n_iter=50) 
eval_input_fn = tf.estimator.inputs.numpy_input_fn( 
    x={"x": eval_data}, 
    y=eval_labels, 
    num_epochs=1, 
    shuffle=False) 

现在,除了 softmax,我还想记录最后一个 Dense 层的输出。

logits = tf.layers.dense(inputs=dropout, units=10, name='logits') 
. 
. 
. 
tensors_to_log = {"last_layer": "logits"} 

但它给了我以下错误

KeyError: "The name 'logits:0' refers to a Tensor which does not exist. The operation, 'logits', does not exist in the graph."

我的问题是:如何在tensorflow中记录层输出?

我的代码

import tensorflow as tf 
import numpy as np 
import os 
 
tf.logging.set_verbosity(tf.logging.INFO) 
 
def cnn_model_fn(features, labels, mode): 
    """Model function for CNN.""" 
    # Input Layer 
    input_layer = tf.reshape(features["x"], [-1, 28, 28, 1]) 
 
    # Convolutional Layer #1 
    conv1 = tf.layers.conv2d( 
      inputs=input_layer, 
      filters=128, 
      kernel_size=[7, 7], 
      padding="same", 
      activation=tf.nn.relu) 
 
    # Pooling Layer #1 
    pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2) 
 
    # Convolutional Layer #2 and Pooling Layer #2 
    conv2 = tf.layers.conv2d( 
      inputs=pool1, 
      filters=256, 
      kernel_size=[5, 5], 
      padding="same", 
      activation=tf.nn.relu) 
    pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2) 
 
    # Dense Layer 
    pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 256]) 
    dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu) 
    dropout = tf.layers.dropout( 
      inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN) 
 
    # Logits Layer 
    logits = tf.layers.dense(inputs=dropout, units=10, name='logits') 
 
    if mode == tf.estimator.ModeKeys.PREDICT: 
        return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions) 
 
    # Calculate Loss (for both TRAIN and EVAL modes) 
    loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits) 
 
    # Configure the Training Op (for TRAIN mode) 
    if mode == tf.estimator.ModeKeys.TRAIN: 
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001) 
        train_op = optimizer.minimize( 
            loss=loss, 
            global_step=tf.train.get_global_step()) 
        return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) 
 
    # Add evaluation metrics (for EVAL mode) 
    eval_metric_ops = { 
      "accuracy": tf.metrics.accuracy( 
          labels=labels, predictions=predictions["classes"]) 
    } 
    return tf.estimator.EstimatorSpec( 
      mode=mode, loss=loss, eval_metric_ops=eval_metric_ops) 
 
((train_data, train_labels), 
 (eval_data, eval_labels)) = tf.keras.datasets.mnist.load_data() 
 
train_data = train_data/np.float32(255) 
train_labels = train_labels.astype(np.int32)  # not required 
 
eval_data = eval_data/np.float32(255) 
eval_labels = eval_labels.astype(np.int32) 
 
mnist_classifier = tf.estimator.Estimator( 
    model_fn=cnn_model_fn, model_dir="./mnist_convnet_model") 
 
# Set up logging for predictions 
tensors_to_log = {"last_layer": "logits"} 
 
logging_hook = tf.train.LoggingTensorHook( 
    tensors=tensors_to_log, every_n_iter=50) 
 
# Train the model 
train_input_fn = tf.estimator.inputs.numpy_input_fn( 
    x={"x": train_data}, 
    y=train_labels, 
    batch_size=100, 
    num_epochs=None, 
    shuffle=True) 
 
# train one step and display the probabilties 
mnist_classifier.train( 
    input_fn=train_input_fn, 
    steps=10, 
    hooks=[logging_hook]) 

请您参考如下方法:

在tf.official ResNet implementation ,他们为此目的使用 tf.identity:

logits = tf.identity(logits, 'logits')