如何使用 torch 从 caffe 模型中获取图层
How to get a layer from a caffe model using torch
在python中,当我想使用caffe从图层中获取数据时,我有以下代码
input_image = caffe.io.load_image(imgName)
input_oversampled = caffe.io.resize_image(input_image, self.net.crop_dims)
prediction = self.net.predict([input_image])
caffe_input = np.asarray(self.net.preprocess('data', prediction))
self.net.forward(data=caffe_input)
data = self.net.blobs['fc7'].data[4] // I want to get this value in lua
然而,当我使用手电筒时,我有点卡住了,因为我不知道如何执行相同的操作。
目前我有以下代码
require 'caffe'
require 'image'
net = caffe.Net('/opt/caffe/models/bvlc_reference_caffenet/deploy.prototxt', '/opt/caffe/models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')
img = image.lena()
dest = torch.Tensor(3, 227,227)
img = image.scale(dest, img)
img = img:resize(10,3,227,227)
output = net:forward(img:float())
conv_nodes = net:findModules('fc7') -- not working
任何帮助将不胜感激
首先请注意,由于 LuaJIT FFI,torch-caffe-binding(即您与 require 'caffe'
一起使用的工具)是 Caffe 库的直接包装器。
这意味着它允许您方便地使用 Torch 张量进行正向或反向操作,但是 behind the scenes 这些操作是在 caffe::Net
而不是在 Torch nn
网络上。
所以如果你想操纵一个普通的 Torch network what you should use is the loadcaffe library which fully converts the network into a nn.Sequential
:
require 'loadcaffe'
local net = loadcaffe.load('net.prototxt', 'net.caffemodel')
那你可以用findModules
. However please note that you cannot use their initial label anymore (like conv1
or fc7
) as they are discarded after convert.
这里fc7
(=INNER_PRODUCT
)对应N-1次线性变换。所以你可以这样得到它:
local nodes = net:findModules('nn.Linear')
local fc7 = nodes[#nodes-1]
然后您可以通过 fc7.weight
和 fc7.bias
读取数据(权重和偏差)——这些是常规的 torch.Tensor
-s。
更新
截至提交 2516fac loadcaffe 现在另外保存图层名称。因此,要检索 'fc7'
图层,您现在可以执行以下操作:
local fc7
for _,m in pairs(net:listModules()) do
if m.name == 'fc7' then
fc7 = m
break
end
end
在python中,当我想使用caffe从图层中获取数据时,我有以下代码
input_image = caffe.io.load_image(imgName)
input_oversampled = caffe.io.resize_image(input_image, self.net.crop_dims)
prediction = self.net.predict([input_image])
caffe_input = np.asarray(self.net.preprocess('data', prediction))
self.net.forward(data=caffe_input)
data = self.net.blobs['fc7'].data[4] // I want to get this value in lua
然而,当我使用手电筒时,我有点卡住了,因为我不知道如何执行相同的操作。 目前我有以下代码
require 'caffe'
require 'image'
net = caffe.Net('/opt/caffe/models/bvlc_reference_caffenet/deploy.prototxt', '/opt/caffe/models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')
img = image.lena()
dest = torch.Tensor(3, 227,227)
img = image.scale(dest, img)
img = img:resize(10,3,227,227)
output = net:forward(img:float())
conv_nodes = net:findModules('fc7') -- not working
任何帮助将不胜感激
首先请注意,由于 LuaJIT FFI,torch-caffe-binding(即您与 require 'caffe'
一起使用的工具)是 Caffe 库的直接包装器。
这意味着它允许您方便地使用 Torch 张量进行正向或反向操作,但是 behind the scenes 这些操作是在 caffe::Net
而不是在 Torch nn
网络上。
所以如果你想操纵一个普通的 Torch network what you should use is the loadcaffe library which fully converts the network into a nn.Sequential
:
require 'loadcaffe'
local net = loadcaffe.load('net.prototxt', 'net.caffemodel')
那你可以用findModules
. However please note that you cannot use their initial label anymore (like conv1
or fc7
) as they are discarded after convert.
这里fc7
(=INNER_PRODUCT
)对应N-1次线性变换。所以你可以这样得到它:
local nodes = net:findModules('nn.Linear')
local fc7 = nodes[#nodes-1]
然后您可以通过 fc7.weight
和 fc7.bias
读取数据(权重和偏差)——这些是常规的 torch.Tensor
-s。
更新
截至提交 2516fac loadcaffe 现在另外保存图层名称。因此,要检索 'fc7'
图层,您现在可以执行以下操作:
local fc7
for _,m in pairs(net:listModules()) do
if m.name == 'fc7' then
fc7 = m
break
end
end