我正在研究多类分类任务:目标是确定某个姓氏的正确起源语言。为此,我使用的是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))
答案 0 :(得分:3)
不,返回最后一次步骤的输出正是每个Keras RNN层默认执行的操作。请参阅{{1}}的文档,这会导致它返回每个时间步的输出(这是堆叠RNN图层所必需的)。没有自动直觉基于你在哪种层次上挂钩,你只是默认得到了你想要的东西,大概是因为设计师认为这是最常见的情况。