Nlp Keras LSTM的内部工作原理

Nlp Keras LSTM的内部工作原理,nlp,deep-learning,keras,classification,lstm,Nlp,Deep Learning,Keras,Classification,Lstm,我正在进行一项多类别分类任务:目标是确定某个姓氏的正确来源语言。为此,我使用Keras LSTM。 到目前为止,我只与PyTorch合作过,我对Keras的“黑匣子”角色感到非常惊讶。对于这项分类任务,我的理解是,我需要检索LSTM中给定输入序列的最后一个时间步的输出,然后对其应用softmax以获得所有类的概率分布。 有趣的是,在我没有明确定义的情况下,LSTM似乎会自动做正确的事情,并选择最后一个时间步的输出,而不是应用softmax的隐藏状态(到目前为止,良好的培训和验证结果)。这怎么可能

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

代码:


不,返回最后一个时间步的输出只是每个Keras RNN层默认的操作。参见
return\u sequences
的文档,这会导致它返回每个时间步的输出(这是堆叠RNN层所必需的)。没有基于连接到一起的层类型的自动直觉,默认情况下,您只得到了您想要的,大概是因为设计师认为这是最常见的情况。

有道理。谢谢
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))