我正在使用Keras(Tensorflow Backend)和MSCOCO数据集训练LSTM RNN进行描述生成。训练模型时,它的准确率为92%,损失为0.79。此外,当模型进行训练时,我在每个时期测试了描述生成,并且模型在给出随机单词时提供了非常好的预测和有意义的描述。
然而,在训练之后,我在Keras中使用model.load_weights(WEIGHTS)方法加载模型,并尝试通过给出一个随机单词来创建描述,就像我之前所做的那样。但是现在模型没有提供有意义的描述,它只输出没有任何意义的随机词。
有谁能告诉我这可能是什么问题?
我的模型参数是:
10个LSTM图层,学习率:0.04,激活:Softmax,损失函数:分类交叉熵,优化器:rmsprop
更新
这是我的模特:
model = Sequential()
model.add(LSTM(HIDDEN_DIM, input_shape=(None, VOCAB_SIZE), return_sequences=True))
for i in range(LAYER_NUM - 1):
model.add(LSTM(HIDDEN_DIM, return_sequences=True))
model.add(TimeDistributed(Dense(VOCAB_SIZE)))
model.add(Activation('softmax'))
model.add(Dropout(0.04))
model.compile(loss="categorical_crossentropy", optimizer="rmsprop", metrics=['accuracy'])
这就是我训练和训练的方式。保存我的模型权重(我在每个时期生成一个描述以测试准确性):
model.fit(X, Y, batch_size=BATCH_SIZE, verbose=1, epochs=EPOCHS)
EPOCHS += 1
generate_description(model, GENERATE_LENGTH, VOCAB_SIZE, index_to_word) model.save_weights('checkpoint_layer_{}_hidden_{}_epoch_{}.hdf5'.format(LAYER_NUM, HIDDEN_DIM, EPOCHS))
这是我加载模型的方式(WEIGHTS =我保存的模型):
model.load_weights(WEIGHTS)
desc = generate_description(model, GENERATE_LENGTH, VOCAB_SIZE, index_to_word)
print(desc)
我将随机生成的矢量提供给我的模型进行测试。这就是我生成描述的方式。
def generate_description(model, length, vocab_size, index_to_word):
index = [np.random.randint(vocab_size)]
Y_word = [index_to_word[index[-1]]]
X = np.zeros((1, length, vocab_size))
for i in range(length):
# Appending the last predicted word to next timestep
X[0, i, :][index[-1]] = 1
print(index_to_word[index[-1]])
index = np.argmax(model.predict(X[:, :i + 1, :])[0], 1)
Y_word.append(index_to_word[index[-1]])
Y_word.append(' ')
return ('').join(Y_word)