在Dueling DQN开发中使用Keras Subtract层遇报错求助
解决Keras Subtract层的两类错误问题
嗨,我刚碰到过类似的问题,帮你梳理下这两个错误的原因和解决办法:
1. NameError: name 'Subtract' is not defined
这个错误很直白——你没在代码里导入Subtract层就直接用了。解决起来很简单,在代码开头加上正确的导入语句就行:
如果你用的是TensorFlow整合的Keras(现在官方推荐的方式),用这个导入:
from tensorflow.keras.layers import Subtract
如果是旧版的独立Keras,用这个:
from keras.layers import Subtract
2. AttributeError: module 'keras.layers' has no attribute 'Subtract'
这个问题通常出在两种情况:
- 你用的是非常旧的Keras版本,那时
Subtract可能还没被加入到keras.layers模块里; - 你混淆了独立Keras和TensorFlow的Keras(现在独立Keras已经停止维护,官方建议用
tf.keras)。
最优解决方案:切换到tf.keras
现在Keras已经完全整合进TensorFlow了,直接用tf.keras的API能避免很多版本兼容问题。把所有Keras相关的导入都换成tensorflow.keras开头的,比如:
from tensorflow.keras.layers import Input, Dense, Subtract from tensorflow.keras.models import Model
兼容替代方案:用Lambda层实现减法
如果因为某些原因没法切换版本,你可以用Lambda层手动实现减法逻辑,效果和Subtract完全一样:
from tensorflow.keras import backend as K from tensorflow.keras.layers import Lambda # 替代Subtract()([a, b])的写法 subtracted = Lambda(lambda x: x[0] - x[1])([a, b])
结合你的DDDQN代码示例
把这些修改应用到你的代码里,大概是这样的:
from tensorflow.keras.layers import Input, Dense, Subtract, Lambda, Add from tensorflow.keras.models import Model from tensorflow.keras import backend as K class YourDDDQNClass: def __init__(self, state_size, action_size): self.state_size = state_size self.action_size = action_size self.model = self.DDDQN() def DDDQN(self): inp = Input(shape=(self.state_size,)) x = Dense(units=32, activation='relu', kernel_initializer='he_uniform')(inp) x = Dense(units=16, activation='relu', kernel_initializer='he_uniform')(x) value_ = Dense(units=1, activation=None)(x) advantage_ = Dense(units=self.action_size, activation=None)(x) # 用Subtract层计算优势值的均值偏移 mean_advantage = Lambda(lambda a: K.mean(a, axis=1, keepdims=True))(advantage_) advantage_offset = Subtract()([advantage_, mean_advantage]) # 合并价值和优势得到Q值 q_value = Add()([value_, advantage_offset]) model = Model(inputs=inp, outputs=q_value) model.compile(optimizer='adam', loss='mse') return model
内容的提问来源于stack exchange,提问作者Petr Buchal
相关产品推荐
相关产品推荐

