2015-01-27 2 views
2

В Python, когда я хочу, чтобы получить данные из слоя с помощью Caffe я следующий кодКак получить слой из модели 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 

Hoever, когда я использую факел Я немного застрял, так как я не знаю, как выполнить одно и то же действие. В настоящее время у меня есть следующий код

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 

Любая помощь будет оценен

ответ

11

Прежде всего обратите внимание, что torch-caffe-binding (то есть инструмент, используемый с require 'caffe') является прямой оберткой Caffe библиотеки благодаря LuaJIT FFI ,

Это означает, что позволяет удобно делать вперед или назад с тензором факелом, ноbehind the scenes эти операции производятся на caffe::Net и не в сети Факел nn.

Так что, если вы хотите, чтобы манипулировать простой Torch network, что вы должны использовать это loadcaffe библиотека, которая полностью преобразует сеть в nn.Sequential:

require 'loadcaffe' 

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

Затем вы можете использовать findModules. Однако учтите, что вы больше не можете использовать свою начальную метку (например, conv1 или fc7), так как они 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.


UPDATE

По фиксации 2516fac loadcaffe теперь сохраняет имена слоев в дополнение. Таким образом, чтобы получить 'fc7' слой теперь вы можете сделать что-то вроде:

local fc7 
for _,m in pairs(net:listModules()) do 
    if m.name == 'fc7' then 
    fc7 = m 
    break 
    end 
end 
+0

Я использовал факел-кофейная связывания, потому что я не смог использовать loadcaffe. Я получаю «цикл или предыдущий модуль загрузки ошибок» loadcaffe' – Alexis

+0

факельная привязка не позволит вам (до сих пор) читать данные слоя из Lua (в основном все, что вы можете сделать, это вперед/назад от теней факела). Так что вам действительно нужно loadcaffe! – deltheil

+0

Хорошо, спасибо. Я попробую еще раз установить loadcaffe. – Alexis

Смежные вопросы