2

在 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

任何帮助,将不胜感激

4

1 回答 1

11

首先请注意,由于 LuaJIT FFI , torch-caffe-binding(即您使用的工具)是 Caffe 库的直接包装器。require 'caffe'

这意味着它允许您使用 Torch 张量方便地进行前向或后向操作, 在幕后这些操作是在一个caffe::Net而不是在 Torchnn网络上进行的。

因此,如果你想操作一个普通的Torch 网络,你应该使用loadcaffe库,它将网络完全转换为nn.Sequential

require 'loadcaffe'

local net = loadcaffe.load('net.prototxt', 'net.caffemodel')

然后你可以使用findModules. 但是请注意,您不能再使用它们的初始标签(如conv1or fc7),因为它们在 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
于 2015-01-28T09:51:23.283 回答