0

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_shapeto を修正すると、トレーニング インスタンスの長さが異なるため、トレーニングが不可能になります。input_shape=[ 61, max_id+1])None
  • tfjs でモデルを再実装し、重みをインポートするだけでは機能しません。tfjs にはファイルから個々の重みをロードする機能がないためです。

どんなアイデアにもとても感謝しています。

前もって感謝します!

4

1 に答える 1

0

私は同じ問題に遭遇していました。行を削除すると:

keras.layers.Flatten(),

それは私のために働いた。

参照: https://github.com/tensorflow/tfjs/issues/2442#issuecomment-563319357

于 2020-04-14T10:27:04.193 に答える