jer*_*sel 6 machine-learning keras tensorflow
我正在尝试在“纯”TensorFlow 中使用 Keras 模型(我想在 Android 应用程序中使用它)。我已成功将 Keras 模型导出到 protobuf 并将其导入到 Tensorflow。然而,运行张量流模型需要提供输入和输出张量的名称,我不知道如何找到它们。我的模型如下所示:
seq = Sequential()
seq.add(Convolution2D(32, 3, 3, input_shape=(3, 15, 15), name="Conv1"))
....
seq.add(Activation('softmax', name="Act4"))
seq.compile()
Run Code Online (Sandbox Code Playgroud)
当我在 TensorFlow 中打印张量时,我可以发现:
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)
Run Code Online (Sandbox Code Playgroud)
然而,不存在形状为 (3,15,15) 的张量。
我在这里看到我可以添加“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'
Run Code Online (Sandbox Code Playgroud)
从 TensorFlow 2.0 开始(不幸的是,它们似乎经常改变),您可以使用以下命令将模型导出为SavedModelpython 格式:
model.save('MODEL-FOLDER')
Run Code Online (Sandbox Code Playgroud)
然后使用save_model_cli工具检查模型(在 python 文件夹中找到<yourenv>/bin/saved_model_cli-至少在 anaconda 中)
saved_model_cli show --dir /path/to/model/MODEL-FOLDER/ --tag_set serve --signature_def serving_default
Run Code Online (Sandbox Code Playgroud)
输出将类似于
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
Run Code Online (Sandbox Code Playgroud)
通过检查输出,您可以看到本例中输入和输出张量的名称分别为:serving_default_graph_input和StatefulPartitionedCall
这就是查找张量名称的方法。
不过,正确的方法是使用SignatureDefs在模型上定义图形路径及其输出和输入张量。因此,您可以加载这些SignaturesDef,而不必直接处理张量名称。
这是一个很好的参考,比官方文档更好地解释了这一点,我认为:
https://sthalles.github.io/serving_tensorflow_models/
在 Keras 中调用 amodel.summary()来查看所有层。
输入张量通常被称为input_1、input_2等。请在摘要中查看正确的名称。
当您input_shape=(3,15,15)在 Keras 中使用时,您实际上使用的是形状为 的张量(None, 3, 15, 15)。其中 None 将被训练或预测中的批量大小替换。
通常,对于这些未知的维度,您可以使用-1,例如在 中(-1, 3, 15, 15)。但我不能向你保证它会像这样工作。它非常适合重塑张量,但对于创建我从未测试过。
| 归档时间: |
|
| 查看次数: |
12021 次 |
| 最近记录: |