如何解决'Tensor' object has no attribute '_keras_history'报错
错误原因
AttributeError: 'Tensor' object has no attribute '_keras_history'错误的核心是:Keras搭建模型时,要求所有参与模型计算流的张量必须携带_keras_history属性,用来标记该张量对应的上游Keras层信息。如果代码中直接用TensorFlow原生算子处理Keras层的输出,没有用Keras Lambda层做封装,生成的新张量就会丢失这个属性,触发报错。
针对你用的NER项目代码的修复方案
- 先定位代码中所有直接调用TF原生算子处理Keras层输出的位置,该项目中高频出问题的是嵌入层后做维度调整、自定义mask计算的相关代码段
- 所有TF原生操作必须包裹在Keras Lambda层内执行,参考修改示例:
错误写法(直接调用tf算子):
from keras.layers import Input, Embedding import tensorflow as tf input_seq = Input(shape=(max_seq_len,)) embed_out = Embedding(n_words, embed_dim)(input_seq) # 直接调用tf.reshape处理Keras张量,丢失_keras_history属性 processed_embed = tf.reshape(embed_out, (-1, max_seq_len, embed_dim))正确写法(Lambda层封装):
from keras.layers import Input, Embedding, Lambda import tensorflow as tf input_seq = Input(shape=(max_seq_len,)) embed_out = Embedding(n_words, embed_dim)(input_seq) # 用Lambda层封装TF操作,保留Keras属性 processed_embed = Lambda(lambda x: tf.reshape(x, (-1, max_seq_len, embed_dim)))(embed_out)
其他排查点
- 版本匹配问题:该项目使用的是独立Keras老版本,如果你当前环境用的是TF2.x内置的tf.keras,需要把代码中所有
import keras.xxx的导入语句全部替换为import tensorflow.keras.xxx,避免跨包调用导致的属性丢失 - 不要把eager模式下计算得到的numpy值转为张量后直接接入Keras模型中间层,所有中间计算逻辑必须通过Keras层实现
内容的提问来源于stack exchange,提问作者mario
相关产品推荐
相关产品推荐

