TensorFlow GRU层call()传入reset_after参数触发TypeError问题求助
报错原因
- 你混淆了Keras层的初始化参数和调用参数的作用范围:
reset_after、recurrent_activation、dropout、recurrent_dropout都属于GRU层的结构配置参数,必须在实例化层(也就是__init__方法中定义self.gru)的时候传入,层的call方法仅接收和单次前向传播相关的动态参数(比如输入张量、初始状态、training标记等),不识别结构配置参数,因此直接抛出参数不存在的错误。 - 额外说明:你当前的参数配置本身存在矛盾:CuDNN加速的GRU要求
recurrent_dropout必须为0,你设置recurrent_dropout=0.2的情况下,即使参数放对位置也无法触发CuDNN加速。
解决方案
- 将所有GRU结构配置参数从
call方法的调用逻辑中移除,全部放到__init__的GRU实例化代码中。 - 根据你的需求选择适配的参数组合:
- 优先开启CuDNN GPU加速:需关闭recurrent_dropout,仅保留输入侧dropout,初始化代码如下:
self.gru = tf.keras.layers.GRU(rnn_units, return_sequences=True, return_state=True, reset_after=True, recurrent_activation='sigmoid', dropout=0.2, recurrent_dropout=0 )- 必须使用recurrent_dropout做正则:放弃CuDNN加速,初始化代码如下:
self.gru = tf.keras.layers.GRU(rnn_units, return_sequences=True, return_state=True, reset_after=True, recurrent_activation='sigmoid', dropout=0.2, recurrent_dropout=0.2 ) - 修正
call方法中GRU层的调用代码,仅保留动态参数即可:
x, states = self.gru(x, initial_state=states, training=training)
内容的提问来源于stack exchange,提问作者kiriloff
相关产品推荐
相关产品推荐

