【问题标题】:Tensorflow.js Error: Unknown layer: FunctionalTensorflow.js 错误:未知层:功能性
【发布时间】: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 中加载它并在浏览器中显示模型摘要

标签: tensorflow tensorflow.js


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    根据您已经编写的内容,我尝试使用顺序 API 而不是函数式 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 也应该可以工作。更多信息可能会找到here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多