WSL2环境下TensorFlow语言模型训练报错求助(Windows无此问题)
问题解决:TensorFlow自定义语言模型的两个错误处理
第一个错误:TypeError: Layer.__init__() takes 1 positional argument but 2 were given
- 原因:调用父类构造函数时错误传递了
self参数。Python中super()已经自动绑定当前类实例,不需要显式传入self。 - 解决:将
super().__init__(self)修改为super().__init__()即可,你已经完成了这个修正。
第二个错误:Shapes of all inputs must match: values[0].shape = [256,100,256] != values[1].shape = []
- 原因:GRU的状态处理存在形状不匹配问题。TensorFlow中,单层GRU的
get_initial_state方法有时会返回状态列表(而非单个张量),直接传入GRU后返回的状态也会是列表,导致模型返回多输出时Keras无法正确处理形状。 - 解决:修改
call方法,显式处理状态的列表/张量转换,确保返回的状态是单个张量:
class MyModel(tf.keras.Model): def __init__(self, vocab_size, embedding_dim, rnn_units): super().__init__() self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim) self.gru = tf.keras.layers.GRU(rnn_units, return_sequences=True, return_state=True) self.dense = tf.keras.layers.Dense(vocab_size) def call(self, inputs, states=None, return_state=False, training=False): x = inputs x = self.embedding(x, training=training) if states is None: states = self.gru.get_initial_state(x) # 处理get_initial_state返回列表的情况 if isinstance(states, (list, tuple)): states = states[0] # 调用GRU并处理返回的状态 x, new_states = self.gru(x, initial_state=states, training=training) if isinstance(new_states, (list, tuple)): new_states = new_states[0] x = self.dense(x, training=training) if return_state: return x, new_states else: return x
另外需注意:训练时确保未触发return_state=True(该参数默认是False),避免模型返回双输出但训练标签仅为单张量的情况。
内容的提问来源于stack exchange,提问作者Morris van den Bergh
相关产品推荐
相关产品推荐

