JS のエラー:
キャッチされていない (約束された) エラー: 入力 0 はレイヤーの平坦化と互換性がありません: 予想される min_ndim=3、見つかった ndim=2.
keras/python (VGG または ResNets など) で事前トレーニング済みのモデルをインポートしようとしている人々から、同じエラーのスレッドが見つかりました。
彼らにとっては、モデルの最上位レイヤーがまだ含まれていることが主な原因だったので、残念ながら、これらのスレッドは、TensorflowJS で python から自己訓練されたモデルを完全にインポートするという私の問題とは何の関係もありません。私のコード:
Python コード:
model = keras.models.Sequential([
keras.layers.GRU(128, return_sequences=True, input_shape=[ None, max_id+1]),
keras.layers.GRU(128, return_sequences=True),
keras.layers.GRU(128),
keras.layers.Flatten(),
keras.layers.Dense(output_size, activation="softmax")
])
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=['accuracy'])
history = model.fit(train_tokens_X, train_target, validation_data=(valid_tokens_X, valid_target), batch_size=32, epochs=15)
model.save(os.path.join(data_dir, "prototype.h5"))
次に、それを .h5 に保存し、ここで説明されているように tensorflowjs_converter で変換します: https://www.tensorflow.org/js/tutorials/conversion/import_keras
次に、JS にインポートします。
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Js test</title>
</head>
<body>
<h1>JavaScript TF test</h1>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.0/dist/tf.min.js"></script>
<script>
// init
let model = null;
(async () => {
alert('Hello World!');
tf.loadLayersModel('http://localhost:3000/prototype_web/model.json'); // Code crashes here with "Error: Input 0 is incompatible with layer flatten: expected min_ndim=3, found ndim=2."
alert('Hello World2!');
model.summary();
})();
</script>
</body>
</html>
私がこれまでに試したこと:
- Python で .h5 モデルを再インポートすると、問題なく動作します。
- RNN レイヤーのない小さな MNIST モデルを Tensorflow JS に変換するとシームレスに動作するため、TensorflowJS の構成ミスの問題ではなく、ここで GRU レイヤーが問題になっているようです?!
- モデルを Keras の h5 の代わりに TF SavedModel として保存すると、変換に失敗します
tensorflowjs_converter
- 代わりに
input_shape
to を修正すると、トレーニング インスタンスの長さが異なるため、トレーニングが不可能になります。input_shape=[ 61, max_id+1])
None
- tfjs でモデルを再実装し、重みをインポートするだけでは機能しません。tfjs にはファイルから個々の重みをロードする機能がないためです。
どんなアイデアにもとても感謝しています。
前もって感謝します!