当前位置:   article > 正文

caffe学习笔记10 -- Fine-tuning a Pretrained Network for Style Recognitio

fine-tuning a pretrained network

这是caffe官方文档Notebook Examples中的第四个例子,链接地址:http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/03-fine-tuning.ipynb

这个实例用于在与训练好的网络上微调flickr_style数据。用已经训练好的caffe网络微调自己的数据。这种方法的好处在于,与训练网络从大量的图片数据集中学习而来,其中间层可以捕获一般视觉表现的“语义”, 可以将其看做一个包含强大特征的黑盒子,我们仅需要几层就能获得好的数据特征。

首先,我们需要保存数据,包含如下几步:

  • 获取ImageNet ilsvrc与训练的模型
  • 下载Flickr style数据集的一个子集
  • 将下载的数据编译为caffe可以使用的格式

1. 导入程序需要的包:

  1. import os
  2. caffe_root = '/home/sindyz/caffe-master/'
  3. os.chdir(caffe_root)
  4. import sys
  5. sys.path.insert(0,'./python')
  6. import caffe
  7. import numpy as np
  8. from pylab import *

2. 导入数据和模型

  1. # This downloads the ilsvrc auxiliary data (mean file, etc),
  2. # and a subset of 2000 images for the style recognition task.
  3. !data/ilsvrc12/get_ilsvrc_aux.sh
  4. !scripts/download_model_binary.py models/bvlc_reference_caffenet
  5. !python examples/finetune_flickr_style/assemble_data.py \
  6. --workers=-1 --images=2000 --seed=1701 --label=5

3. 比较一下两种模型的不同

!diff models/bvlc_reference_caffenet/train_val.prototxt models/finetune_flickr_style/train_val.prototxt  

输出这里省略


4. 用python学习,比较微调后的结果与直接训练的结果

  1. niter = 200
  2. # losses will also be stored in the log
  3. train_loss = np.zeros(niter)
  4. scratch_train_loss = np.zeros(niter)
  5. caffe.set_device(0)
  6. caffe.set_mode_gpu()
  7. # We create a solver that fine-tunes from a previously trained network.
  8. solver = caffe.SGDSolver('models/finetune_flickr_style/solver.prototxt')
  9. solver.net.copy_from('models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')
  10. # For reference, we also create a solver that does no finetuning.
  11. scratch_solver = caffe.SGDSolver('models/finetune_flickr_style/solver.prototxt')
  12. # We run the solver for niter times, and record the training loss.
  13. for it in range(niter):
  14. solver.step(1) # SGD by Caffe
  15. scratch_solver.step(1)
  16. # store the train loss
  17. train_loss[it] = solver.net.blobs['loss'].data
  18. scratch_train_loss[it] = scratch_solver.net.blobs['loss'].data
  19. if it % 10 == 0:
  20. print 'iter %d, finetune_loss=%f, scratch_loss=%f' % (it, train_loss[it], scratch_train_loss[it])
  21. print 'done'

输出省略。。。


5. 查看训练损失


可见,微调方法产生的损失波动平滑,而且比直接使用模型的损失小。


6. 将较小值部分放大:

plot(np.vstack([train_loss, scratch_train_loss]).clip(0, 4).T)


7. 查看经过200次迭代后,测试准确率,我们看到分类任务中有5个类别,随机测试的准确率为20%,与我们预期的一样,微调的结果要好于直接使用模型的结果。

  1. test_iters = 10
  2. accuracy = 0
  3. scratch_accuracy = 0
  4. for it in arange(test_iters):
  5. solver.test_nets[0].forward()
  6. accuracy += solver.test_nets[0].blobs['accuracy'].data
  7. scratch_solver.test_nets[0].forward()
  8. scratch_accuracy += scratch_solver.test_nets[0].blobs['accuracy'].data
  9. accuracy /= test_iters
  10. scratch_accuracy /= test_iters
  11. print 'Accuracy for fine-tuning:', accuracy
  12. print 'Accuracy for training from scratch:', scratch_accuracy

Accuracy for fine-tuning: 0.547999998927

Accuracy for training from scratch: 0.218000002205


 

参考资料:

http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/03-fine-tuning.ipynb




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/732170
推荐阅读
相关标签
  

闽ICP备14008679号