JS中的错误:
未捕获(承诺中)错误:输入 0 与层展平不兼容:预期 min_ndim=3,发现 ndim=2。
我从尝试在 keras/python 中导入预训练模型(如 VGG oder 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 层是这里的问题?!
- 将模型保存为 TF SavedModel 而不是 Keras 的 h5 无法转换为
tensorflowjs_converter
- 固定
input_shape
toinput_shape=[ 61, max_id+1])
而不是None
使训练变得不可能,因为训练实例的长度不同 - 在 tfjs 中重新实现模型并仅导入权重在这里不起作用,因为 tfjs 缺少从文件加载单个权重的功能
我非常感谢任何想法。
先感谢您!