文章首发于微信公众号《有三AI》

【chainer速成】chainer图像分类从模型自定义到测试

欢迎来到专栏《2小时玩转开源框架系列》,这是我们第八篇,前面已经说过了caffe,tensorflow,pytorch,mxnet,keras,paddlepaddle,cntk。

今天说chainer,本文所用到的数据,代码请参考我们官方git

https://github.com/longpeng2008/LongPeng_ML_Course

作者&编辑 | 汤兴旺

01 chainer是什么

chainer是一个基于python的深度学习框架,能够轻松直观地编写复杂的神经网络架构。

当前大多数深度学习框架都基于“Define-and-Run”方案。也就是说,首先定义网络,然后用户定期向其提供小批量的训练数据。由于网络静态定义的,因此所有的逻辑必须作为数据嵌入到网络架构中。

相反,chainer采用“Define-by-Run”方案,即通过实际的前向计算动态定义网络。更确切地说,chainer存储计算历史而不是编程逻辑。这样,Chainer不需要将条件和循环引入网络定义 。chainer的核心理念就是Define-by-Run。

02 chainer训练准备

2.1 chainer安装

chainer安装很简单,只需要在终端输入下面命令即可安装:

pip install chainer

2.2 数据读取

在chainer中读取数据是非常简单的。数据读取部分的代码如下:

import numpy as npimport osfrom PIL import Imageimport globfrom chainer.datasets import tuple_datasetclass Dataset():def __init__(self, path, width=60, height=60):channels = 3path = glob.glob('./mouth/*')pathsAndLabels = []index = 0for p in path:print(p + "," + str(index))pathsAndLabels.append(np.asarray([p, index]))index = index + 1allData = []for pathAndLabel in pathsAndLabels:path = pathAndLabel[0]label = pathAndLabel[1]imagelist = glob.glob(path + "/*")for imgName in imagelist:allData.append([imgName, label])allData = np.random.permutation(allData)imageData = []labelData = []

下面解释下在chainer中读取数据的一些特色,完整代码请移步github。

在chainer中我们通过chainer.datasets模块来获取数据集,其最基本的数据集就是一个数组,平时最常见的NumPy和CuPy数组都可以直接用作数据集。在本实例中我们采用的是元组数据集即TupleDataset()来获取数据。

2.3 网络定义

它的网络定义和pytorch基本上是相似的,如下:

class MyModel(Chain):def __init__(self):super(MyModel, self).__init__()with self.init_scope():self.conv1 = L.Convolution2D(in_channels=3, out_channels=12, ksize=3, stride=2)self.bn1 = L.BatchNormalization(12)self.conv2 = L.Convolution2D(in_channels=12, out_channels=24, ksize=3, stride=2)self.bn2 = L.BatchNormalization(24)self.conv3 = L.Convolution2D(in_channels=24, out_channels=48, ksize=3, stride=2)self.bn3 = L.BatchNormalization(48)self.fc1 = L.Linear(None, 1200)self.fc2 = L.Linear(1200, 128)self.fc3 = L.Linear(128, 2)def __call__(self,x):return self.forward(x)def forward(self, x):h1 = F.relu(self.conv1(x))h2 = F.relu(self.conv2(h1))h3 = F.relu(self.conv3(h2))h4 = F.relu(self.fc1(h3))h5 = F.relu(self.fc2(h4))x = self.fc3(h5)return (x)

上面的例子和之前说过的caffe、tensorflow、pytorch等框架采用的网络结构是一样。这里不在赘述,我具体说下这个框架的特色。

(1) MyModel(Chain)

Chain在chainer中是一个定义模型的类,我们把模型MyModel定义为Chain的子类,即继承Chain这个类,这和Pytorch中的nn.module类似。以后我们在模型定义时都可以通过Chain来构建具有潜在深层功能和链接层次的模型。

(2) Link和Function

在Chainer中,神经网络的每一层都可以认为是由两种广泛类型的函数之一组成即Link和Function。

其中Function是一个没有可学习参数的函数,而LInk是包括参数的,我们也能把Link理解成一个赋予其参数的Function。

在我们使用它之前,我们首先需要导入相应的模块,如下:

import chainer.links as L
import chainer.functions as F

另外在平时使用时我们喜欢用L替代Link,用F代替Function。如L.Convolution2D和F.relu

(3) __call__

对于__call__它的作用就是使我们的chain像一个函数一样容易被调用。

03 模型训练

数据加载和网络定义好后,我们就可以进行模型训练了,话不多说,我们直接上代码。

model = L.Classifier(MyModel())if os.path.isfile('./dataset.pickle'):print("dataset.pickle is exist. loading...")with open('./dataset.pickle', mode='rb') as f:train, test = pickle.load(f)print("Loaded")else:datasets = dataset.Dataset("mouth")train, test = datasets.get_dataset()with open('./dataset.pickle', mode='wb') as f:pickle.dump((train, test), f)print("saving train and test...")optimizer = optimizers.MomentumSGD(lr=0.001, momentum=0.5)optimizer.setup(model)train_iter = iterators.SerialIterator(train, 64)test_iter = iterators.SerialIterator(test, 64, repeat=False, shuffle=True)updater = training.StandardUpdater(train_iter, optimizer, device=-1)trainer = training.Trainer(updater, (800, 'epoch'),        out='{}_model_result'.format(MyModel.__class__.__name__))

在chainer中,模型训练可以分为如下6个步骤,个人认为这6个步骤是非常好理解的。

Step-01-Dataset

第一步当然就是加载我们的数据集了,我们通常都是通过下面方法加载数据集:

train, test = datasets.get_dataset()

Step-02-Iterator

chainer提供了一些Iterator,通常我们采用下面的方法来从数据集中获取小批量的数据进行迭代。

train_iter = iterators.SerialIterator(train, batchsize)
test_iter = iterators.SerialIterator(test, batchsize, repeat=False, shuffle=True)

Step-03-Model

在chainer中chainer.links.Classifier是一个简单的分类器模型,尽管它里面有许多参数如predictor、lossfun和accfun,但我们只需赋予其一个参数那就是predictor,即你定义过的模型。

model = L.Classifier(MyModel())

Step-04-Optimizer

模型弄好后,接下来当然是优化了,在chainer.optimizers中有许多我们常见的优化器,部分优化器如下:

1、chainer.optimizers.AdaDelta2、chainer.optimizers.AdaGrad3、chainer.optimizers.AdaDelta  4、chainer.optimizers.AdaGrad    5、chainer.optimizers.Adam  6、chainer.optimizers.CorrectedMomentumSGD   .    7、chainer.optimizers.MomentumSGD   8、chainer.optimizers.NesterovAG  9、chainer.optimizers.RMSprop   10、chainer.optimizers.RMSpropGraves   ...

Step-05-Updater

当我们想要训练神经网络时,我们必须运行多次更新参数,这在chainer中就是Updater所做的工作,在本例我们使用的是 training.StandardUpdater。

Step-06-Trainer

上面的工作做完之后我们需要做的就是训练了。在chainer中,训练模型采用的是 training.Trainer()。

04 可视化

trainer.extend(extensions.dump_graph("main/loss"))trainer.extend(extensions.Evaluator(test_iter, model, device=-1))trainer.extend(extensions.LogReport())trainer.extend(extensions.PrintReport( ['epoch', 'main/loss', 'validation/main/loss', 'main/accuracy', 'validation/main/accuracy']))trainer.extend(extensions.PlotReport(['main/loss', 'validation/main/loss'], x_key='epoch', file_name='loss.png'))trainer.extend(extensions.PlotReport(['main/accuracy', 'validation/main/accuracy'], x_key='epoch', file_name='accuracy.png'))trainer.extend(extensions.ProgressBar())

在chainer中可视化是非常方便的,我们常通过trainer.extend()来实现我们的可视化,其有下面几种可视化的方式。

1、chainer.training.extensions.PrintReport    2、chainer.training.extensions.ProgressBar   3、chainer.training.extensions.LogReport    4、chainer.training.extensions.PlotReport   5、chainer.training.extensions.VariableStatisticsPlot  6、chainer.training.extensions.dump_graph    

以上就是利用chain来做一个图像分类任务的一个小例子。完整代码可以看配套的git项目,我们看看训练中的记录,如下:

总结

本文讲解了如何使用chainer深度学习框架完成一个分类任务,尽管这个框架用的人不多,但这个框架使用起来还是比较方便的,您在用吗?如果您在用,可以联系我们一起交流下!

转载文章请后台联系

侵权必究

本系列完整文章:

第一篇:【caffe速成】caffe图像分类从模型自定义到测试

第二篇:【tensorflow速成】Tensorflow图像分类从模型自定义到测试

第三篇:【pytorch速成】Pytorch图像分类从模型自定义到测试

第四篇:【paddlepaddle速成】paddlepaddle图像分类从模型自定义到测试

第五篇:【Keras速成】Keras图像分类从模型自定义到测试

第六篇:【mxnet速成】mxnet图像分类从模型自定义到测试

第七篇:【cntk速成】cntk图像分类从模型自定义到测试

第八篇:【chainer速成】chainer图像分类从模型自定义到测试

第九篇:【DL4J速成】Deeplearning4j图像分类从模型自定义到测试

第十篇:【MatConvnet速成】MatConvnet图像分类从模型自定义到测试

第十一篇:【Lasagne速成】Lasagne/Theano图像分类从模型自定义到测试

第十二篇:【darknet速成】Darknet图像分类从模型自定义到测试

感谢各位看官的耐心阅读,不足之处希望多多指教。后续内容将会不定期奉上,欢迎大家关注有三公众号 有三AI

【chainer速成】chainer图像分类从模型自定义到测试相关推荐

  1. 【MatConvnet速成】MatConvnet图像分类从模型自定义到测试

    欢迎来到专栏<2小时玩转开源框架系列>,这是我们第10篇,前面已经说过了caffe,tensorflow,pytorch,mxnet,keras,paddlepaddle,cntk,cha ...

  2. 【darknet速成】Darknet图像分类从模型自定义到测试

    欢迎来到专栏<2小时玩转开源框架系列>,这是我们第12篇文章,前面已经说过了caffe,tensorflow,pytorch,mxnet,keras,paddlepaddle,cntk,c ...

  3. 【DL4J速成】Deeplearning4j图像分类从模型自定义到测试

    文章首发于微信公众号<有三AI> [DL4J速成]Deeplearning4j图像分类从模型自定义到测试 欢迎来到专栏<2小时玩转开源框架系列>,这是我们第九篇,前面已经说过了 ...

  4. 【cntk速成】cntk图像分类从模型自定义到测试

    文章首发于微信公众号<有三AI> [cntk速成]cntk图像分类从模型自定义到测试 欢迎来到专栏<2小时玩转开源框架系列>,这是我们第七篇,前面已经说过了caffe,tens ...

  5. 【paddlepaddle速成】paddlepaddle图像分类从模型自定义到测试

    文章首发于微信公众号<与有三学AI> [paddlepaddle速成]paddlepaddle图像分类从模型自定义到测试 这是给大家准备的paddlepaddle与visualdl速成例子 ...

  6. 【pytorch速成】Pytorch图像分类从模型自定义到测试

    文章首发于微信公众号<与有三学AI> [pytorch速成]Pytorch图像分类从模型自定义到测试 前面已跟大家介绍了Caffe和TensorFlow,链接如下. [caffe速成]ca ...

  7. 【mxnet速成】mxnet图像分类从模型自定义到测试

    文章首发于微信公众号<与有三学AI> [mxnet速成]mxnet图像分类从模型自定义到测试 这是给大家准备的mxnet速成例子 这一次我们讲讲mxnet,相关的代码.数据都在我们 Git ...

  8. 【Keras速成】Keras图像分类从模型自定义到测试

    文章首发于微信公众号<与有三学AI> [Keras速成]Keras图像分类从模型自定义到测试 这是给大家准备的Keras速成例子 这一次我们讲讲keras这个简单.流行的深度学习框架,一个 ...

  9. 【tensorflow速成】Tensorflow图像分类从模型自定义到测试

    文章首发于微信公众号<与有三学AI> [tensorflow速成]Tensorflow图像分类从模型自定义到测试 这是给大家准备的tensorflow速成例子 上一篇介绍了 Caffe , ...

最新文章

  1. php并发扣款,PHP 并发扣款,保证数据一致性(悲观锁)
  2. html的vue项目怎么兼容ie,vue 项目在ie浏览器的兼容问题
  3. Redis 2.8.18 安装报错 error: jemalloc/jemalloc.h: No s
  4. (转)Spring简介
  5. 这两个VHDL的问题终于解决了!
  6. 在HttpClient请求的时候,返回结果解析时出现java.io.IOException: Attempted read from closed stream. 异常,解决
  7. 洛谷——P1568 赛跑
  8. Spring中@Autowired注解用法
  9. rs485的1:n计算机连接和n:n的主从plc通讯,富士人机界面与GE90-70 PLC N:1通讯在轧钢生产线的应用...
  10. 知识蒸馏 综述 Knowledge Distillation: A Survey
  11. Python3,多线程爬取某瓣小电影~ ~
  12. git 远程仓库和本地仓库建立连接
  13. 编写一个静态方法 lg(), 接受一个整型参数 N,返回不大于 log2N 的最大整数。
  14. 真正可用的获取任意进程的内存使用率 和任务管理器一模一样
  15. [SUCTF 2019]CheckIn
  16. 蚁群算法解决 TSP 问题
  17. ARM各版本架构区别,各架构的系列芯片。
  18. Zotero中文文献管理
  19. 双十一过后“吃土”怎么办?免费PDF编辑器来帮你
  20. 在Idea中修改项目名称

热门文章

  1. synchronized 原理知多少
  2. java网络编程(六)
  3. 蓝桥杯java第八届第三题--承压计算
  4. 蓝桥杯-递归求二项式系数值(java)
  5. Java设计模式-Proxy代理模式
  6. 谁说菜鸟不会数据分析python下载_刻意练习9:《谁说菜鸟不会数据分析python篇》第3章编程基础总计46页学习笔记...
  7. json从立地到成佛
  8. codeforces Educational Codeforces Round 49 (Rated for Div. 2) C题
  9. QT:常用函数详解--常用操作记录(个人笔记)
  10. web.xml、JSP原理、指令