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 的内部工作原理的主要内容,如果未能解决你的问题,请参考以下文章