Keras RNN调用自定义LSTMCell时出现TypeError报错求助
问题排查与解决方案
核心报错原因
这个TypeError本质是RNN层在处理状态时遇到了None值,通常和自定义LSTMCell的状态定义、RNN层的初始化方式或状态传递逻辑有关。
具体排查与修复步骤
1. 修正RNN层的初始化位置
你当前在call方法内创建self.rnn,每次调用都会重新构建层,这会导致状态管理混乱,甚至出现未初始化的None参数。必须把RNN层的初始化移到类的__init__方法中:
def __init__(self, units, decoder_units, num_cams, **kwargs): super(YourLayerClassName, self).__init__(**kwargs) self.units = units self.decoder_units = decoder_units self.num_cams = num_cams # 在初始化阶段创建RNN层,而非调用阶段 self.rnn = RNN( [lstm_cell(units=self.units, num_cams=self.num_cams) for _ in range(self.decoder_units)], return_sequences=True ) def call(self, x, state=None): # 直接调用已初始化的RNN层 return self.rnn(x, state=state)
2. 检查自定义LSTMCell的state_size定义
自定义Cell必须明确state_size属性,LSTM的状态通常是(隐藏状态h, 细胞状态c)的元组,要确保该属性没有None值:
class lstm_cell(LSTMCell): def __init__(self, units, num_cams, **kwargs): super().__init__(units, **kwargs) self.num_cams = num_cams # 确保state_size是明确的数值/元组,不能为None self.state_size = (self.units, self.units)
如果你的Cell因为num_cams修改了状态结构,必须同步更新state_size,保证其与call方法返回的new_state结构完全匹配。
3. 验证Cell的call方法返回值
自定义Cell的call方法必须返回(output, new_state),其中new_state的每个元素都不能是None,且形状要和state_size对应:
def call(self, inputs, states): h_prev, c_prev = states # 你的自定义逻辑... # 确保返回的new_state是完整的(h_new, c_new),无None值 return output, (h_new, c_new)
4. 确认传入RNN的state参数合法性
如果手动传入state,必须保证它是符合state_size结构的张量,不能包含None;如果不需要手动传入,直接传None让RNN自动初始化初始状态即可。
内容的提问来源于stack exchange,提问作者Amey Noolkar
相关产品推荐
相关产品推荐

