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 ответ
Не используйте классы 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
используйте соответствующие ячейки для выполнения вычислений на всех временных шагах. Прочитайте этот ТАК ответ, чтобы узнать больше об их разнице.Когда вы укладываете несколько слоев 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))