tfjs转换器针对saved_model的问题-未保存权重且weights_manifest.json仅具有输出节点

时间:2019-02-23 06:45:57

标签: tensorflow tensorflow.js

我正在努力弄清楚如何正确保存已保存为save_model方法的tensorflow模型并将其转换为tensorflow.js。当我当前对其进行转换时,它的结尾为weights_manifest.json,仅包含一组权重。

我要转换的模型来自这个jupyter笔记本。RNN for Human Activity Recognition - 2D Pose Input

在该jupyter笔记本中可以找到用于构建和训练图形的完整代码。

我可以成功运行代码:

save_path = "/content/gdrive/My Drive/saved_model/"

tf.saved_model.simple_save(sess,
  save_path,
  inputs={"x":x},
  outputs={"y": y})

通过查看图形构建代码,我不能完全确定output_node_names命令中的tensorflowjs_converter应该是什么,因为当我放入y时会收到一个错误,即节点不存在。我打印了所有图节点,并猜测它是mul_1/y,因为这是图构建代码中的内容:

def LSTM_RNN(_X, _weights, _biases):
    # model architecture based on "guillaume-chevalier" and "aymericdamien" under the MIT license.

    _X = tf.transpose(_X, [1, 0, 2])  # permute n_steps and batch_size
    # rest of graph building code left out for this post
    # Linear activation
    return tf.matmul(lstm_last_output, _weights['out']) + _biases['out']

当我运行命令时:

!tensorflowjs_converter \
    --input_format=tf_saved_model \
    --output_node_names="mul_1/y" \
    --saved_model_tags=serve \
    /content/gdrive/My\ Drive/saved_model/ \
    /content/gdrive/My\ Drive/web_model/

此消息成功:

  

使用TensorFlow后端。 2019-02-23 01:46:53.475557:我   tensorflow / core / platform / cpu_feature_guard.cc:141]您的CPU支持   TensorFlow二进制文件未编译使用的指令:AVX2   FMA写入重量文件/ content / gdrive / My   Drive / web_model / tensorflowjs_model.pb ...

但是,tensorflowjs_model.pb文件只有50个字节,weights_manifest.json中包含的全部内容是:

[{"paths": ["group1-shard1of1"], "weights": [{"name": "mul_1/y", "shape": [], "dtype": "int32"}]}]

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

output_node_names是您要返回的节点的名称。您可以为张量流操作命名,该名称将用作output_name

return tf.add(tf.matmul(lstm_last_output, _weights['out']), _biases['out'] , name="y")

然后,您可以在转换器中使用--output_node_names="y"

最后在js中执行代码

const model = await tf.loadFrozenModel(MODEL_URL, WEIGHTS_URL);

// define a tensor t
const y = model.execute({
    "x": t // x input_name of the tensorflow graph
  });
// it will return the output node y value