python - 了解此 DNN 模型以及为什么它不适用于多标签分类

标签 python machine-learning neural-network keras deep-learning

总体而言,我对 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 层之间的交互。 lstminput_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 和激活。所以:

  1. 如果您的输出是 3 个类别之一,您可以使用 categorical_crossentropysigmoid 但您的输入不能解释为概率分布,而是解释为类别分数 (预测等于得分最高的类别)。更好的选择是使用 softmax,它可以生成类别上的概率分布。

  2. 如果由于 Keras 实现而出现 3 类预测(不互斥),您应该使用 binary_crossentropy,即使它在数学上等同于 categorical_crossentropy。这是因为 keras 会对最后一层的输出进行标准化,并使它们的总和为 1。这可能会严重损害您的训练。

关于python - 了解此 DNN 模型以及为什么它不适用于多标签分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46367875/

相关文章:

python - 使用带有Python的opencv进行人脸识别所需的训练图像数

python - 存储 session 时 tensorflow 中出现错误 "no Variable to save"

python-3.x - 使用Keras后端实现裁剪功能

machine-learning - 反向传播和前馈神经网络有什么区别?

python - 用 Python 编程神经网络?

java - 将图像从 java 客户端发送到 python 服务器

javascript - 字符串搜索算法实现

python - Lambda 评估意外

python - scipy.optimize.curve_fit 产生无意义的曲线拟合

matlab - 如何解释多输出神经网络回归结束时获得的回归图?