我正在训练使用Keras(Tensorflow后端)和MSCOCO数据集生成描述的LSTM RNN . 训练模型时,它的准确率为92%,损失为0.79 . 此外,当模型进行训练时,我在每个时期测试了描述生成,并且当模型给出随机单词时,模型提供了非常好的预测和有意义的描述 .

然而,在训练之后,我在Keras中使用model.load_weights(WEIGHTS)方法加载模型,并尝试通过给出一个随机单词来创建描述,就像我之前所做的那样 . 但是现在模型没有提供有意义的描述,它只输出没有任何意义的随机单词 .

谁能告诉我这可能是什么问题?

我的模型参数是:

10个LSTM图层,学习率:0.04,激活:Softmax,损失函数:分类交叉熵,优化器:rmsprop

UPDATE:

这是我的模特:

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)