如何修复Keras模型训练时的'_output_tensor_cache'属性错误?
解决TensorFlow 1.7.0中Keras函数式API继承Model时的
_output_tensor_cache属性错误 这个问题我之前在TF 1.x早期版本里也踩过坑,核心原因是自定义模型类没有正确完成父类的初始化流程,或者没做好模型结构的构建,导致Model实例缺失了_output_tensor_cache这个关键的内部缓存属性。
问题根源
在TensorFlow 1.7.0的tf.keras.Model实现里,_output_tensor_cache是父类用来缓存模型输出张量的内部属性,它是在父类的__init__方法中初始化的。如果你的自定义模型类没调用super().__init__(),或者没正确设置模型的输出张量,就会导致这个属性缺失,进而在调用fit()时触发错误。
修复方案
结合你的极简代码场景,下面是具体的修复步骤和示例:
1. 必须调用父类初始化方法
在自定义模型的__init__方法第一行,一定要先调用父类的初始化,这会帮你创建包括_output_tensor_cache在内的所有必要内部属性:
import tensorflow as tf import numpy as np class CustomModel(tf.keras.Model): def __init__(self): # 关键:先调用父类初始化,不能省略 super(CustomModel, self).__init__() # 再定义你的网络层 self.dense1 = tf.keras.layers.Dense(32, activation='relu') self.dense2 = tf.keras.layers.Dense(10, activation='softmax') def call(self, inputs): x = self.dense1(inputs) return self.dense2(x) # 测试训练流程 model = CustomModel() # TF 1.x中有时需要显式调用build触发模型构建 model.build(input_shape=(None, 784)) x_train = np.random.rand(100, 784) y_train = np.random.randint(0, 10, (100,)) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy') model.fit(x_train, y_train, epochs=1)
2. 纯函数式结构需显式设置输出
如果你的模型是用纯函数式API构建(不是在call方法里定义流程),需要在__init__里显式设置模型输出,确保内部缓存被初始化:
class CustomFunctionalModel(tf.keras.Model): def __init__(self): super(CustomFunctionalModel, self).__init__() # 定义函数式结构 inputs = tf.keras.Input(shape=(784,)) x = tf.keras.layers.Dense(32, activation='relu')(inputs) outputs = tf.keras.layers.Dense(10, activation='softmax')(x) # 显式设置模型输出,触发内部缓存初始化 self._set_outputs(outputs) # 训练流程同上 model = CustomFunctionalModel() model.compile(optimizer='adam', loss='sparse_categorical_crossentropy') model.fit(x_train, y_train, epochs=1)
额外提醒
TensorFlow 1.7.0确实是比较老旧的版本,Keras API的实现还存在不少不完善的地方。如果项目允许,建议升级到TensorFlow 1.x的最后一个稳定版本(1.15.0),能避免很多这类底层属性缺失的问题。
内容的提问来源于stack exchange,提问作者Fanta
相关产品推荐
相关产品推荐

