2016-04-07 2 views
4

Я использую PyCaffe для реализации нейронной сети, созданной сетью VGG 16. Я хочу использовать предварительно подготовленную модель, доступную из их GitHub page. Как правило, это работает путем сопоставления имен слоев.Ошибка несоответствия формы кофе с использованием предварительно обработанной модели VGG-16

Для моего "fc6" слоя у меня есть следующее определение в моем файле train.prototxt:

layer { 
    name: "fc6" 
    type: "InnerProduct" 
    bottom: "pool5" 
    top: "fc6" 
    inner_product_param { 
    num_output: 4096 
    } 
} 

Here является файл prototxt для развертывания архитектуры VGG-16. Обратите внимание, что "fc6" в их прототекс идентичен моей (за исключением скорости обучения, но это не имеет значения). Также стоит отметить, что в моей модели все входы одинакового размера: 3-канальные изображения 224x224px.

Я следовал this tutorial довольно тесно, и блок кода, который дает мне вопрос заключается в следующем:

solver = caffe.SGDSolver(osp.join(model_root, 'solver.prototxt')) 
solver.net.copy_from(model_root + 'VGG_ILSVRC_16_layers.caffemodel') 
solver.test_nets[0].share_with(solver.net) 
solver.step(1) 

Первая строка загружает мой решатель prototxt, а затем вторая копия строки веса от предварительно обученная модель (VGG_ILSVRC_16_layers.caffemodel). При запуске решателя, я получаю эту ошибку:

Cannot copy param 0 weights from layer 'fc6'; shape mismatch. Source param 
shape is 1 1 4096 25088 (102760448); target param shape is 4096 32768 (134217728). 
To learn this layer's parameters from scratch rather than copying from a saved 
net, rename the layer. 

Суть ее в том, что их модель предполагает, что слой будет размером 1x1x4096 в то время как у меня это просто 4096. Но я не понимаю, как я могу изменить это ?

Я нашел this answer в группе пользователей Google, которая поручила мне сделать чистую операцию, чтобы переделать предварительно подготовленную модель перед копированием, но для этого мне нужны файлы lmdb из слоев данных исходной архитектуры, t (он вызывает ошибку, когда я пытаюсь запустить сценарий чистой операции).

+2

У вас нет проблем с выходным размером '4096', но с входным размером: у вас есть вход с 25088 тусклым, в то время как VGG ожидает ввода dim 32768. вы что-то изменили вдоль слоев conv, которые изменили особенность размер. – Shai

ответ

6

Проблема не в 4096, а в 25088. Вам необходимо рассчитать выходные характеристики карт для каждого уровня вашей сети на основе карт входных функций. Обратите внимание, что слой fc принимает вход фиксированного размера, поэтому выход предыдущего слоя conv должен соответствовать размеру ввода, требуемому уровнем fc. Вычислите свой размер карты ввода fc6 (это карта выходных характеристик предыдущего слоя conv), используя размер карты входных параметров предыдущего слоя conv. Вот формула:

H_out = (H_in + 2 x Padding_Height - Kernel_Height)/Stride_Height + 1 
W_out = (W_in + 2 x Padding_Width - Kernel_Width)/Stride_Width + 1 
0

Эта ошибка появляется, если вы кадрирование изображения до 224, а не 227, что было сделано с оригинальным набором данных. Отрегулируйте это, и вам должно быть хорошо идти.