【问题标题】:Why 2 almost equal Keras CNN returns 2 quite different results为什么 2 个几乎相等的 Keras CNN 返回 2 个完全不同的结果
【发布时间】:2018-03-11 12:17:20
【问题描述】:

我正在处理一个句子级二进制分类任务。我的数据由 3 个标记子数组组成:左上下文、核心和右上下文。

我使用 Keras 设计了几种卷积神经网络的替代方案,并验证了哪一种最适合我的问题。

我是 Python 和 Keras 的新手,我决定从更简单的解决方案开始,以测试哪些更改可以改善我的指标(准确度、精确度、召回率、f1 和 auc-roc)。第一个简化是关于输入数据:我决定忽略上下文来创建 Keras 的顺序模型:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 500)               0         
_________________________________________________________________
masking_1 (Masking)          (None, 500)               0         
_________________________________________________________________
embedding_1 (Embedding)      (None, 500, 100)          64025600  
_________________________________________________________________
conv1d_1 (Conv1D)            (None, 497, 128)          51328     
_________________________________________________________________
average_pooling1d_1 (Average (None, 62, 128)           0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 62, 128)           0         
_________________________________________________________________
conv1d_2 (Conv1D)            (None, 61, 256)           65792     
_________________________________________________________________
dropout_2 (Dropout)          (None, 61, 256)           0         
_________________________________________________________________
conv1d_3 (Conv1D)            (None, 54, 32)            65568     
_________________________________________________________________
global_max_pooling1d_1 (Glob (None, 32)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 16)                528       
_________________________________________________________________
dropout_3 (Dropout)          (None, 16)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 34        
=================================================================

如您所见,我使用固定大小的输入,因此我应用了填充预处理。我还使用了带有 Word2Vec 模型的嵌入层。

此模型返回以下结果:

P       0.875457875
R       0.878676471
F1      0.87706422
AUC-ROC 0.906102654

我希望实现如何通过 Lambda 层在我的 CNN 中选择输入数据的子数组。我使用以下 Lambda 层定义:

Lambda(lambda x: x[:, 1], output_shape=(500,))(input)

这是我的新 CNN 的摘要(你可以看到它与以前的几乎相同):

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 3, 500)            0         
_________________________________________________________________
lambda_1 (Lambda)            (None, 500)               0         
_________________________________________________________________
masking_1 (Masking)          (None, 500)               0         
_________________________________________________________________
embedding_1 (Embedding)      (None, 500, 100)          64025600  
_________________________________________________________________
conv1d_1 (Conv1D)            (None, 497, 128)          51328     
_________________________________________________________________
average_pooling1d_1 (Average (None, 62, 128)           0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 62, 128)           0         
_________________________________________________________________
conv1d_2 (Conv1D)            (None, 61, 256)           65792     
_________________________________________________________________
dropout_2 (Dropout)          (None, 61, 256)           0         
_________________________________________________________________
conv1d_3 (Conv1D)            (None, 54, 32)            65568     
_________________________________________________________________
global_max_pooling1d_1 (Glob (None, 32)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 16)                528       
_________________________________________________________________
dropout_3 (Dropout)          (None, 16)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 34        
=================================================================

但结果令人作呕,因为准确率停止在 60%,而且很明显,就第一个模型结果而言,准确率、召回率和 f1 太低(

我不知道发生了什么,我不知道这些网络是否比我想象的更加不同。

关于这个问题的任何线索?

【问题讨论】:

    标签: python nlp deep-learning keras keras-2


    【解决方案1】:

    两个初始问题(我会发表评论,但还没有足够的代表):

    (1) 使用 CNN 的动机是什么?它们擅长在输入值的二维数组中挑选局部特征 - 例如,如果您将黑白图片想象为整数表示灰度的二维数组,它们可能会挑选出表示边缘、角落或对角白线等事物的像素。除非您有理由期望您的数据像图片一样具有这样的局部聚类特征,并且对于输入数组中水平和垂直方向彼此更接近的点更相关,您可能会更好地使用密集层没有关于哪些输入特征与哪些其他特征相关的假设。从说 2 层开始,看看它会带给你什么。

    (2) 假设您对架构的形状有信心,您是否尝试过降低学习率?这是在任何不能很好收敛的 NN 中尝试的第一件事。

    (3) 根据任务的不同,您最好使用字典和 one-hot 编码来对您的单词进行编码,尤其是在分类相对简单且上下文没什么大不了的情况下。 Word2Vec 意味着您将单词编码为数字,这对梯度下降有影响。很难说不知道你想要达到什么目标,但如果你不知道为什么使用 word2vec 是一个好主意,它可能不是......

    This link很好的解释了CNNs和dense layer的区别,可以帮助大家判断。

    【讨论】:

    • 我重新表述了我的问题以澄清它。因为我不认为你理解它。不过,我会回答你的问题。
    • 1.- 在我的任务中,关于近距离标记的局部特征非常重要,因此 CNN 非常适合此类任务。您可以在文献中找到几个用于 NLP 的 CNN 示例:dl.acm.org/citation.cfm?id=2969342anthology.aclweb.org/N/N15/N15-1011.pdfanthology.aclweb.org/C/C14/C14-1008.pdfemnlp2014.org/papers/pdf/EMNLP2014181.pdf。但是,我将只尝试密集层以比较结果。
    • 2.- 我正在比较两个完全相等的 CNN 架构与 Labmda 层的差异(相等的卷积层、相等的密集层、相等的池化、相等的 dropout、相等的学习率)。其中一个表现很好,另一个表现很差。 3.- 我需要考虑语义特征。这是使用 Word Embedding 解决方案对标记进行矢量化的主要原因。一个热向量对这个问题没有太大帮助。非常感谢您的回答。
    • 是的,在句子 NLP 上下文中使用 CNN 是有意义的,其中“附近”的词彼此更相关。
    • 我明白了 - 你正试图理解为什么 lambda 层会破坏事物。 - 现在很清楚了。进入 lambda 层的数据的形状和预期的输出是什么?看起来您正在尝试从输入中提取第一列,这意味着您正在丢弃大量输入(除非它只有一列)。也许从一个身份 lambda 开始,证明这是相等的,然后从那里调整 hte lambda? FWIW 当您使用 Keras 时,文档说 output_shape 参数仅在使用 Theano 时才相关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2014-04-08
    • 1970-01-01
    • 2017-09-21
    • 2011-10-15
    • 2021-12-10
    • 1970-01-01
    相关资源
    最近更新 更多