keras.Инициализация двунаправленного LSTM.Передача слов - PullRequest
0 голосов
/ 28 октября 2018

В используемой мной реализации lstm инициализируется следующим образом:

l_lstm = Bidirectional(LSTM(64, return_sequences=True))(embedded_sequences)

Что я на самом деле не понимаю, и это может быть из-за недостатка опыта в Python в целом:запись l_lstm= Bidirectional(LSTM(...))(embedded_sequences).Я не понимаю, что я передаю embedded_sequences?Потому что это не параметр LSTM(), но он также не является аргументом для Bidirectional() в отдельности.

Вот документация для двунаправленного:

  def __init__(self, layer, merge_mode='concat', weights=None, **kwargs):
        if merge_mode not in ['sum', 'mul', 'ave', 'concat', None]:
            raise ValueError('Invalid merge mode. '
                             'Merge mode should be one of '
                             '{"sum", "mul", "ave", "concat", None}')
        self.forward_layer = copy.copy(layer)
        config = layer.get_config()
        config['go_backwards'] = not config['go_backwards']
        self.backward_layer = layer.__class__.from_config(config)
        self.forward_layer.name = 'forward_' + self.forward_layer.name
        self.backward_layer.name = 'backward_' + self.backward_layer.name
        self.merge_mode = merge_mode
        if weights:
            nw = len(weights)
            self.forward_layer.initial_weights = weights[:nw // 2]
            self.backward_layer.initial_weights = weights[nw // 2:]
        self.stateful = layer.stateful
        self.return_sequences = layer.return_sequences
        self.return_state = layer.return_state
        self.supports_masking = True
        self._trainable = True
        super(Bidirectional, self).__init__(layer, **kwargs)
        self.input_spec = layer.input_spec
        self._num_constants = None

1 Ответ

0 голосов
/ 28 октября 2018

Давайте попробуем разобрать, что происходит:

  1. Вы начинаете с LSTM(...), который создает LSTM Layer .Теперь слои в Keras могут вызываться , что означает, что вы можете использовать их как функции.Например, lstm = LSTM(...), а затем lstm(some_input) будет вызывать LSTM для данного входного тензора.
  2. Bidirectional(...) обертывает любой слой RNN и возвращает вас другой слой , который при вызове применяет обернутый слой в обоих направлениях.Так что l_lstm = Bidirectional(LSTM(...)) - это слой, когда вызывается с некоторым вводом, будет применяться LSTM в обоих направлениях. Примечание: Двунаправленный создает копию пройденного слоя LSTM, поэтому взад и вперед - это разные LSTM.
  3. Наконец, когда вы вызываете Bidirectional(LSTM(...))(embedded_seqences) двунаправленный слой принимает входные последовательности, передает ихОбернутые LSTM в обоих направлениях собирают их выходные данные и объединяют их.

Чтобы узнать больше о слоях и их вызываемой природе, вы можете обратиться к руководству по функциональным API документации.

...