2017-09-29 113 views
0

我正在尋址句級二進制分類任務。我的數據由3個令牌的子陣列組成:左上下文,核心和右上下文。爲什麼2幾乎相等Keras CNN返回2完全不同的結果

我用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太低(< 0.10)。

我不知道發生了什麼,我不知道這些網絡是否與我想象的更加不同。

關於這個問題的任何線索?

回答

0

兩個初始的問題(我會發表評論,但沒有足夠的代表尚未):

(1)什麼是使用一個CNN的動機是什麼?這些都是很好的在輸入值的2-d陣列挑選出地方特色 - 例如,如果你想像一個黑白圖片爲其中整數表示灰度整數的2-d陣列,他們可能會挑選出的團塊像素表示像邊緣,角落或對角線白色的東西。除非你有充分的理由期待您的數據,如圖片,有這樣的地方聚集的特點,併爲接近海誓山盟水平和垂直在您的輸入數組更相關,你可能會更好地與緻密層的點那裏沒有關於哪些輸入特徵與哪些其他特徵相關的假設。從說2層開始,看看你在哪裏。

(2)假設你有信心你的建築的形狀,你嘗試降低學習率是多少?這是第一個嘗試在任何不合適的NN上進行測試的人。

(3)根據不同的任務,你可能會使用你的話字典和一個熱編碼,尤其如果它是相對簡單的分類和內容是不是太多了大事更好。 Word2Vec表示您將單詞編碼爲數字,這對梯度下降有影響。很難說不知道你想達到什麼目的,但如果你沒有一些合理的想法,爲什麼使用word2vec是一個好主意,它可能不是...

This link解釋CNN和密集層之間的區別,所以可能會幫助你判斷。

+0

我重新說明了我的問題來澄清它。因爲我認爲你不瞭解它。 不過,我要回答你的問題。 –

+0

1.-在我的任務中,關於近距離標記的本地特徵非常重要,所以CNN對於這類任務非常適用。您可以在文獻中找到若干有關NLP的CNN示例:https://dl.acm.org/citation.cfm?id = 2969342,http://www.anthology.aclweb.org/N/N15/N15-1011 .pdf,http://anthology.aclweb.org/C/C14/C14-1008.pdf,http://emnlp2014.org/papers/pdf/EMNLP2014181.pdf。不過,我只會嘗試濃縮圖層以便比較結果。 –

+0

2.-我正在比較兩個完全相同的CNN體​​繫結構與Labmda層的差異(等概率層,等密集層,相等池,平均丟失率,相等學習率)。其中一個表現相當好,另一個表現相當差。 3.-我需要考慮語義特徵。這是使用Word嵌入解決方案來引導令牌的主要原因。一個熱媒不會幫助我解決這個問題。 我真的很感謝你的回答。 –

相關問題