使用Lambda层后仍遇'Tensor' object has no attribute '_keras_history'错误求助
解决Keras中'Tensor' object has no attribute '_keras_history'错误
这个错误的核心原因是你直接对Input张量做切片操作,导致生成的张量丢失了Keras追踪计算图所需的_keras_history属性,再加上Lambda层的写法存在误区,咱们一步步来修正:
问题1:直接切片Input张量导致张量属性丢失
你原本的代码里:
a = input_shape[:,:,:,0:3] b = input_shape[:,:,:,3:]
input_shape是Keras的Input张量,但直接切片后得到的a、b变成了纯TensorFlow张量,Keras无法追踪它们的计算来源,后续使用时自然会触发报错。
修正方案:用Lambda层完成切片操作,让Keras能跟踪这一步的计算流程:
a = Lambda(lambda x: x[:, :, :, 0:3])(input_shape) b = Lambda(lambda x: x[:, :, :, 3:])(input_shape)
问题2:Lambda层包裹concat的写法冗余且易出错
你定义的my_concat其实没必要用Lambda层嵌套concatenate,Keras本身提供了更直观的Concatenate层,直接使用能避免Lambda层的使用误区。
修正方案:替换为Concatenate层:
from keras.layers import Concatenate # 替换原来的my_concat定义 my_concat = Concatenate(axis=-1)
完整修正后的代码
整合所有修改后的完整代码如下:
from keras.layers import Input, Conv2D, Lambda, MaxPooling2D, Dropout, Concatenate input_shape = Input(shape=(1,128,6)) # 用Lambda层做切片,保留Keras张量的计算历史 a = Lambda(lambda x: x[:, :, :, 0:3])(input_shape) b = Lambda(lambda x: x[:, :, :, 3:])(input_shape) x1 = Conv2D(6,(1,1),activation='relu',padding='same')(a) # 使用Concatenate层替代冗余的Lambda写法 my_concat = Concatenate(axis=-1) x2 = my_concat([input_shape,x1]) x3 = Conv2D(6,(1,1),activation='relu',padding='same')(b) x = my_concat([x2,x3]) x=Conv2D(40, kernel_size=(1,7),padding='valid', activation='relu',kernel_initializer='glorot_uniform')(x) x = MaxPooling2D(pool_size=(1, 2))(x) x = Dropout(0.8)(x) # 后续模型层可继续编写在这里...
额外说明(若坚持用Lambda做concat)
如果一定要用Lambda层实现concat(不推荐,代码可读性差),正确写法应该是将concatenate放在Lambda的函数内部,并且确保正确调用:
import keras.layers my_concat = Lambda(lambda x: keras.layers.concatenate([x[0], x[1]], axis=-1)) x2 = my_concat([input_shape, x1])
内容的提问来源于stack exchange,提问作者ohdoughnut
相关产品推荐
相关产品推荐

