已定义y_pred仍报错:‘y_pred:0’张量不存在,图中无‘y_pred’操作
首先看你给出的代码片段,第一眼就发现一个小笔误——train_prediction = tf.nn.softmax(logits,name"y_pred")这里的name"y_pred"少了个等号,应该写成name="y_pred",这个错误会导致TensorFlow不会把这个softmax操作命名为y_pred,这很可能是问题的根源!
除了这个笔误,还有几个常见原因会导致这类报错,我给你逐一梳理解决办法:
确保操作定义和访问在同一个计算图上下文:你是在
with graph.as_default():块里定义的y_pred,那所有需要用到这个张量的代码(比如获取它、在训练中调用它)都必须放在同一个with graph.as_default():块内,或者后续再次进入这个上下文。如果在上下文外面去获取y_pred:0,TensorFlow会去默认图里找,自然找不到你在自定义graph里定义的操作。优先直接使用定义好的变量,而非通过名称查找:你已经把这个softmax张量赋值给了
train_prediction,后续直接用这个变量就行,没必要再用tf.get_tensor_by_name("y_pred:0")来获取,这样能避开命名空间和上下文的坑。检查变量作用域的影响:如果你的模型是在
tf.variable_scope下定义的,那y_pred的完整名称会带上作用域前缀(比如my_scope/y_pred:0),这时候直接用y_pred:0就找不到,得用完整的名称。验证计算图中是否真的存在这个操作:可以在定义完
train_prediction后,在graph的上下文里加一行代码,打印所有操作的名称,确认y_pred是否在里面:print("计算图中的操作:", [op.name for op in graph.get_operations()])
给你贴一段修正后的代码示例,你可以参考:
with graph.as_default(): # 输入数据定义 tf_train_dataset = tf.placeholder(tf.float32, shape=(batch_size, image_size, image_size, num_channels), name='x_train') tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels), name="y_train") tf_valid_dataset = tf.constant(valid_dataset) tf_test_dataset = tf.constant(test_dataset) # 这里是你的模型层,生成logits # ... 省略中间层代码 ... # 修正name参数的拼写错误 train_prediction = tf.nn.softmax(logits, name="y_pred") # 验证操作是否存在 print("计算图中的操作列表:", [op.name for op in graph.get_operations()]) # 如果后续需要访问y_pred,必须回到graph的上下文 with graph.as_default(): # 方式1:直接用定义好的变量 print(train_prediction.shape) # 方式2:如果一定要用名称获取,确保上下文正确 y_pred_tensor = tf.get_tensor_by_name("y_pred:0")
内容的提问来源于stack exchange,提问作者Shivangi pandey

