画像キャプションモデルを構築しようとしています。弱い結果を与える画像キャプション
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を入力として与え、確率分布を再度生成します。
何が起こるかは、すべてのタイムステップで同じ確率分布を得ることです。
- キャプションを生成するには小さすぎる私のモデルです:
私の質問は、ということでしょうか?
- トレーニングデータが小さすぎますか?
- エポックの数が小さすぎますか?
- 私のアプローチは間違っていますか?
モデル作成コードはここにある:https://github.com/AahanSingh/ConsciousAgent/blob/master/create_model.py
モデルのテストコードここにある:https://github.com/AahanSingh/ConsciousAgent/blob/master/test_model.py
編集:コードへのリンクを追加しました。
詳細な実際のトレーニングと評価プロセスについて説明してください。 –