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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:53:16