我正在努力弄清楚如何正确保存已保存为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"}]}]
我在做什么错了?
答案 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