2017-02-27 57 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. epochs的數量是否過小?

不,50個時代不是太小。您可以嘗試調整其他參數,例如學習率!

  1. 我的整個方法錯了嗎?

不,您的方法沒有錯。您可以增強您的方法來爲圖像生成良好的標題。你應該在網上找到很好的例子,只要通過他們,我相信你會從他們那裏得到想法。

+0

因爲我在結尾處有一個softmax層,所以神經網絡的輸出是字幕詞彙表上的概率分佈。在預測時,神經網絡吐出一個概率向量,而概率最高的索引是下一個最可能的詞的索引。當我運行預測時,每次都會得到相同的分佈矢量,因此每次預測的下一個單詞都完全一樣。此外,網絡預測我給出的任何圖像作爲輸入的相同下一個單詞。希望這能回答你的問題。 –

+0

@TheBaus是的,無論你做的是正確的。你應該使用'timestep'這個詞而不是'iteration',這就是我混淆的原因。無論如何,它似乎像你的神經網絡沒有學到任何東西。你應該用更多的訓練數據來訓練你的模型。 –

+0

我注意到的另一個問題是,在訓練期間,損失波動很大。它隨機增加和減少,而不是逐漸減少,keras'acc'度量保持恆定爲0.可能導致這種情況的原因是什麼? –