CNTK 搞深度学习-1
CNTK 搞深度学习
Computational Network Toolkit (CNTK) 是微软出品的开源深度学习工具包。本文介绍CNTK的基本内容,如何写CNTK的网络定义语言,以及跑通一个简单的例子。
根据微软开发者的描述,CNTK的性能比Caffe,Theano, TensoFlow等主流工具都要强。它支持CPU和GPU模式,所以没有GPU,或者神经网络比较小的实验,直接用CPU版的CNTK跑就行了。 其开源主页在 https://github.com/Microsoft/CNTK 它把神经网络描述成一个有向图的结构,叶子节点代表输入或者网络参数,其他节点计算步骤。 它支持卷积神经网络和递归神经网络。 由于CNTK刚推出不久,大众教程估计不多,而且bug估计也不少。我学习的时候,主要参考三个资料:
1 官方入门教程 https://github.com/Microsoft/CNTK/wiki/Tutorial 本文也主要以这里的教程为例
2 官方论坛 https://github.com/Microsoft/CNTK/issues
3 官方论文 http://research.microsoft.com/pubs/226641/CNTKBook-20160217..pdf 这个有150页,我是当作字典来用,遇到问题的时候就在里面搜
安装CNTK: https://github.com/Microsoft/CNTK/wiki/CNTK-Binary-Download-and-Configuration 去这个页面找符合自己系统的版本。 我是Windows用户,CNTK有编译好的CPU和GPU版本。由于本人的显卡不是英伟达的,所以无奈只能用CPU版凑合用用。已经编译好的包最方便了,解压,然后把目录(类似%...%、CNTK-2016-02-08-Windows-64bit-CPU-Only\cntk\cntk)添加到PATH变量中就行了。 有条件的人也可以自己编译源代码,稍微麻烦一些,各种依赖关系,好处是源码更新的比较快,CNTK一大特点就是目前各种小bug比较多,比如我现在用的编译好的包还是两个月前发布的,已经自己填了好多坑了。
安装好CNTK之后,运行一个程序,就是一个简单的命令行: CNTK configFile=your_config_file , 其中,your_config_file 是网络的定义文件,大概长这样:

command=Train:Test
Train=[
action="train"
NDLNetworkBuilder = [
...
]
SGD = [
...
]
reader = [
...
]
]
Test=[ ... ]

运行的入口就是command命令,command后面接需要依次运行的模块,用冒号分开。 每个模块里面需要定义的事情比较类似,主要是定义输入的格式,网络结构,学习算法(目前只有SGD)和参数。 在定义网络结构的时候,会指明哪些节点是优化目标,哪些是评价指标,以及哪些是输出的点。
众所周知,把神经网络的隐藏层去掉之后,输入直接连到输出层,这样就行成了一个logistics regression分类器。所以https://github.com/Microsoft/CNTK/wiki/Tutorial 这个教程就指导大家如何构建一个LR。 我这里稍微变一下,学习一下如何构建带有一层隐藏层的neural network,如下图:
定义网络结构
CNTK用网络描述语言(network description language, NDL)描述一个神经网络。 简单的说,我们要描述输入的feature,输入的label,一些参数,参数和输入之间的计算关系,以及目标节点是什么。

NDLNetworkBuilder=[ run=ndlLR ndlLR=[
# sample and label dimensions
SDim=$dimension$
LDim=1 features=Input(SDim, 1)
labels=Input(LDim, 1) # parameters to learn
B0 = Parameter(4)
W0 = Parameter(4, SDim) B = Parameter(LDim)
W = Parameter(LDim, 4) # operations
t0 = Times(W0, features)
z0 = Plus(t0, B0)
s0 = Sigmoid(z0) t = Times(W, s0)
z = Plus(t, B)
s = Sigmoid(z) LR = Logistic(labels, s)
EP = SquareError(labels, s) # root nodes
FeatureNodes=(features)
LabelNodes=(labels)
CriteriaNodes=(LR)
EvalNodes=(EP)
OutputNodes=(s,t,z,s0,W0)
]
]

features=Input(SDim, 1) labels=Input(LDim, 1) 和 B0 = Parameter(4) 等可以想象成是在定义变量。 输入是列向量,CNTK里面的运算全是矩阵运算,所以就把输入当做只有一列的矩阵。 t0 = Times(W0, features) 是做矩阵乘法,t0把输入和权重相乘,z0 是在t0上面加了一个bias,
s0表示经过一个激活函数。 B0,W0,t0,z0,s0构成了隐层的操作,这里定义的隐层有4个节点。 t,z,s是输出层的操作,s就是输出节点的值。 框架定义好之后,还需要指定一些根节点,用来指定特殊的任务,例如 FeatureNodes=(features) 和LabelNodes=(labels)分别规定了输入和输出节点,CriteriaNodes 是训练的
时候优化的目标,EvalNodes 是在做评测的时候输出的参考值。OutputNodes 指定了需要输出到文件的节点。
设置训练算法

SGD = [
epochSize=0 # 每轮迭代使用的样例数, =0 表示使用整个训练集
minibatchSize=25 # 训练25个样本就更新一次参数
learningRatesPerMB=0.1 # learning rates per MB
maxEpochs=50 #迭代50次
]

目前只有SGD(以及在SGD上的各种变种),可以在里面设置各种参数。
设置输入格式

reader = [
#customDelimiter = " "
readerType = "UCIFastReader"
file = "Train.txt"
miniBatchMode = "partial"
verbosity = 1
randomize = "none" features=[
dim = $dimension$
start = 0
] labels=[
start = $dimension$ # skip $dimension$ elements before reading the label (i.e. the first two dimensions so we have "x1 x2 y" basically)
dim = 1 # label has 1 dimension
labelType=regression
labelMappingFile = "SimpleMapping.txt"
]
]

这也是CNTK的一个特点(吐槽点), 指定用什么方式读取数据文件。 readerType = "UCIFastReader" 指定用普通的扁平化表格的格式(一行一个样例,同一行内用空格隔开不同的数值),还有别的格式类型,例如图像格式,文本语料格式等。
UCIFastReader 是将被弃用的,而且在目前最新的binary包中是有bug的 (所以说,有条件的同学尽量自己编译最新的源码)。 用官方教程里的设置直接跑回出bug,以上是我修改过的代码。 输入格式主要描述了feature是哪几列,维度是多少,label是哪几列, label的类型等等。
综上,Train这个模块就是定义了这几件事情:输入格式,网络内容,训练模式。 运行的时候也是这个步骤: 读取数据-> SGD 训练.
其他
除了Train之外的模块的流程比较类似,它们不需要再定义网络结构和训练模式,但是输入格式还是要指定的。 例如Test模块的流程是: 读取数据->计算网络->得到预测值->评估. 评估针对的是在网络结构中被定义为EvalNodes
的节点。 SquareError 只是其中的一种评估指标。如果想用别的误差函数,可以去查字典http://research.microsoft.com/pubs/226641/CNTKBook-20160217..pdf

Test=[
action="test"
reader=[
readerType="UCIFastReader"
file="Test.txt"
features=[
dim=2
start=0
]
labels=[
start=$dimension$
dim=1
labelDim=2
]
]
]

Output模块和Test的流程基本一样,只不过最后一个不是评估,而是把属于OutputNodes的值给输出到文件。 Output模块会指定一个输出目录 outputPath = "LR.txt" , 输出的文件以“LR.txt”为前缀,再加上变量命作为文件名。例如"LR.txt.W0"。

# output the results
Output=[
action="write"
reader=[
readerType="UCIFastReader"
file="Test.txt"
features=[
dim=$dimension$
start=0
]
labels=[
start=2
dim=1
labelType=regression
]
]
outputPath = "LR.txt" # dump the output as text
]

dumpNodeInfo
用来输出参数的值。这在调试中很有用,例如去看看网络的参数是如何变化的:

dumpNodeInfo=[
action=dumpnode
printValues=true
] ####################################################################
B=LearnableParameter [1,1] NeedGradient=true
-6.67130613
####################################################################
EP=SquareError ( labels , s )
features=InputValue [ 2 x 1 {1,2} ]
labels=InputValue [ 1 x 1 {1,1} ]
LR=Logistic ( labels , s )
s=Sigmoid ( z )
t=Times ( W , features )
W=LearnableParameter [1,2] NeedGradient=true
1.23924482 1.59913719
####################################################################
z=Plus ( t , B )

全部的代码如下。 train文件 https://github.com/Microsoft/CNTK/wiki/Tutorial/Train-3Classes.txt test 文件 https://github.com/Microsoft/CNTK/wiki/Tutorial/Test-3Classes.txt。 数据是2维的:

# Copyright (c) Microsoft. All rights reserved.
# Licensed under the MIT license. See LICENSE file in the project root for full license information. # logistic regression cntk script -- Network Description Language # which commands to run
command=Train:Output:dumpNodeInfo:Test #required...
modelPath="Models/LR_reg.dnn" # where to write the model to
deviceId=-1 # CPU
dimension=2 # input data dimensions # training config
Train=[
action="train"
traceLevel = 1
NDLNetworkBuilder=[ run=ndlLR ndlLR=[
# sample and label dimensions
SDim=$dimension$
LDim=1 features=Input(SDim, 1)
labels=Input(LDim, 1) # parameters to learn
B0 = Parameter(4)
W0 = Parameter(4, SDim) B = Parameter(LDim)
W = Parameter(LDim, 4) # operations
t0 = Times(W0, features)
z0 = Plus(t0, B0)
s0 = Sigmoid(z0) t = Times(W, s0)
z = Plus(t, B)
s = Sigmoid(z) LR = Logistic(labels, s)
EP = SquareError(labels, s) # root nodes
FeatureNodes=(features)
LabelNodes=(labels)
CriteriaNodes=(LR)
EvalNodes=(EP)
OutputNodes=(s,t,z,s0,W0)
]
] SGD = [
epochSize=0 # =0 means size of the training set
minibatchSize=25
learningRatesPerMB=0.1 # learning rates per MB
maxEpochs=50
] # parameter values for the reader
reader = [
#customDelimiter = " "
readerType = "UCIFastReader"
file = "Train.txt"
miniBatchMode = "partial"
verbosity = 1
randomize = "none" features=[
dim = $dimension$
start = 0
] labels=[
start = $dimension$ # skip $dimension$ elements before reading the label (i.e. the first two dimensions so we have "x1 x2 y" basically)
dim = 1 # label has 1 dimension
labelType=regression
labelMappingFile = "SimpleMapping.txt"
]
]
] # test
Test=[
action="test"
reader=[
readerType="UCIFastReader"
randomize = "none"
file="Test.txt"
features=[
dim=$dimension$
start=0
]
labels=[
start = $dimension$ # skip $dimension$ elements before reading the label (i.e. the first two dimensions so we have "x1 x2 y" basically)
dim = 1 # label has 1 dimension
labelType=regression
labelMappingFile = "SimpleMapping.txt"
]
]
] # output the results
Output=[
action="write"
reader=[
readerType="UCIFastReader"
file="Test.txt"
randomize = "none"
features=[
dim=$dimension$
start=0
] labels=[
start = $dimension$ # skip $dimension$ elements before reading the label (i.e. the first two dimensions so we have "x1 x2 y" basically)
dim = 1 # label has 1 dimension
labelType=regression
labelMappingFile = "SimpleMapping.txt"
]
]
outputPath = "LR.txt" # dump the output as text
] dumpNodeInfo=[
action=dumpnode
printValues=false
]

后一篇:
用CNTK搞深度学习 (二) 训练基于RNN的自然语言模型 ( language model )
http://www.cnblogs.com/sylvanas2012/p/5419477.html
CNTK 搞深度学习-1的更多相关文章
- 用 CNTK 搞深度学习 (一) 入门
Computational Network Toolkit (CNTK) 是微软出品的开源深度学习工具包.本文介绍CNTK的基本内容,如何写CNTK的网络定义语言,以及跑通一个简单的例子. 根据微软开 ...
- 用CNTK搞深度学习 (二) 训练基于RNN的自然语言模型 ( language model )
前一篇文章 用 CNTK 搞深度学习 (一) 入门 介绍了用CNTK构建简单前向神经网络的例子.现在假设读者已经懂得了使用CNTK的基本方法.现在我们做一个稍微复杂一点,也是自然语言挖掘中很火 ...
- Computational Network Toolkit (CNTK) 是微软出品的开源深度学习工具包
Computational Network Toolkit (CNTK) 是微软出品的开源深度学习工具包 用 CNTK 搞深度学习 (一) 入门 Computational Network Toolk ...
- 玩深度学习选哪块英伟达 GPU?有性价比排名还不够!
本文來源地址:https://www.leiphone.com/news/201705/uo3MgYrFxgdyTRGR.html 与“传统” AI 算法相比,深度学习(DL)的计算性能要求,可以说完 ...
- Windows10 利用 Docker 配置 TensofFlow 深度学习工具
TensorFlow 这个不用多介绍了吧,大家都知道,Google的开源深度学习软件库,官网点这里:https://www.tensorflow.org/ 当然这个工具官方支持装在 Ubuntu 和 ...
- 【转】贾扬清:希望Caffe成为深度学习领域的Hadoop
[转:http://www.csdn.net/article/2015-07-07/2825150] 在深度学习(Deep Learning)的热潮下,Caffe作为一个高效.实用的深度学习框架受到了 ...
- 【Todo】【转载】深度学习&神经网络 科普及八卦 学习笔记 & GPU & SIMD
上一篇文章提到了数据挖掘.机器学习.深度学习的区别:http://www.cnblogs.com/charlesblc/p/6159355.html 深度学习具体的内容可以看这里: 参考了这篇文章:h ...
- 深度学习Tensorflow生产环境部署(上·环境准备篇)
最近在研究Tensorflow Serving生产环境部署,尤其是在做服务器GPU环境部署时,遇到了不少坑.特意总结一下,当做前车之鉴. 1 系统背景 系统是ubuntu16.04 ubuntu@ub ...
- tensorflow(深度学习框架)详细讲解及实战
还未完全写完,本人会一直持续更新!~ 各大深度学习框架总结和比较 各个开源框架在GitHub上的数据统计,如下表: 主流深度学习框架在各个维度的评分,如下表: Caffe可能是第一个主流的工业级深度学 ...
随机推荐
- 【Oracle】使用bbed恢复delete的数据
表中的数据被delete之后并不会真正删除数据,而是打了一个删除标记,仅仅要还没有被覆盖就能够恢复回来. 实验步骤例如以下: SYS@ORCL>create table bbed_test(x ...
- HTML5入门:HTML5的文档声明和基本代码
HTML5的文档声明: HTML5的文档声明,不同于HTML4.0和XHTML,它精简了许多代码,只保留<!DOCTYPE html>开头,必须位于HTML5文档的第一行,它可以用来告诉浏 ...
- Android自定义组件系列【13】——Android自定义对话框如此简单
在我们的日常项目中很多地方会用到对话框,但是Android系统为我们提供的对话框样子和我们精心设计的界面很不协调,在这种情况下我们想很自由的定义对话框,或者有的时候我们的对话框是一个图片,没有标题和按 ...
- 图形界面备份Linux系统介绍
详情见: http://os.51cto.com/art/200905/125680.htm 虽然Linux 是一个高度可靠的操作系统,但对于现在复杂的internet环境下, ...
- Sql Server 基础语法
来自:http://www.cnblogs.com/AaronYang/archive/2012/04/24/2468093.html Sql Server 基础语法 -- 查看数据表 select ...
- SASS常用方法
cnpm install --save-dev sass-loader //sass-loader依赖于node-sass cnpm install --save-dev node-sass //实现 ...
- IE兼容性开发的笔记
当前项目组开发的产品对外承诺支持IE9和IE11,但在推广应用过程中发现存在相当比例的用户实际上还在使用IE8.而这相当比例中的用户还包含了大部分的公司领导.为了满足公司内部各阶层人士体验我们产品的诉 ...
- funuiTitle-居中问题修改
今天遇到了一个问题,在一个actionbar上,title居中了,现在想要的方式是,让actionbar上显示返回按钮,后面紧跟着title.当时自己一直尝试要找到activity,然后在theme中 ...
- 将vue-cli 2.x的项目升级到3.x
尝试将vue-cli 2.x的项目升级到3.x,记录一下升级过程,和遇到的坑 1. 直接复制替换src文件夹 2. 安装项目需要的依赖 (可以将原来package.json dependencies下 ...
- Django快速搭建博客
准备工作: 1.Python 2.Django 3.Git 安装Python: 官网下载 安装Django: #安装最新版本的Django $ pip install django #或者指定安装版本 ...