一 chainer基础

Chainer是一个专门为高效研究和开发深度学习算法而设计的开源框架。 这篇博文会通过一些例子简要地介绍一下Chainer,同时把它与其他一些框架做比较,比如Caffe、Theano、Torch和Tensorflow。

大多数现有的深度学习框架是在模型训练之前构建计算图。 这种方法是相当简单明了的,特别是对于结构固定且分层的神经网络(比如卷积神经网络)的实现。

然而,现在的复杂神经网络(比如循环神经网络或随机神经网络)带来了新的性能改进和新的应用。虽然现有的框架可以用于实现这些复杂神经网络,但是它们有时需要一些(不优雅的)编程技巧,这可能会降低代码的开发效率和可维护性。

而Chainer的方法是独一无二的:即在训练时“实时”构建计算图。

这种方法可以让用户在每次迭代时或者对每个样本根据条件更改计算图。同时也很容易使用标准调试器和分析器来调试和重构基于Chainer的代码,因为Chainer使用纯Python和NumPy提供了一个命令式的API。 这为复杂神经网络的实现提供了更大的灵活性,同时又加快了迭代速度,提高了快速实现最新深度学习算法的能力。

以下我会介绍Chainer是如何工作的,以及用户可以从中获得什么样的好处。
Chainer 是一个基于Python的独立的深度学习框架。

不同于其它基于Python接口的框架(比如Theano和TensorFlow),Chainer通过支持兼容Numpy的数组间运算的方式,提供了声明神经网络的命令式方法。Chainer 还包括一个名为CuPy的基于GPU的数值计算库。

>>> from chainer import Variable

>>> import numpy as np

Variable 类是把numpy.ndarray数组包装在内的计算模块(numpy.ndarray存放在.data中)。

>>> x = Variable(np.asarray([[0, 2],[1, -3]]).astype(np.float32))

>>> print(x.data)

[[ 0.      2.]

[ 1.     -3.]]

用户可以直接在Variables上定义各种运算和函数(Function的实例)。

>>> y = x ** 2 – x + 1

>>> print(y.data)

[[  1.   3.]

[  1.  13.]]

因为这些新定义的Varriable类知道他们是由什么类生成的,所以Variable y跟它的父类有一样的加法运算(.creator)。

>>> print(y.creator)

<chainer.functions.math.basic_math.AddConstant at 0x7f939XXXXX>

利用这种机制,可以通过反向追踪从最终损失函数到输入的完整路径来实现反向计算。完整路径在执行正向计算的过程中存储,而不预先定义计算图。

在chainer.functions类中给出了许多数值运算和激活函数。 标准神经网络的运算在Chainer类中是通过Link类实现的,比如线性全连接层和卷积层。Link可以看做是与其相应层的学习参数的一个函数(例如权重和偏差参数)。你也可以创建一个包含许多其他Link的Link。这样的一个link容器被命名为Chain。这允许Chainer可以将神经网络建模成一个包含多个link和多个chain的层次结构。Chainer还支持最新的优化方法、序列化方法以及使用CuPy的由CUDA驱动的更快速计算。

>>> import chainer.functions as F

>>> import chainer.links as L

>>> from chainer import Chain, optimizers, serializers, cuda

>>> import cupy as cp
二 chainer的设计

训练一个神经网络一般需要三个步骤:(1)基于神经网络的定义来构建计算图;(2)输入训练数据并计算损失函数;(3)使用优化器迭代更新参数直到收敛。

通常,深度学习框架在步骤2之前先要完成步骤1。 我们称这种方法是“先定义再运行”。

对于复杂神经网络,这种“先定义再运行”的方法简单直接,但并不是最佳的,因为计算图必须在训练前确定。 例如,在实现循环神经网络时,用户不得不利用特殊技巧(比如Theano中的scan()函数),这就会使代码变的难以调试和维护。

与之不同的是,Chainer使用一种“边运行边定义”的独特方法,它将第一步和第二步合并到一个步骤中去。

计算图不是在训练之前定义的,而是在训练过程中获得的。 因为正向计算直接对应于计算图并且也通过计算图进行反向传播,所以可以在每次迭代甚至对于每个样本的正向计算中对计算图做各种修改。

举一个简单的例子,让我们看看使用两层感知器进行MNIST数字分类会发生什么。

下面是Chainer中两层感知器的实现代码:

# 2-layer Multi-Layer Perceptron (MLP)

# 两层的多层感知器(MLP)

class MLP(Chain):

def __init__(self):

super(MLP, self).__init__()

l1=L.Linear(784, 100),  # From 784-dimensional input to hidden unit with 100 nodes

# 从784维输入向量到100个节点的隐藏单元

l2=L.Linear(100, 10),  # From hidden unit with 100 nodes to output unit with 10 nodes  (10 classes)

# 从100个节点的隐藏单元到10个节点的输出单元(10个类)

# Forward computation

# 正向计算

def __call__(self, x):

h1 = F.tanh(self.l1(x))     # Forward from x to h1 through activation with tanh function

# 用tanh激活函数,从输入x正向算出h1

y = self.l2(h1)                 # Forward from h1to y

# 从h1正向计算出y

return y

在构造函数(__init__)中,我们分别定义了从输入单元到隐藏单元,和从隐藏单元到输出单元的两个线性变换。要注意的是,这时并没有定义这些变换之间的连接,这意味着计算图没有生成,更不用说固定它了。

跟“先定义后运行”方法不同的是,它们之间的连接关系会在后面的正向计算中通过定义层之间的激活函数(F.tanh)来定义。一旦对MNIST上的小批量训练数据集(784维)完成了正向计算,就可以通过从最终节点(损失函数的输出)回溯到输入来实时获得下面的计算图(注意这里使用SoftmaxCrossEntropy做为损失函数):
这里的关键点是神经网络是直接用Python来定义的而不是领域特定语言,因此用户可以在每次迭代(正向计算)中对神经网络进行更改。

这种神经网络的命令性声明允许用户使用标准的Python语法进行网络分支计算,而不用研究任何领域特定语言(DSL)。这跟TensorFlow、 Theano使用的符号方法以及Caffe和CNTK依赖的文本DSL相比是一个优势。

此外,可以使用标准调试器和分析器来查找错误、重构代码以及调整超参数。 另一方面,尽管Torch和MXNet也允许用户使用神经网络的命令性建模,但是他们仍然使用“先定义后运行”的方法来构建计算图对象,因此调试时需要特别小心。

三  chainer安装

在Anaconda Prompt下运行下边的代码即可:

pip install chainer

参考:https://blog.csdn.net/zkh880loLh3h21AJTH/article/details/78100460

转载于:https://www.cnblogs.com/Terrypython/p/10172403.html

浅谈chainer框架相关推荐

  1. 浅谈跨平台框架 Flutter 的优势与结构

    作者:个推iOS工程师 伊泽瑞尔 一.背景 目前,移动开发技术主要分为原生开发和跨平台开发两种.其中,原生应用是指在某个特定的移动平台上,使用平台所支持的开发工具和语言,直接调用系统提供的API所开发 ...

  2. 浅谈EntityFramework框架的使用

    第一步,建立一个类库,并且安装好EntityFramework框架还有CodingFirstUsingFluentApi安装包 第二步 : 第三步:配置好你的数据库连接信息,还有你需要操作的数据库,在 ...

  3. 【JAVAEE框架】浅谈 Spring 框架的两大核心思想 AOP 与 IOP

    哈喽~大家好呀,这篇来看看Spring 框架的两大核心思想.

  4. 浅谈Api框架神器Swagger2

    Api框架神器Swagger2 Swagger被称为世界最强的的Api框架,没有之一.(有点狂妄) 下面我们来简单了解一下swagger,基于前后端分离开发,在相互交互时产生的需求.传统方法在联调的时 ...

  5. 【Caffeine入门】浅谈缓存框架Caffeine

    Caffeine是一个基于Java8的高性能缓存框架,号称趋于完美.Caffeine受启发于Guava Cache的API,使用API和Guava是一致的.它借鉴了Guava Cache和Concur ...

  6. 浅谈Spring框架AOP概念

    何为AOP? AOP(Aspect Oriented Programming,面向切面编程):AOP是一种新的方法论,在这之前相信我们都听过面向对象编程(OOP),AOP就是对OOP的补充,它们的关系 ...

  7. 浅谈Nodejs框架里的“洋葱模型”

    1. 洋葱模型 洋葱我们都知道,一层包裹着一层,层层递进,但是现在不是看其立体的结构,而是需要将洋葱切开来,从切开的平面来看,如图 所示: 可以看到要从洋葱中心点穿过去,就必须先一层层向内穿入洋葱表皮 ...

  8. 浅谈SSM框架下实现简单登录界面

    SSM框架搭建结果 Login.jsp <%@ page language="java" contentType="text/html; charset=UTF-8 ...

  9. 浅谈express框架

    目录 express 安装express和使用 使用express创建一个简单的服务器 中间件分类 express.static()中间件处理逻辑: 使用express封装一个商品接口 => g ...

最新文章

  1. Ajax实现在textbox中输入内容,动态从数据库中模糊查询显示到下拉框中
  2. 程序员,技术的“背锅侠”,盘点 2020 年面向监狱编程的那些事!
  3. SoC嵌入式软件架构设计之中的一个:系统内存需求评估
  4. linux vim分屏函数,Linux学习笔记之十二————vim编辑器的分屏操作
  5. 如何制作U盘启动菜单
  6. ykcchf 2013 v2.1101 最新版下载
  7. 【C++ STL学习之八】逆向迭代器reverse_iterator
  8. 计算机如何做分类轴无刻度线,用excel画散点图,怎样使横坐标与纵坐标刻度一致?不用电脑默认的间距-刻度条间距...
  9. linux下矩阵键盘设备名,Linux下矩阵键盘驱动分析与移植
  10. 第0章 Oracle的安装及相关配置
  11. 2017年c语言试卷及答案,2017年全国计算机c语言试题及答案
  12. android 打电话流程,Android 打电话 流程
  13. 2022半入耳式蓝牙耳机怎么选?半入耳式耳机排行榜
  14. 和Windows10的垃圾“照片”说再见,找回“Windows照片查看器”
  15. 淘宝搜索展现原理,店铺商品排名较低怎么办
  16. 超市收银系统c语言程序用c 的,C语言 超市收银系统
  17. pyaudio usb playback_利用python工具包pyaudio实现录音
  18. Endnote中有的文献没有Pages信息怎么办?
  19. Ajax洗洁精的特性,洗涤剂中常用表面活性剂的特点
  20. php apc.dll,php_apc.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家

热门文章

  1. Nginx-下载与安装
  2. 首席新媒体黎想教程:B端运营如何通过活动获客?
  3. hdu 4070 Phage War
  4. Linux环境下搭建主从DNS服务器
  5. 【LoRa】sx1276/77/78 6个DIO引脚映射配置关系
  6. 如何在网上办理电信宽带
  7. Springboot整合Swagger实战(一)
  8. 福师计算机辅助设计1PS在线作业二,16秋福师《计算机辅助设计1(PS)》在线作业二.doc...
  9. 计算机上标准偏差怎么算,如何有效计算运行标准偏差?
  10. C语言中文件的打开与保存