我正在尝试构建一个图片字幕模型。
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作为输入并再次生成概率分布。
我会在每个时间步长得到相同的概率分布。
我的问题是:
答案 0 :(得分:3)
在回答你的问题之前,我想问一下,你在下面的陈述中对迭代的意思是什么?
What happens is that I get the same probability distribution in every iteration.
给定一个图像和初始单词,你应该得到下一个应该作为输入生成下一个单词的单词,这个过程应该继续,直到你得到一个代表结尾的特殊标记(例如,EOC)标题。
- 我的模型是否太小而无法生成字幕?
醇>
我会说不,但可能这个模型很小,无法生成好的字幕。
- 训练数据是否太小?
醇>
是的,只有100张图像不足以训练生成神经网络的图像标题。
- 时代的数量是否太小?
醇>
不,50个时代不是太小。您可以尝试调整其他参数,例如学习率!
- 我的整个方法是错的吗?
醇>
不,你的做法没有错。您可以扩充您的方法,为图像生成良好的标题。你应该在网上找到很好的例子,只要仔细阅读,我相信你会从他们那里得到想法。