【问题标题】:Understanding this DNN model and why it does not work on multi-label classification了解此 DNN 模型以及为什么它不适用于多标签分类
【发布时间】:2018-03-04 05:16:10
【问题描述】:

总的来说,我对 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 层之间的交互。 input_shapelstm 是什么,输出是什么样的?

【问题讨论】:

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


    【解决方案1】:

    所以,你的直觉是对的。你所说的一切都成立。关于MaxPooling1D - 这是一种对Conv1D 的输出进行下采样的方法。该层的输出将比 Conv1D 的原始输出小 4 倍(因此 LSTM 的输入长度为 25,具有相同数量的特征。只是为了向您展示它是如何工作的:

    Conv1D 的输出:

    0, 1, 1, 0, -1, 2, 3, 5, 1, 2, 1, -1

    输入LSTM

    1 (max from 0, 1, 1, 0), 5 (max from -1, 2, 3, 5), 2 (max from 1, 2, 1, -1)

    编辑 我没有注意到categorical_crossentropy 和激活。所以:

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

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

    【讨论】:

    • 感谢与我的问题相关的两者,但因为这直接回答了它......我仍在尝试计算层之间的数据形状。为什么 lstm 有 25 个长度的相同特征?我认为这些层是在减少特征,而不是长度?因此嵌入层输出 100(字或长度)x 300(特征),conv1d 产生 100(过滤器或通道)特征图,每个尺寸为 100(字)x 75(300/4);那么最大池不应该进一步减少到75/4吗?同样在这种情况下,对于 lstm 的输入,批量大小是多少?步长=100?谢谢
    • 如果 stride 设置为 4,这将像这样工作。过滤器大小等于 4 意味着来自 Conv1D 的每个输出从 4 个时间步长收集信息。
    • 对不起,你的意思是 conv1d 中的 'kernel_size' 吗?
    【解决方案2】:

    多类模型:

    Dense(3,activation='sigmoid') 结尾的多分类模型适用于具有 3 个可能类的多类。

    但它应该只使用'categorical_crossentropy',如果这3个中只有一个正确的类。在这种情况下,激活函数应该是'softmax'

    “softmax”将保证所有类的总和为 1。当您只需要一个正确的类时,这很好。
    'sigmoid' 不会关心 3 个类之间的关系,它们可以作为全 1 或全 0 共存。在这种情况下,请使用'binary_crossentropy'

    LSTM 和 GlobalMaxPooling:

    LSTM 输入是(batchSize, timeSteps, featuresOrDimension)
    输出可以是两个:

    • return_sequences = True:(batchSize, timeSteps, units)
    • return_sequences = False:(batchSize, units)

    由于您选择了 True 情况,因此存在 timeSteps 维度,GlobalMaxPooling1D 将取该维度中的最大值并丢弃其他值,从而产生(batchSize,units)

    这很像只使用LSTM(units,return_sequences=False)。但这一步采取了序列中的最后一步,而 maxpooling 将采取最大的一步。

    【讨论】:

    • keras会抱怨是什么意思?
    • 我本可以发誓它会给我错误消息....我确定我已经阅读了这些....但也许情况不同。我记得在某些情况下我不能使用分类交叉熵。由于这些消息,我必须了解这些损失和激活是什么......
    猜你喜欢
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2021-02-19
    • 1970-01-01
    • 2021-01-08
    • 2012-01-22
    相关资源
    最近更新 更多