【发布时间】:2020-11-18 11:13:58
【问题描述】:
我正在使用 tf.loadLayersModel() 加载一个简单的 Tensorflow.js 模型,但该模型没有构建。我正在使用功能 API 来构建模型,但仅包含密集层。与 Lambda 层类似的错误 seems to arise,但我在 Tf.js 中只使用了 2 个密集层和功能层 are supported。
完全错误:
Error: Unknown layer: Functional. This may be due to one of the following reasons:
1. The layer is defined in Python, in which case it needs to be ported to TensorFlow.js or your JavaScript code.
2. The custom layer is defined in JavaScript, but is not registered properly with tf.serialization.registerClass()
触发它的JS代码:
const http = tf.io.http
tf.loadLayersModel(http(url)).then((model) => {
console.log('Loaded model.')
console.log(model)
})
url 提取的内容(又名model.json 文件)
{"format": "layers-model", "generatedBy": "keras v2.4.0", "convertedBy": "TensorFlow.js Converter v2.0.1.post1", "modelTopology": {"keras_version": "2.4.0", "backend": "tensorflow", "model_config": {"class_name": "Functional", "config": {"name": "my_model", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": [null, 10], "dtype": "float32", "sparse": false, "ragged": false, "name": "input_1"}, "name": "input_1", "inbound_nodes": []}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 20, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "dense", "inbound_nodes": [[["input_1", 0, 0, {}]]]}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 20, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "dense_1", "inbound_nodes": [[["dense", 0, 0, {}]]]}, {"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 10, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "dense_2", "inbound_nodes": [[["dense_1", 0, 0, {}]]]}], "input_layers": [["input_1", 0, 0]], "output_layers": [["dense_2", 0, 0]]}}, "training_config": {"loss": "mse", "metrics": "accuracy", "weighted_metrics": null, "loss_weights": null, "optimizer_config": {"class_name": "RMSprop", "config": {"name": "RMSprop", "learning_rate": 0.001, "decay": 0.0, "rho": 0.9, "momentum": 0.0, "epsilon": 1e-07, "centered": false}}}}, "weightsManifest": [{"paths": ["group1-shard1of1.bin"], "weights": [{"name": "dense/kernel", "shape": [10, 20], "dtype": "float32"}, {"name": "dense/bias", "shape": [20], "dtype": "float32"}, {"name": "dense_1/kernel", "shape": [20, 20], "dtype": "float32"}, {"name": "dense_1/bias", "shape": [20], "dtype": "float32"}, {"name": "dense_2/kernel", "shape": [20, 10], "dtype": "float32"}, {"name": "dense_2/bias", "shape": [10], "dtype": "float32"}]}]}
想要复制模型?这是python代码:
import keras
import keras.layers as layers
import tensorflowjs as tfjs
inputs = keras.Input(shape=(10,))
dense = layers.Dense(20, activation="relu")
x = dense(inputs)
x = layers.Dense(20, activation="relu")(x)
outputs = layers.Dense(10)(x)
# Create the model
model = keras.Model(inputs=inputs, outputs=outputs, name="my_model")
KEY = 'sampleid'
MDL = 'mymodel'
model.compile(loss='mse',metrics='accuracy')
tfjs.converters.save_keras_model(model, MDL)
注意:
URL 有点冗长(它是 Firebase 存储下载 URL),我不相信 IOHandler (http) 可以完美解析 weightPathPrefix。我不确定这是 the 问题,甚至 an 问题,但如果它不正确并且我不知道如何检查它的计算值,它可能会产生问题。
版本:
JS: Tensorflow.js : 2.0.1
Py: Tensorflowjs : 2.0.1.post1
Py: Keras : 2.4.3
2020 年 7 月 29 日更新:
问题似乎在于模型权重的解析(见注)。我在前面的 GitHub ticket 中添加了这个示例,该示例是关于 tf.loadLayersModel() 函数的,其中包含许多有关尝试解决方案的详细信息。
【问题讨论】:
-
你用的是什么版本的tensorflow?
-
2.0.1 @edkeveked
-
我能够转换和加载您的模型。我使用的是 tf.tensorflow 包而不是 keras。这是我的导入:
import tensorflow.keras as keras import tensorflow.keras.layers as layers -
@edkeveked 我也可以从 Python 的
tfjs使用tfjs.converters.load_keras_model(),但不是 Tensorflow.js 的loadLayersModel(),这是我希望在其中进行预测的环境跨度> -
我在 Javascript 中加载它并在浏览器中显示模型摘要