将Keras模型加载到TensorFlow时的输入和输出Tensor名称

lo8azlld  于 2022-12-23  发布在  其他
关注(0)|答案(4)|浏览(272)

我尝试在“纯”TensorFlow中使用Keras的模型(我想在Android应用中使用它)。我已经成功地将Keras模型导出到protobuf并将其导入到Tensorflow。但是,运行Tensorflow模型需要提供输入和输出Tensor的名称,我不知道如何找到它们。

seq = Sequential()
seq.add(Convolution2D(32, 3, 3, input_shape=(3, 15, 15), name="Conv1"))
....
seq.add(Activation('softmax', name="Act4"))
seq.compile()

在TensorFlow中打印Tensor时,我可以找到:

Tensor("Conv1_W/initial_value:0", shape=(32, 3, 3, 3), dtype=float32)
Tensor("Conv1_W:0", dtype=float32_ref)
Tensor("Conv1_W/Assign:0", shape=(32, 3, 3, 3), dtype=float32_ref)
Tensor("Conv1_W/read:0", dtype=float32)

Tensor("Act4_sample_weights:0", dtype=float32)
Tensor("Act4_target:0", dtype=float32)

然而,不存在具有形状(3,15,15)的Tensor。
我已经看到here,我可以添加“my_input_tensor”作为输入,但我不知道它是哪种类型-我尝试了TensorFlow和Keras的占位符,他们给了我这个错误:

/XXXXXXXXX/lib/python2.7/site-packages/keras/engine/topology.pyc in __init__(self, input, output, name)
   1599             # check that x is an input tensor
   1600             layer, node_index, tensor_index = x._keras_history
-> 1601             if len(layer.inbound_nodes) > 1 or (layer.inbound_nodes and layer.inbound_nodes[0].inbound_layers):
   1602                 cls_name = self.__class__.__name__
   1603                 warnings.warn(cls_name + ' inputs must come from '

AttributeError: 'NoneType' object has no attribute 'inbound_nodes'
xe55xuns

xe55xuns1#

从TensorFlow 2.0 * 开始(不幸的是,他们似乎经常更改这一点)*,您可以使用以下命令将模型导出为SavedModel(在python中)

model.save('MODEL-FOLDER')

然后使用saved_model_cli工具检查模型(至少在anaconda的python文件夹<yourenv>/bin/saved_model_cli-* 中找到 *)

saved_model_cli show --dir /path/to/model/MODEL-FOLDER/ --tag_set serve --signature_def serving_default

输出将类似于

The given SavedModel SignatureDef contains the following input(s):
  inputs['graph_input'] tensor_info:
      dtype: DT_DOUBLE
      shape: (-1, 28, 28)
      name: serving_default_graph_input:0
The given SavedModel SignatureDef contains the following output(s):
  outputs['graph_output'] tensor_info:
      dtype: DT_FLOAT
      shape: (-1, 10)
      name: StatefulPartitionedCall:0
Method name is: tensorflow/serving/predict

通过检查输出,可以看到本例中输入和输出Tensor的名称分别为:提供默认图形输入状态分区调用
这就是你如何找到Tensor的名字。

  • 正确的方法 * 是使用SignatureDefs在模型上定义图形路径及其输出和输入Tensor。因此,您可以加载这些SignaturesDefs,而不必直接处理Tensor名称。

这是一个很好的参考,解释这比官方文档,海事组织:
https://sthalles.github.io/serving_tensorflow_models/

bvpmtnay

bvpmtnay2#

在Keras中调用model.summary()以查看所有图层。
输入Tensor通常称为input_1input_2等。请参阅摘要中的正确名称。
当你在Keras中使用input_shape=(3,15,15)时,你实际上是在使用形状为(None, 3, 15, 15)的Tensor。其中None将被训练或预测中的批量大小所取代。
通常,对于这些未知的维度,我们使用-1,比如(-1, 3, 15, 15),但我不能保证它能像这样工作,它对重塑Tensor非常有效,但对创建我从未测试过。

bvjveswy

bvjveswy3#

要获取Keras模型的输入和输出Tensor,请执行以下操作:

input_tensor = seq.inputs[0]
output_tensor = seq.outputs[0]
print("Inputs: "+str(input_tensor))
print("Outputs: "+str(output_tensor))

上面假设只有一个输入Tensor和一个输出Tensor,如果你有更多的Tensor,那么你必须使用适当的索引来得到这些Tensor。
请注意,层输出形状和Tensor输出形状是有区别的,两者通常是相同的,但并不总是相同的。

f2uvfpb9

f2uvfpb94#

您可以尝试按照其中一个答案中的建议在加载的模型对象上调用summary(),但是如果您在模型摘要中找不到输入和输出名称,请尝试按照以下方法在模型对象上调用input_namesoutput_names

from tensorflow.keras.models import load_model

model = load_model("./model/00001")

print(model.input_names)
print(model.output_names)

在TensorFlow版本上试用:2.3.1

相关问题