使用matconvnet进行迁移学习(fine-tuning)的简单思路
matconvnet中用一般用init函数来生成一个struct结构体来定义网络
参考作者给的轮子cnn_cifar_init.m中最后两层
% Block 5
net.layers{end+1} = struct('type', 'conv', 'weights', {{0.05*randn(1,1,64,10, 'single'), zeros(1,10,'single')}},'learningRate', .1*lr, 'stride', 1, 'pad', 0) ;
% Loss layer
net.layers{end+1} = struct('type', 'softmaxloss') ;
可以看出是一个输入64,卷积核1*1(保持不变),输出10(代表10类)的全连接层,再接一个softmax
那么想匹配自己的数据的话,只需改动倒数第二层的输出就行了
即读取pre-train的网络后,手动删除结构体的最后两层,再加上自己修改的全连接层,和softmax便可
net.layers = net.layers(1:end-2);
net.layers{end+1} = struct('type', 'conv', 'weights',{{0.005*randn(1,1,64,5, 'single'), zeros(1,5,'single')}}, 'learningRate',.1*lr ,'stride', 1, 'pad', 0) ;
net.layers{end+1} = struct('type', 'softmaxloss') ;