喀拉斯。初始化双向 LSTM。传递词嵌入
keras. Initializing a bidirecional LSTM. Passing word embeddings
在我使用的实现中,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
让我们试着分解一下发生了什么:
- 您从
LSTM(...)
开始,它创建了一个 LSTM Layer。现在 layers in Keras are callable 这意味着您可以像函数一样使用它们。例如 lstm = LSTM(...)
然后 lstm(some_input)
将 在给定的输入张量上调用 LSTM。
Bidirectional(...)
包装任何RNN层和returns你另一个层调用时应用包装两个方向的图层。所以 l_lstm = Bidirectional(LSTM(...))
是一个层,当用一些输入调用时将在两个方向上应用 LSTM
。 注意:双向创建已通过的 LSTM 层的副本,因此向后和向前是不同的 LSTM。
- 最后,当您调用
Bidirectional(LSTM(...))(embedded_seqences)
时,双向层获取输入序列,将其双向传递给包装的 LSTM,收集它们的输出并将其连接起来。
要了解有关层及其可调用性质的更多信息,您可以查看文档的 functional API guide。
在我使用的实现中,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
让我们试着分解一下发生了什么:
- 您从
LSTM(...)
开始,它创建了一个 LSTM Layer。现在 layers in Keras are callable 这意味着您可以像函数一样使用它们。例如lstm = LSTM(...)
然后lstm(some_input)
将 在给定的输入张量上调用 LSTM。 Bidirectional(...)
包装任何RNN层和returns你另一个层调用时应用包装两个方向的图层。所以l_lstm = Bidirectional(LSTM(...))
是一个层,当用一些输入调用时将在两个方向上应用LSTM
。 注意:双向创建已通过的 LSTM 层的副本,因此向后和向前是不同的 LSTM。- 最后,当您调用
Bidirectional(LSTM(...))(embedded_seqences)
时,双向层获取输入序列,将其双向传递给包装的 LSTM,收集它们的输出并将其连接起来。
要了解有关层及其可调用性质的更多信息,您可以查看文档的 functional API guide。