2017-02-27 4 views
4

画像キャプションモデルを構築しようとしています。弱い結果を与える画像キャプション

modelV = createVGG16() 
modelV.trainable = False 
# DISCARD LAST 2 LAYERS 
modelV.layers.pop() 
modelV.layers.pop() 

print 'LOADED VISION MODULE' 

modelL = Sequential() 
# CONVERTING THE INPUT PARTIAL CAPTION INDEX VECTOR TO DENSE VECTOR REPRESENTATION 
modelL.add(Embedding(self.vocab_size, 256, input_length=self.max_cap_len)) 
modelL.add(LSTM(128,return_sequences=True)) 
modelL.add(TimeDistributed(Dense(128))) 

print 'LOADED LANGUAGE MODULE' 

# REPEATING IMAGE VECTOR TO TURN INTO A SEQUENCE 
modelV.add(RepeatVector(self.max_cap_len)) 

print 'LOADED REPEAT MODULE' 

model = Sequential() 
model.add(Merge([modelV, modelL], mode='concat', concat_axis=-1)) 
# ENCODING THE VECTOR SEQ INTO A SINGLE VECTOR 
# WHICH WILL BE USED TO COMPUTE THE PROB DISTRIB OF THE NEXT WORD 
# IN THE CAPTION 
model.add(LSTM(256,return_sequences=False)) 
model.add(Dense(self.vocab_size)) 
model.add(Activation('softmax')) 

if(ret_model==True): 
    return model 

model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy']) 

print 'COMBINED MODULES' 
# OUTPUT WILL BE OF SHAPE (samples, max_caption_len, 128) 
return model 

私は50のエポックのためFLickr8kテストデータセットの最初の100枚のすべての画像5つのキャプションにこのモデルを実行しようとしています。すべてのキャプションは、先頭に付けられ、連結されます。 キャプションを生成するには、入力画像と最初の単語を与えます。それぞれの反復で、私はボキャブラリ上の確率分布を予測し、次の単語を取得します。次の反復では、PredictedWordを入力として与え、確率分布を再度生成します。

何が起こるかは、すべてのタイムステップで同じ確率分布を得ることです。

  1. キャプションを生成するには小さすぎる私のモデルです:

    私の質問は、ということでしょうか?

  2. トレーニングデータが小さすぎますか?
  3. エポックの数が小さすぎますか?
  4. 私のアプローチは間違っていますか?

モデル作成コードはここにある:https://github.com/AahanSingh/ConsciousAgent/blob/master/create_model.py

モデルのテストコードここにある:https://github.com/AahanSingh/ConsciousAgent/blob/master/test_model.py

編集:コードへのリンクを追加しました。

+0

詳細な実際のトレーニングと評価プロセスについて説明してください。 –

答えて

3

あなたの質問に答える前に、次のステートメントで反復の意味はどうでしたか?

画像と初期の単語を考えると
What happens is that I get the same probability distribution in every iteration. 

、あなたは次の単語を生成するための入力として与えられるべきである次の単語を取得する必要がありますし、あなたが特別なトークンを取得するまで、このプロセスは上に行く必要があります(例を。、EOC)キャプションの終わりを表す。

  1. 私のモデルはキャプションを生成するには小さすぎますか?

いいえ、このモデルは適切なキャプションを生成するためには小さいかもしれません。

  1. トレーニングデータが小さすぎますか?

はい、100画像だけでは、画像キャプション生成ニューラルネットワークを学習するには不十分です。

  1. エポックの数が小さすぎますか?

いいえ、50エポックはあまり小さくありません。おそらく、学習率などの他のパラメータを調整することで試すことができます。

  1. 私のアプローチは間違っていますか?

いいえ、あなたのアプローチは間違いではありません。あなたは、イメージのための良いキャプションを生成するあなたのアプローチを補強することができます。あなたは良い例をウェブで見つけて、それらを通り抜けるべきです、私はあなたがそれらからアイデアを得ると信じています。

+0

私は終わりにsoftmax層を持っているので、ニューラルネットワークの出力はキャプションの語彙を超える確率分布です。予測では、ニューラルネットワークは確率のベクトルを吐き出し、最も高い確率を有するインデックスは次の最も可能性の高いワードのインデックスである。予測を実行すると毎回同じ分布ベクトルが得られるため、予測される次の単語は毎回同じです。また、ネットワークは、入力として与える画像と同じ次の単語を予測します。あなたの質問に答えることを願っています。 –

+0

@TheBausはい、あなたがしていることはすべて正しいです。 'iteration'の代わりに' timestep'という言葉を使うべきです、それが私の混乱の理由です。とにかく、あなたの神経ネットワークは何も学んでいないようです。より多くのトレーニングデータを使用してモデルをトレーニングする必要があります。 –

+0

私が気付くもう一つの問題は、トレーニング中に損失が大きく変動することです。それは徐々に減少するのではなくランダムに増減し、keras 'acc'メトリックは0で一定にとどまります。 –

関連する問題