TensorFlow,如何查看内部 'blob',通过 CNN 的响应
TensorFlow, how to look inside 'blob', the response in through CNN
我目前正在使用来自 https://github.com/AKSHAYUBHAT/TensorFace 的 VGG-face-discriptor。
VGG-face-discriptor 使用 VGG16 和输出向量 2622,class 个名人。
我真正需要的是倒数第二个全连接层的响应,它的大小是 4096。
使用我上面提到的存储库提供的代码
import vggface
from pprint import pprint
import tensorflow as tf
input_placeholder = tf.placeholder(tf.float32, shape=(1, 224, 224, 3))
network = vggface.VGGFace()
ses = tf.InteractiveSession()
network.load(ses,input_placeholder)
output = network.eval(feed_dict={input_placeholder:vggface.load_image('test/ak.png')})[0]
pprint(sorted([(v,network.names[k]) for k,v in enumerate(output)],reverse=True)[:10])
效果很好,给我最接近的名人脸结果。
结果:
[(13.686731, 'Aamir_Khan'),
(8.4711819, 'Adam_Driver'),
(8.0207777, 'Manish_Dayal'),
(7.2776313, 'John_Abraham'),
(6.8999376, 'Jacob_Artist'),
(6.5390964, 'Adam_Copeland'),
(6.4980922, 'Adrian_Paul'),
(6.4170547, 'Akshay_Kumar'),
(6.3718734, 'D.B._Woodside'),
(6.0774565, 'Ajay_Devgn')]
查看 output
变量,我看到 2622 numpy ndarry。
但我实际上想要倒数第二个特征向量。我该如何实现?
我查看了所有 TensorFlow 教程代码,但找不到这样的代码。
使用 Caffe,我只需
out = net.forward()
v = net.blobs['fc7'].data[0].copy()
就是这么简单。如何在TensorFlow中看穿'blob'?
使用 numpy 数组特征向量?
哦..我想我找到了解决办法。
只是删除 TensorFace/vggface/init.py
中的一些行
# (37): nn.ReLU
# (38): nn.Dropout(0.500000)
# (39): nn.Linear(4096 -> 2622)
#self.layers.append(('linear','39',2622,False))
# (40): nn.SoftMax
#self.layers.append(('softmax'))
看起来不错
您可以使用 session.run 获取计算图中元素的当前值。
layer7_values = session.run(layer7_tf, feed_dict={<your inputs>})
在此示例中,session
是一个 tf.Session()
对象。 layer7_tf
是对 TensorFlow 模型中层的 Tensor
输出的引用,layer7_values
将包含给定输入的层值作为 numpy 数组。
要获取 layer7_tf
的句柄,您有两种选择。您可以将 TensorFace/vggface/init.py
修改为 return 对适当图层的引用;或者您可以探索 session.graph_def
结构以找到对应于该张量的节点的 name
,并传递张量的字符串名称(例如 layer7_tf/foo/bar:0
,其中 :0
对应于名为 layer7_tf/foo/bar
) 的操作的第 0 个输出改为 session.run()
。
我目前正在使用来自 https://github.com/AKSHAYUBHAT/TensorFace 的 VGG-face-discriptor。
VGG-face-discriptor 使用 VGG16 和输出向量 2622,class 个名人。 我真正需要的是倒数第二个全连接层的响应,它的大小是 4096。 使用我上面提到的存储库提供的代码
import vggface
from pprint import pprint
import tensorflow as tf
input_placeholder = tf.placeholder(tf.float32, shape=(1, 224, 224, 3))
network = vggface.VGGFace()
ses = tf.InteractiveSession()
network.load(ses,input_placeholder)
output = network.eval(feed_dict={input_placeholder:vggface.load_image('test/ak.png')})[0]
pprint(sorted([(v,network.names[k]) for k,v in enumerate(output)],reverse=True)[:10])
效果很好,给我最接近的名人脸结果。
结果:
[(13.686731, 'Aamir_Khan'),
(8.4711819, 'Adam_Driver'),
(8.0207777, 'Manish_Dayal'),
(7.2776313, 'John_Abraham'),
(6.8999376, 'Jacob_Artist'),
(6.5390964, 'Adam_Copeland'),
(6.4980922, 'Adrian_Paul'),
(6.4170547, 'Akshay_Kumar'),
(6.3718734, 'D.B._Woodside'),
(6.0774565, 'Ajay_Devgn')]
查看 output
变量,我看到 2622 numpy ndarry。
但我实际上想要倒数第二个特征向量。我该如何实现?
我查看了所有 TensorFlow 教程代码,但找不到这样的代码。 使用 Caffe,我只需
out = net.forward()
v = net.blobs['fc7'].data[0].copy()
就是这么简单。如何在TensorFlow中看穿'blob'? 使用 numpy 数组特征向量?
哦..我想我找到了解决办法。
只是删除 TensorFace/vggface/init.py
中的一些行# (37): nn.ReLU
# (38): nn.Dropout(0.500000)
# (39): nn.Linear(4096 -> 2622)
#self.layers.append(('linear','39',2622,False))
# (40): nn.SoftMax
#self.layers.append(('softmax'))
看起来不错
您可以使用 session.run 获取计算图中元素的当前值。
layer7_values = session.run(layer7_tf, feed_dict={<your inputs>})
在此示例中,session
是一个 tf.Session()
对象。 layer7_tf
是对 TensorFlow 模型中层的 Tensor
输出的引用,layer7_values
将包含给定输入的层值作为 numpy 数组。
要获取 layer7_tf
的句柄,您有两种选择。您可以将 TensorFace/vggface/init.py
修改为 return 对适当图层的引用;或者您可以探索 session.graph_def
结构以找到对应于该张量的节点的 name
,并传递张量的字符串名称(例如 layer7_tf/foo/bar:0
,其中 :0
对应于名为 layer7_tf/foo/bar
) 的操作的第 0 个输出改为 session.run()
。