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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:53:26