总体而言,我对 Keras 和 DNN 相当陌生,从一些教程开始,我已经成功创建了一个用于对句子进行分类的模型。模型如下图所示。老实说,我不确定它背后的直觉是什么以及它为什么有效。这就是我的问题。
def create_model():
embedding_layer = Embedding(input_dim=100, output_dim=300,
input_length=100)
model = Sequential()
model.add(embedding_layer)
model.add(Dropout(0.2))
model.add(Conv1D(filters=100, kernel_size=4, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=4))
model.add(LSTM(units=100, return_sequences=True))
model.add(GlobalMaxPooling1D())
#model.add(Dense(1, activation='sigmoid'))
###### multiclassification #########
model.add(Dense(3, activation='sigmoid')) #I want to replace the above line with this for multi-classification but this didnt work
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
这是我的理解:该模型从在语料库(句子)上训练单词嵌入开始,并将每个句子表示为单词向量的向量(embedding_layer)。然后,dropout 层强制模型不依赖特定的单词。卷积在识别短语/n-gram 方面具有类似的效果,而不仅仅是识别单个单词;然后 LSTM 学习可能是有用特征的短语/n-gram 序列;然后,Globalmaxpooling1D
层将 LSTM 输出“展平”为最终分类(密集层)的特征。
这有什么意义吗?我也不太理解 maxpooling1D 层和 lstm 层之间的交互。 lstm
的 input_shape
是什么?输出是什么样的?
最佳答案
所以,你的直觉是对的。你所说的一切都成立。关于 MaxPooling1D - 这是一种对 Conv1D 输出进行下采样的方法。该层的输出将比 Conv1D
的原始输出小 4 倍(因此 LSTM
的输入长度为 25,且特征数量相同。只需向您展示它是如何工作的:
来自Conv1D
的输出:
0、1、1、0、-1、2、3、5、1、2、1、-1
输入到LSTM
:
1(最大值为 0、1、1、0)、5(最大值为 -1、2、3、5)、2(最大值为 1、2、1、-1)
编辑 我还没有注意到 categorical_crossentropy 和激活。所以:
如果您的输出是 3 个类别之一,您可以使用
categorical_crossentropy
和sigmoid
但您的输入不能解释为概率分布,而是解释为类别分数 (预测等于得分最高的类别)。更好的选择是使用softmax
,它可以生成类别上的概率分布。如果由于 Keras 实现而出现 3 类预测(不互斥),您应该使用
binary_crossentropy
,即使它在数学上等同于categorical_crossentropy
。这是因为keras
会对最后一层的输出进行标准化,并使它们的总和为 1。这可能会严重损害您的训练。
关于python - 了解此 DNN 模型以及为什么它不适用于多标签分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46367875/