Tensorflow.js错误:未知层:函数



我正在使用tf.loadLayersModel()加载一个简单的Tensorflow.js模型,但该模型尚未构建。我正在使用Functional API来构建模型,但仅由密集层组成。Lambda层似乎也出现了类似的错误,但我只使用了2个密集层,Tf.js中支持功能层

完全错误:

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 Storage的下载URL(,我不相信IOHandler(http(能够完美解析weightPathPrefix。我不确定这是问题,甚至的问题,但如果它不正确,可能会产生问题,我不知道如何检查它的计算值。

版本:

JS:  Tensorflow.js : 2.0.1
Py:  Tensorflowjs  : 2.0.1.post1
Py:  Keras         : 2.4.3

更新日期:7/29/20

问题似乎在于模型权重的解析(请参见注释(。我之前在GitHub上添加了这个关于tf.loadLayersModel()函数的例子,其中包含了很多关于尝试解决方案的细节。

Python tensorflow使用Functional作为函数模型的类名,但tfjs在内部使用不同的名称。

尝试将model.json中的modelTopology.model_config.class_name更改为Model

根据您已经写的内容,我尝试使用顺序而非功能的API编写模型:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import tensorflowjs as tfjs
# create sequential model
model = keras.Sequential(
[
layers.Dense(2, activation="relu", name="layer1"),
layers.Dense(3, activation="relu", name="layer2"),
layers.Dense(4, name="layer3"),
]
)
# Call model on a test input
KEY = 'sampleid'
MDL = 'mymodel'
model.compile(loss='mse',metrics='accuracy')
tfjs.converters.save_keras_model(model, MDL)

将文件加载为:

model = await tf.loadLayersModel('./mymodel/model.json');
model.summary();

当时似乎在起作用。但我同意,功能性的API也应该起作用。更多信息可以在这里找到。

最新更新