Keras LSTM 的内部工作原理

Posted

技术标签:

【中文标题】Keras LSTM 的内部工作原理【英文标题】:Inner workings of Keras LSTM 【发布时间】:2018-07-28 11:45:55 【问题描述】:

我正在进行一项多类分类任务:目标是确定某个姓氏的正确来源语言是什么。为此,我使用了 Keras LSTM。 到目前为止,我只使用过 PyTorch,我对 Keras 的“黑匣子”特性感到非常惊讶。对于这个分类任务,我的理解是我需要在 LSTM 中检索给定输入序列的最后一个时间步的输出,然后对其应用 softmax 以获得所有类的概率分布。 有趣的是,如果没有我明确定义这样做,LSTM 似乎会自动做正确的事情并选择最后一个时间步的输出,而不是例如应用softmax的隐藏状态(到目前为止良好的训练和验证结果)。这怎么可能?选择适当的损失函数 categorical_crossentropy 是否向模型表明应该使用上一个时间步的输出进行分类?

代码:

model = Sequential()

model.add(Dense(100, input_shape=(max_len, len(alphabet)), kernel_regularizer=regularizers.l2(0.00001)))

model.add(Dropout(0.85))

model.add(LSTM(100, input_shape=(100,))) 

model.add(Dropout(0.85))

model.add(Dense(num_output_classes, activation='softmax'))

adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, decay=1e-6)

model.compile(loss='categorical_crossentropy',
              optimizer=adam,
              metrics=['accuracy'])

history = model.fit(train_data, train_labels,
          epochs=5000,
          batch_size=num_train_examples,
          validation_data = (valid_data, valid_labels))

【问题讨论】:

【参考方案1】:

不,返回最后一个时间步的输出正是每个 Keras RNN 层默认执行的操作。请参阅 return_sequences 的文档,这会导致它返回 每个 时间步的输出(这对于堆叠 RNN 层是必需的)。没有自动的直觉来判断你要连接什么样的层,默认情况下你只是得到了你想要的,大概是因为设计师认为这是最常见的情况。

【讨论】:

有道理。谢谢!

以上是关于Keras LSTM 的内部工作原理的主要内容,如果未能解决你的问题,请参考以下文章

加载权重 keras LSTM 不工作

机器翻译引擎的基本原理 ——LSTM

LSTM MNIST 数据集中的特征和时间步长

LSTM内部实现原理详解

LSTM反向传播原理——LSTM从零实现系列

如何使用 Keras 实现深度双向 LSTM?