You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:32:52