在MatConvNet框架下训练好的深度学习模型(Model)经:
net = cnn_imagenet_deploy(net) ;
得到的net是去掉Loss层,Dropout层与BN层的。下面是cnn_imagenet_deploy函数的部分源码:
isDag = isa(net, 'dagnn.DagNN') ;
if isDag
dagRemoveLayersOfType(net, 'dagnn.Loss') ;
dagRemoveLayersOfType(net, 'dagnn.DropOut') ;
else
net = simpleRemoveLayersOfType(net, 'softmaxloss') ;
net = simpleRemoveLayersOfType(net, 'dropout') ;
end
if isDag
net.addLayer('prob', dagnn.SoftMax(), 'prediction', 'prob', {}) ;
else
net.layers{end+1} = struct('name', 'prob', 'type', 'softmax') ;
end
if isDag
dagMergeBatchNorm(net) ;
dagRemoveLayersOfType(net, 'dagnn.BatchNorm') ;
else
net = simpleMergeBatchNorm(net) ;
net = simpleRemoveLayersOfType(net, 'bnorm') ;
end
因此在利用已经训练好的model进行fine-tuning的时候需要把已经去掉的层插入回去,下面以VGG16示例如下,把保存(Deploy)model时去掉的Loss层重新插入:
Dropout层和BN层与之类似。但是通常情况下,在Fine-tuning的情况下不再把BN层插入回去,一方面是因为BN层的参数被合并(通过某种映射)到BN层前一个卷积层的f与b参数内;另一方面,性能反而会变差,所以一般情况下,很少会把BN层再插入回去。
但是有一点需要注意的是,在训练模型(Model)的时候,如此保存的model: net-epoch-#.mat,其Loss层,Dropout层与BN层均没有去掉,以便从某个Epoch继续训练模型。