3

我正在使用带有 MSCOCO 数据集的 Keras(Tensorflow 后端)训练 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)
4

0 回答 0