2017-02-27 67 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.可能导致这种情况的原因是什么? –