图像标题给出了微弱的结果

时间:2017-02-27 19:49:47

标签: python deep-learning keras

我正在尝试构建一个图片字幕模型。

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. 我的整个方法是错的吗?

1 个答案:

答案 0 :(得分:3)

在回答你的问题之前,我想问一下,你在下面的陈述中对迭代的意思是什么?

What happens is that I get the same probability distribution in every iteration.

给定一个图像和初始单词,你应该得到下一个应该作为输入生成下一个单词的单词,这个过程应该继续,直到你得到一个代表结尾的特殊标记(例如,EOC)标题。

  
      
  1. 我的模型是否太小而无法生成字幕?
  2.   

我会说不,但可能这个模型很小,无法生成好的字幕。

  
      
  1. 训练数据是否太小?
  2.   

是的,只有100张图像不足以训练生成神经网络的图像标题。

  
      
  1. 时代的数量是否太小?
  2.   

不,50个时代不是太小。您可以尝试调整其他参数,例如学习率!

  
      
  1. 我的整个方法是错的吗?
  2.   

不,你的做法没有错。您可以扩充您的方法,为图像生成良好的标题。你应该在网上找到很好的例子,只要仔细阅读,我相信你会从他们那里得到想法。