任务是获取预训练的CNN Inception v3模型的每层输出。例如,我将一张图片输入到这个网络中,我不仅想得到它的输出,还想得到每一层的输出(按层)。
为了做到这一点,我必须知道每一层输出的名称。对于最后一层和倒数第二层来说,这很容易做到:
sess.graph.get_tensor_by_name('pool_3:0')sess.graph.get_tensor_by_name('softmax:0')
(名称pool_3:0和softmax:0在与模型相关的源代码中列出)
但如果我想获取的不仅仅是最后一层和倒数第二层的输出,还有倒数第三层、倒数第四层等,获取这个模型任何一层的输出呢?
那么我就必须知道层的名称。Stack Overflow上已经问过类似的问题,但只有倒数第二层和最后一层的名称,这些名称在源代码的注释中也可以找到(’pool_3:0′, ‘softmax:0’)
获取名称的明显方法是绘制模型的图。但情况并非如此,因为图形绘制工具简单地崩溃了。还有一个相关问题。
我也尝试过:
- 打印所有图节点名称,并仅使用节点名称的信息构建图。但节点名称相当神秘。此外,由于Inception v3架构,节点之间的连接并不那么明显。因此,如果不知道节点之间的连接,这种方法就像破解恩尼格玛密码一样困难 🙂
- 然后我尝试使用自己编写的工具绘制这个模型的图(获取给定节点的所有输入(例如,’pool_3:0’),然后获取’pool_3:0’的所有输入的每个输入,等等。这个方法对简单的模型有效。但当我尝试在图像识别教程中的Inception v3实现上使用它时,我的RAM使用了16 GB,然后是10 GB的交换空间,然后我就不再深入探究了。可能是图中有循环(但如果网络是前馈的,怎么会这样呢?)
所以,可能参与这个预训练模型实现和“发布”的人正在阅读Stack Overflow。
或者可能有人已经获得了这个模型的按层名称。请与我和机器学习社区分享。提前感谢!
回答:
基础问题已经在TensorFlow中图中的张量名称列表中被问过(并回答过)。
关于你方法(2)的担忧,我的回答是:这是有效的(我已经做过)。如果我不得不猜测,你可能没有使用类似字典的结构来存储节点,所以如果多个节点从同一个节点获取输入(在Inception模型中经常发生),你会将该输入节点多次插入到你的存储/访问列表中。如果你注意只访问每个节点一次,那应该会立即运行而不会出现内存问题。