如何获取用于iOS示例应用程序的图层名称? (Tensorflow)
我对Tensorflow非常陌生,我正在尝试使用inception v3网络来训练iPhone应用程序中使用的东西。我设法我的图形导出为protocolbuffer文件,手动删除差节点(正确的,我希望如此),并放置在.pb文件在我的iOS项目,但现在我收到以下错误:如何获取用于iOS示例应用程序的图层名称? (Tensorflow)
Running model failed:Not found: FeedInputs: unable to find feed output input
这似乎表明我的input_layer_name
和output_layer_name
变量在iOS应用程序中配置错误。
我在各个地方看到,它应该分别为Mul
和softmax
,对于初始版本v3,但这些值对我不起作用。
我的问题是:什么是一层(关于这个上下文),以及如何找出我的是什么?
This是我训练的模型的确切定义,但我没有看到“Mul”或“softmax”出现。
This是我已经能够了解图层,但它似乎是一个不同的概念,因为“Mul”不在该列表中。
我担心这可能是this question重复,但“层”不解释(他们是张量?)和graph.get_operations()
似乎被弃用,或者也许我用错了。
由于MohamedEzz写道Tensorflow图中没有图层。只有可以放在同一名称范围内的操作。
通常位于相同范围内的单层操作和知道名称范围概念的应用程序可以显示它们的分组。
这样的应用之一是Tensorboard。我相信使用Tensorboard是找到节点名称的最简单方法。
考虑下面的例子:
import tensorflow as tf
import tensorflow.contrib.slim.nets as nets
input_placeholder = tf.placeholder(tf.float32, shape=(None, 224, 224, 3))
network = nets.inception.inception_v3(input_placeholder)
writer = tf.summary.FileWriter('.', tf.get_default_graph())
writer.close()
它创建用于将输入数据的占位符,然后创建启v3网络和在当前目录中保存事件的数据(与图)。
在同一目录下启动Tensorflow可以查看图形结构。
tensorboard --logdir .
Tensorboard打印UI URL到控制台
Starting TensorBoard 41 on port 6006
(You can navigate to http://192.168.128.73:6006)
找到您感兴趣的节点并选择它以查找其名称(位于左上信息窗格中)。
请注意,通常你不需要节点名称,但张名。在大多数情况下,将节点名称添加:0
即可获得张量名称。
例如运行上面使用的名称创建从图中使用下面的代码(上面的代码的延续)成立之初v3网络:
import numpy as np
data = np.random.randn(1, 224, 224, 3) # just random data
session = tf.InteractiveSession()
session.run(tf.global_variables_initializer())
result = session.run('InceptionV3/Predictions/Softmax:0', feed_dict={'Placeholder:0': data})
# result.shape = (1, 1000)
在tensorflow的核心,有ops(运算)和tensors(n维数组)。每个运算都需要张量并给出张量。图层只是代表神经网络层的许多操作的便利包装。
例如卷积层由主要3 OPS:
- conv2d运算:这是在输入张量滑动的内核并执行内核和底层输入窗口之间逐元素乘法。
- bias_add OP:添加偏压到出来的conv2d运算
- 激活OP的张量:施加激活函数逐元素到bias_add运算
的输出张量要运行tensorflow模型,你提供饲料(输入)和提取(所需的输出)。这些是张量或张量名称。
从这行代码Inception_model看来,您需要的是一个名为'predictions'
的张量,它具有n_class
输出概率。
你观察到的(softmax
)是生产的predictions
张
至于输入张名运算的类型,inception_model.py
码不显示输入张量的名字,因为它是一个函数参数。所以这取决于你给这个输入张量的名字。
当您创建图层或添加变量的参数调用名
with tf.name_scope("output"):
W2 = tf.Variable(tf.truncated_normal([num_filters, num_classes], stddev=0.1), name="W2")
b2 = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b2")
scores = tf.nn.xw_plus_b(h_pool_flat, W2, b2, name="scores")
pred_y = tf.nn.softmax(scores,name="pred_y")
在这种情况下,我可以通过使用“输出/ pred_y”访问的最终预测值。如果你没有name_scope,你可以用“pred_y”去值
conv = tf.nn.conv1d(word_embeddedings,
W1,
stride=stride_size,
padding="VALID",
name="conv") #will have dimensions [batch_size,out_width,num_filters] out_width is a function of max_words,filter_size and stride_size
# Apply nonlinearity
h = tf.nn.relu(tf.nn.bias_add(conv, b1), name="relu")
我叫层“转化”,并在接下来的层中使用它。粘贴你的片段就像我在这里做的
我不知道我有问题在我的情况下访问输出,我认为应用程序找不到名为“input”的FeedInput。我为我的第一个Conv2d操作添加了一个'name'参数,并将其命名为“image_input”,并在应用中将'input_layer_name'变量命名为匹配,但仍无法找到它。 –
你可以粘贴这段代码吗?我正在编辑包含conv层的答案 – LGG
这实际上只是在ios_camera示例应用程序中,但我实际上已经掌握了它的工作。我一直在寻找的答案是多方面的:应用程序正在寻找占位符张量的名称,它正在寻找完整名称,我通过循环遍历图中的每个节点并打印每个名称找到了全名。全名最终成为了tower_0/image_input:0(当然,我在第一个位置创建了占位符Tensor之后)。我不能相信它已经不存在或者没有在Inception模型中命名,这使初学者很难扩展。 –
这是最全面的答案,并涵盖了宝贵的观点。我没有使用Tensorboard,而是循环打印出图表中的每个节点,找到名称,最终得到的结果与您在最后的推理代码中提供的内容类似。你的回答也突出了占位节点的重要性,这些节点在github上的Inception v3模型中似乎不存在,所以我添加了我自己的并将其传入。我将把你的答案作为接受的答案。非常感谢您的帮助! –