2017-09-22 9 views
2

KerasとDNNは一般的に新しく、いくつかのチュートリアルから始めて、文章を分類するモデルを作成しました。モデルを以下に示します。正直言って、私はそれの背後にある直感とそれがなぜ機能するのかは分かりません。だからこれは私の質問です。この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)のベクトルとして各文を表します。ドロップアウトレイヤーは、モデルを特定の単語に依存させないようにします。畳み込みは、個々の単語とは対照的に、フレーズ/ nグラムを特定する同様の効果を有する。有用な特徴であり得るフレーズ/ nグラムのシーケンスを学習するためにLSTMが続く。次に、Globalmaxpooling1Dレイヤーは、LSTM出力を最終的な分類(密なレイヤー)のフィーチャーとして「平坦化」します。

これは意味がありますか?私はまた、maxpooling1D層とlstm層の間の相互作用をかなり理解していません。 input_shapelstmとは何ですか。出力はどのように見えますか?

答えて

2

あなたの直感は正しいです。あなたが言いましたすべてが保持します。 MaxPooling1Dについて - これはConv1Dの出力をダウンサンプリングする方法です。

出力Conv1Dをから:。この層からの出力は、ちょうどそれがどのように動作するかをお見せするために機能の同じ番号を持つ25の長さを持つことになりますLSTMからConv1D(その入力から、元の出力よりも4倍小さくなります:LSTM

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

入力:

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

編集 categorical_crossentropyとアクティベーションに気付きませんでした。だから、:

  1. あなたの出力は、あなたがcategorical_crossentropysigmoidを使用することができますが、その後、あなたの入力は確率分布としてではなく、クラススコアとして解釈することができない3つのクラスのうちいずれかである場合(予測はスコアが最も高いクラスに等しいです) 。より良いオプションは、クラス上の確率分布を生成するsoftmaxを使用することです。

  2. ケラスの実装のために3つのクラスの予測(相互に排他的ではない)の場合は、categorical_crossentropyと数学的には同じですが、binary_crossentropyを使用する必要があります。これは、kerasが最後のレイヤーからの出力を正規化し、最大1にするためです。これは、トレーニングに重大な影響を与える可能性があります。

+0

私の質問に関連していますが、これは直接答えますので...私はまだ層間のデータの形を整えようとしています。なぜlstmは同じ機能の25の長さを持っていますか?私は層が長さではなく機能を減らしていると思ったのですか?埋め込みレイヤーは100(単語または長さ)x 300(特徴)を出力し、conv1dはそれぞれ100(単語)×75(300/4)の100(フィルターまたはチャンネル)の特徴マップを生成する。 max poolingはこれをさらに75/4に減らすべきではありませんか?この場合、lstmへの入力についても、バッチサイズはどのくらいですか?ステップ= 100ですか? Thanks – Ziqi

+0

'stride'が4に設定されている場合、これはこのように動作します.4に等しいフィルタサイズは、' Conv1D'の各出力が4つのタイムステップからの情報を収集したことを意味します。 –

+0

申し訳ありませんが、conv1dで 'kernel_size'を意味しますか? – Ziqi

0

マルチクラスモデル:

Dense(3,activation='sigmoid')で終わるmulticlassificationモデルは3つの可能なクラスとマルチクラスのためokです。

ただし、正しいクラスが3つしかない場合は'categorical_crossentropy'を使用してください。この場合、有効化関数は'softmax'である必要があります。

'softmax'を指定すると、すべてのクラスの合計が1になることが保証されます。
「シグモイド」は、3つのクラス間の関係を気にせず、すべて1またはすべてゼロとして共存することができます。この場合、'binary_crossentropy'を使用してください。

LSTMとGlobalMaxPooling:

LSTM入力が(batchSize, timeSteps, featuresOrDimension)あります。
出力は、2つのことができます:

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

あなたは真のケースを選んだので、タイムステップの大きさがあり、そしてGlobalMaxPooling1D(batchSize,units)が得られ、その次元での最高値を取り、他の人を破棄します。

LSTM(units,return_sequences=False)とほぼ同じです。しかし、これはシーケンスの最後のステップをとりますが、maxpoolingは最大限のステップを踏みます。

+0

「ケラス」が文句を言うのはどういう意味ですか? –

+0

私はそれが私にエラーメッセージを与えるだろうと誓っていたかもしれません....私はそれらを読んだと確信しています....しかし、多分それは別の状況にあります。私が覚えているのは、カテゴリクロストトロピーを使用できない場合がいくつかあったということです。私はこれらのメッセージのためにこれらの損失と活性化が何だったのかを知る必要があります.... –

関連する問題