В моделях, переданных в `fit`, в качестве позиционных аргументов можно найти только` training` и первый аргумент в `call` - PullRequest
2 голосов
/ 25 января 2020

Я пытаюсь следовать этому коду, но в другом наборе данных: https://www.tensorflow.org/tutorials/text/transformer#encoder_layer Мне нужно было скомпилировать и подогнать модель. однако, я получаю эту ошибку во время работы; Я не знаю, что это значит:

 Models passed to `fit` can only have `training` and the first argument in `call` as positional arguments, found: ['tar', 'enc_padding_mask', 'look_ahead_mask', 'dec_padding_mask'].

Вот эта модель:

class Transformer(tf.keras.Model):
  def __init__(self, num_layers, d_model, num_heads, dff, input_vocab_size, 
               target_vocab_size, pe_input, pe_target, rate=0.1,**kwargs,):
    super(Transformer, self).__init__(**kwargs)

    self.encoder = Encoder(num_layers, d_model, num_heads, dff, 
                           input_vocab_size, pe_input, rate)

    self.decoder = Decoder(num_layers, d_model, num_heads, dff, 
                           target_vocab_size, pe_target, rate)

    self.final_layer = tf.keras.layers.Dense(target_vocab_size)
  def get_config(self):

        config = super().get_config().copy()
        config.update({
            'dff':self.dff,
            'input_vocab_size':self.input_vocab_size,
            'target_vocab_size':self.target_vocab_size,
            'pe_input':self.pe_input,
            'pe_target':self.pe_target,
            #'vocab_size': self.vocab_size,
            'num_layers': self.num_layers,
            #'units': self.units,
            'd_model': self.d_model,
            'num_heads': self.num_heads,
            'rate': self.rate,
        })
        return config

  def call(self, inp, tar, training, enc_padding_mask, 
           look_ahead_mask, dec_padding_mask):

    enc_output = self.encoder(inp, training, enc_padding_mask)  # (batch_size, inp_seq_len, d_model)

    # dec_output.shape == (batch_size, tar_seq_len, d_model)
    dec_output, attention_weights = self.decoder(
        tar, enc_output, training, look_ahead_mask, dec_padding_mask)

    final_output = self.final_layer(dec_output)  # (batch_size, tar_seq_len, target_vocab_size)
    #    return final_output, attention_weights


    return tf.keras.Model(inputs=[inputs, dec_inputs], outputs=outputs, name=name)

и создаем модель, компилируем и подгоняем ее следующим образом:

transformer = Transformer(num_layers, d_model, num_heads, dff,
                          input_vocab_size, target_vocab_size, 
                          pe_input=input_vocab_size, 
                          pe_target=target_vocab_size,
                          rate=dropout_rate)

transformer.compile(optimizer=optimizer, loss=loss_function, metrics=[accuracy])

transformer.fit(dataset, epochs=EPOCHS)

РЕДАКТИРОВАТЬ: Базы @Geeocode обновили функцию def в классе преобразователя так:

def call(self, inp, tar, enc_padding_mask,look_ahead_mask, dec_padding_mask, training=False,):

    enc_output = self.encoder(inp, training, enc_padding_mask)  # (batch_size, inp_seq_len, d_model)

    # dec_output.shape == (batch_size, tar_seq_len, d_model)
    dec_output, attention_weights = self.decoder(
        tar, enc_output, training, look_ahead_mask, dec_padding_mask)

    final_output = self.final_layer(dec_output)  # (batch_size, tar_seq_len, target_vocab_size)
    return final_output, attention_weights

Однако, я все еще получаю ту же ошибку

1 Ответ

0 голосов
/ 25 января 2020

Это, вероятно, ошибка в документации, как мы видим на github, что если мы хотим наследовать tf.keras.Model, то у нас может быть только один training параметр, кроме inputs в определении call() метод, и это сообщение об ошибке жалуется на:

Если вы подкласс Model, вы можете дополнительно иметь аргумент training (логическое) в call, который вы можете использовать чтобы указать другое поведение в обучении и умозаключениях

  """
  If you subclass `Model`, you can optionally have
  a `training` argument (boolean) in `call`, which you can use to specify
  a different behavior in training and inference:
  ```python
  import tensorflow as tf
  class MyModel(tf.keras.Model):
    def __init__(self):
      super(MyModel, self).__init__()
      self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu)
      self.dense2 = tf.keras.layers.Dense(5, activation=tf.nn.softmax)
      self.dropout = tf.keras.layers.Dropout(0.5)
    def call(self, inputs, training=False):
      x = self.dense1(inputs)
      if training:
        x = self.dropout(x, training=training)
      return self.dense2(x)
  model = MyModel()
  ```
  """    

Я предлагаю вам создать проблему на github, ссылаясь на нее.

...