Keras GRUCell пропустил 1 обязательный позиционный аргумент: 'states'

Я пытаюсь построить 3-х слойный RNN с Keras. Часть кода здесь:

    model = Sequential()
    model.add(Embedding(input_dim = 91, output_dim = 128, input_length =max_length))
    model.add(GRUCell(units = self.neurons, dropout = self.dropval,  bias_initializer = bias))
    model.add(GRUCell(units = self.neurons, dropout = self.dropval,  bias_initializer = bias))
    model.add(GRUCell(units = self.neurons, dropout = self.dropval,  bias_initializer = bias))
    model.add(TimeDistributed(Dense(target.shape[2])))

Тогда я встретил эту ошибку:

call() missing 1 required positional argument: 'states'

Детали ошибки следующие:

~/anaconda3/envs/hw3/lib/python3.5/site-packages/keras/models.py in add(self, layer)
487                           output_shapes=[self.outputs[0]._keras_shape])
488         else:
--> 489             output_tensor = layer(self.outputs[0])
490             if isinstance(output_tensor, list):
491                 raise TypeError('All layers in a Sequential model '

 ~/anaconda3/envs/hw3/lib/python3.5/site-packages/keras/engine/topology.py in __call__(self, inputs, **kwargs)
601 
602             # Actually call the layer, collecting output(s), mask(s), and shape(s).
--> 603             output = self.call(inputs, **kwargs)
604             output_mask = self.compute_mask(inputs, previous_mask)
605 

1 ответ

Решение
  1. Не используйте классы Cell (т.е. GRUCell или же LSTMCell) в Керасе напрямую. Это вычислительные ячейки, которые обернуты соответствующими слоями. Вместо этого используйте классы Layer (т.е. GRU или же LSTM):

    model.add(GRU(units = self.neurons, dropout = self.dropval,  bias_initializer = bias))
    model.add(GRU(units = self.neurons, dropout = self.dropval,  bias_initializer = bias))
    model.add(GRU(units = self.neurons, dropout = self.dropval,  bias_initializer = bias))
    

    LSTM а также GRU используйте соответствующие ячейки для выполнения вычислений на всех временных шагах. Прочитайте этот ТАК ответ, чтобы узнать больше об их разнице.

  2. Когда вы укладываете несколько слоев RNN друг на друга, вам нужно установить их return_sequences аргумент True чтобы произвести вывод каждого временного шага, который, в свою очередь, используется следующим уровнем RNN. Обратите внимание, что вы можете или не можете делать это на последнем уровне RNN (это зависит от вашей архитектуры и проблемы, которую вы пытаетесь решить):

    model.add(GRU(units = self.neurons, dropout = self.dropval,  bias_initializer = bias, return_sequences=True))
    model.add(GRU(units = self.neurons, dropout = self.dropval,  bias_initializer = bias, return_sequences=True))
    model.add(GRU(units = self.neurons, dropout = self.dropval,  bias_initializer = bias))
    
Другие вопросы по тегам