Keras LSTM的内部工作原理

时间:2018-02-17 20:59:26

标签: nlp deep-learning keras classification lstm

我正在研究多类分类任务:目标是确定某个姓氏的正确起源语言。为此,我使用的是Keras LSTM。 到目前为止,我只与PyTorch合作,我对'#34;黑盒子"感到非常惊讶。 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 个答案:

答案 0 :(得分:3)

不,返回最后一次步骤的输出正是每个Keras RNN层默认执行的操作。请参阅{{1}}的文档,这会导致它返回每个时间步的输出(这是堆叠RNN图层所必需的)。没有自动直觉基于你在哪种层次上挂钩,你只是默认得到了你想要的东西,大概是因为设计师认为这是最常见的情况。