我尝试在“纯”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'
4条答案
按热度按时间xe55xuns1#
从TensorFlow 2.0 * 开始(不幸的是,他们似乎经常更改这一点)*,您可以使用以下命令将模型导出为
SavedModel
(在python中)然后使用saved_model_cli工具检查模型(至少在anaconda的python文件夹
<yourenv>/bin/saved_model_cli
-* 中找到 *)输出将类似于
通过检查输出,可以看到本例中输入和输出Tensor的名称分别为:提供默认图形输入和状态分区调用
这就是你如何找到Tensor的名字。
这是一个很好的参考,解释这比官方文档,海事组织:
https://sthalles.github.io/serving_tensorflow_models/
bvpmtnay2#
在Keras中调用
model.summary()
以查看所有图层。输入Tensor通常称为
input_1
、input_2
等。请参阅摘要中的正确名称。当你在Keras中使用
input_shape=(3,15,15)
时,你实际上是在使用形状为(None, 3, 15, 15)
的Tensor。其中None将被训练或预测中的批量大小所取代。通常,对于这些未知的维度,我们使用
-1
,比如(-1, 3, 15, 15)
,但我不能保证它能像这样工作,它对重塑Tensor非常有效,但对创建我从未测试过。bvjveswy3#
要获取Keras模型的输入和输出Tensor,请执行以下操作:
上面假设只有一个输入Tensor和一个输出Tensor,如果你有更多的Tensor,那么你必须使用适当的索引来得到这些Tensor。
请注意,层输出形状和Tensor输出形状是有区别的,两者通常是相同的,但并不总是相同的。
f2uvfpb94#
您可以尝试按照其中一个答案中的建议在加载的模型对象上调用
summary()
,但是如果您在模型摘要中找不到输入和输出名称,请尝试按照以下方法在模型对象上调用input_names
和output_names
:在TensorFlow版本上试用:
2.3.1