MSCOCO データセットで Keras (Tensorflow バックエンド) を使用して記述生成用の LSTM RNN をトレーニングしています。モデルをトレーニングすると、0.79 の損失で 92% の精度が得られました。さらに、モデルがトレーニングされているときに、各エポックで説明の生成をテストしたところ、モデルはランダムな単語を与えるときに意味のある説明で非常に優れた予測を提供しました。
ただし、トレーニング後、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)