新普金娱乐网址


我们总要1人沉默着努力

数学笔记3——导数3(隐函数的导数)

上学笔记TF052:卷积网络,神经网络发展,亚历克斯Net的TensorFlow完结

  • 二月 18, 2019
  • 数学
  • 没有评论

卷积神经网络(convolutional neural network,CNN),权值共享(weight
sharing)互联网布局下落模型复杂度,减弱权值数量,是语音分析、图像识别热点。无须人工特征提取、数据重建,直接把图片作输入,自动提取特征,对活动、比例缩放、倾斜等图片变形具有中度不变形。卷积(convolution),泛函数分析积分变换数学方法,八个函数f和g生成第几个函数数学算子,表征函灵敏f与g翻转、平移重叠部分面积。f(x)、g(x)为Sportage1八个可积函数。积分新函数为函数f与g卷积。∫-∞+∞f(τ)g(x-E)dτ。

预备干活

注意:正文恐怕会让您失望,假诺你有下列疑问的话:为啥要在终极输命令啊?
GCC 是什么样事物,怎么在菜单中找不到? GCC 不可以有像 VC 那样的窗口吗?……
那么您真的想要了然的或是是
anjuta,kdevelop,geany,code
blocks,eclipse,netbeans 等 IDE 集成开发环境。即便在那种情状下,由于
GCC 是以上 IDE 的后台的编译器,本文仍值得您稍作精晓。

若是你还没装编译环境或本人不鲜明装没装,不妨先进行

> sudo apt-get install
build-essential

一旦您必要编译 Fortran 程序,那么还索要安装 gfortran(或 g77)

> sudo apt-get install gfortran

神经网络(neural
networks,NN)包罗输入层、隐藏层、输出层。卷积神经网络隐藏层分为卷积层和池化层(pooling
layer 下采样层)。卷积层的卷积核(conventional
kernel)在原有图像平移提取特征,每种特征是特色映射。池化层汇集特征稀疏参数裁减学习参数数量,下跌互联网复杂度。最大值池化(max
pooling)、平均值池化(average
pooling)。卷积核提取特征映射动作padding,移动步长(Stride)不自然整除图像素宽度,越边边缘取样为SAME,不通过边缘取样为VALID。

编译不难的 C 程序

C 语言经典的入门例子是 Hello World,上边是一示例代码:

> #include
> int main(void)
> {
> printf(“Hello, world!n”);
> return 0;
> }

咱俩只要该代码存为文件‘hello.c’。要用 gcc
编译该文件,使用上面的一声令下:

> $ gcc -g -Wall hello.c -o hello

该命令将文件‘hello.c’中的代码编译为机器码并蕴藏在可执行文件
‘hello’中。机器码的文件名是通过 -o
选项指定的。该选项普通作为命令行中的最后二个参数。假诺被略去,输出文件暗中同意为
‘a.out’。

注意到假定当前目录中与可执行文件重名的文书已经存在,它将被掩盖。

选项 -Wall
开启编译器大约拥有常用的警告──强烈提议你一贯使用该采纳。编译器有广大别的的警戒选项,但
-Wall 是最常用的。默许情形下GCC 不会暴发任何警告音讯。当编辑 C 或
C%2B%2B 程序时编译器警告十一分有助于检测程序存在的难点。
*留神即便有用到math.h库等非gcc暗许调用的标准库,请使用-lm参数 *

本例中,编译器使用了 -Wall
选项而没发出其余警示,因为示例程序是完全合法的。

选项 “”-g””
表示在扭转的对象文件中带调试音讯,调试消息可以在程序格外中止发生core后,辅助分析错误爆发的源头,包含发生错误的文书名和行号等丰盛多一蹴而就的音信。

要运转该程序,输入可执行文件的门径如下:

> $ ./hello
> Hello, world!

那将可执行文件载入内存,并使 CPU 开端履行其涵盖的通令。 路径 ./
指代当前目录,由此 ./hello 载入并执行当前目录下的可执行文件
‘hello’。

Necognitron->LeCun->LeNet->AlexNet
->网络加深:VGG16->VGG19
->增强卷积层成效:NIN->谷歌(Google)Net->Incption V3 Incption V4
->
二者组合ResNet
->分类职责到检测职分:KCNN->Fast奔驰M级CNN->法斯特er-CNN
->伸张新成效模块:FCN->STNet->CNN+CR-VM/LSTM
卷积神经互联网起源神经认知机(neocognitron)模型,现身卷积结构。第二个卷积神经网络模型LeCun,1987年,发明人LeCun。杂谈
http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf。径向基函数(radial
basis function
RBF)。1998年,LeCun,LeNet。http://vision.stanford.edu/cs598\_spring07/papers/Lecun98.pdf。SVM
手工设计特征分类器。ReLU,Dropout
,GPU,大数量,2011年历史性突破亚历克斯Net。

捕捉错误

看来,当用 C 或 C%2B%2B
编程时,编译器警告是丰富关键的臂膀。为了评释那点,上面的例子包涵壹个神秘的错误:为二个整数值错误地钦命了一浮点数控制符‘%f’。

> #include > > int main (void)
> {
> printf (“Two plus two is %fn”, 4);
> return 0;
> }

一眼看去该错误并不明了,不过它可被编译器捕捉到,只要启用了警示选项
-Wall

编译上面的主次‘bad.c’,将取得如下的音信:

> $ gcc -Wall -o bad bad.c
> main.c: 在函数‘main’中:
> main.c:5: 警告: 格式‘%f’必要类型‘double’,但实参 2 的品类为‘int’

那申明文件 ‘bad.c’第 6 行中的格式字符串用法不得法。GCC
的消息总是有着上边的格式
文件名:行号:消息。编译器对不当与告诫分化对待,前者将阻止编译,后者表明只怕存在的题材但并不阻拦程序编译。

本例中,对整数值来说,正确的格式控制符应该是 %d

假定不启用 -Wall,程序表面看起来编译不奇怪,可是会发生不正确的结果:

> $ gcc bad.c -o bad
> $ ./bad
> Two plus two is 0.000000

大庭广众,开发顺序时不检查警告是非凡惊险的。如若有函数使用不当,将或许导致程序崩溃或发生错误的结果。开启编译器警告选项
-Wall 可捕捉 C 编程时的一大半常见错误。

网络加深。

编译多少个源文件

一个源程序可以分为多少个文本。那样便于编辑与精通,越发是先后非凡大的时候。那也使各部分单独编译成为或者。

上边的事例中我们将顺序 Hello World 分割成 3
个文件:‘hello.c’,‘hello_fn.c’和头文件‘hello.h’。那是主程序‘hello.c’:

> #include “hello.h”
> int main(void)
> {
> hello (“world”);
> return 0;
> }

在此前例子的‘hello.c’中,我们调用的是库函数
printf,本例中大家用3个定义在文书‘hello_fn.c’中的函数 hello
取代它。

主程序中包括有头文件‘hello.h’,该头文件包罗函数 hello
的注脚。大家不须求在‘hello.c’文件中隐含系统头文件‘stdio.h’来注明函数
printf,因为‘hello.c’没有直接调用 printf

文件‘hello.h’中的申明只用了一行就内定了函数 hello 的原型。

> void hello (const char * name);

函数 hello 的概念在文书‘hello_fn.c’中:

> #include
> #include “hello.h” > > void hello (const char * name)
> {
> printf (“Hello, %s!n”, name);
> }

语句 #include “FILE.h” 与 *#include *
有所不相同:前者在检索系统头文件目录从前将先在当前目录中寻找文件‘FILE.h’,后者只搜索系统头文件而不查看当前目录。

要用gcc编译以上源文件,使用上边的吩咐:

> $ gcc -Wall hello.c hello_fn.c -o newhello

本例中,我们运用选项 -o 为可执行文件钦赐了三个不比的名字
newhello。注意到头文件‘hello.h’并未在命令行中钦点。源文件中的的
#include “hello.h” 指示符使得编译器自动将其包括到适合的岗位。

要运营本程序,输入可执行文件的路线名:

> $ ./newhello
> Hello, world!

源程序各部分被编译为单纯的可执行文件,它与大家原先的事例暴发的结果一律。

LeNet。输入层32×32,图像预处理reshape,潜在明显特点现身在最高层特征监测卷积核中央。卷积层一个(C① 、C三 、C5),增强原信号特征、下跌噪声,在线演示:
https://graphics.stanford.edu/courses/cs178/applets/convolution.html
差别卷积核输出特征映射不一样。降采样层3个(S二 、S4),下落网络练习参数、模型过拟合程度,最大池化(max
pooling)选中区域最大值,平均值池化(mean
pooling)选中区域平均值。全连接层三个(F6),输入向量和权重向量点积加偏置,传给sigmoid函数,发生单元i状态。输出层(高斯连接),欧式径向基函数(Euclidean
radial basis
funtion)单元,拾一个序列对应十二个通往基函数单元,各个单元8六个输入,输出RBF单元计量输入向量和序列标记向量欧式距离,越远越大。

简单的 Makefile 文件

为便利不熟练 make 的读者精晓,本节提供3个简练的用法示例。Make
凭借自身的优势,可在具备的 Unix
系统中被找到。要了然有关Gnu make 的越来越多消息,请参见 Richard M. Stallman
和 罗兰 McGrath 编写的 GNU Make 手册。

Make 从
makefile(默许是当前目录下的名为‘Makefile’的文书)中读取项目的讲述。makefile指定了一名目繁多目标(比如可执行文件)和依赖(比如对象文件和源文件)的编译规则,其格式如下:

> 目标: 依赖
> 命令

对每多少个目的,make
检查其相应的体贴文件修改时间来明确该目的是或不是必要动用对应的命令重新确立。注意到,makefile
命令行必须以单个的 TAB 字符举办缩进,不只怕是空格。

GNU Make 包涵众多暗中认可的规则(参考隐含平整)来简化 makefile
的打造。比如说,它们钦命‘.o’文件可以通过编译‘.c’文件获得,可执行文件可以透过将‘.o’链接到一起得到。隐含规则通过被称为make变量的东西所内定,比如
CC(C 语言编译器)和
CFLAGS(C程序的编译选项);在makefile文件中它们通过垄断一行的
变量=值 的样式被安装。对 C%2B%2B
,其等价的变量是CXXCXXFLAGS,而变量CPPFLAGS则是编译预处理选项。

至今我们为上一节的门类写2个简易的 makefile 文件:

> CC=gcc
> CFLAGS=-Wall
> hello: hello.o hellofn.o
> clean:
> rm -f hello hello.o hello
fn.o

该文件可以这么来读:使用 C 语言编译器
gcc,和编译选项‘-沃尔’,从目的文件‘hello.o’和‘hello_fn.o’生成靶子可执行文件
hello(文件‘hello.o’和‘hello_fn.o’通过隐含规则分别由‘hello.c’和‘hello_fn.c’生成)。目标clean尚未借助文件,它只是简单地移除全部编译生成的文书。rm指令的选项
‘-f’(force) 抑制文件不设有时爆发的谬误消息。

其它,必要留意的是,如果含有main函数的cpp文件为A.cpp,
makefile中最好把可执行文件名也写成 A。

要采用该 makefile 文件,输入
make。不加参数调用make时,makefile文件中的第3个目标被确立,从而生成可执行文件‘hello’:

> $ make
> gcc -Wall -c -o hello.o hello.c
> gcc -Wall -c -o hello_fn.o hello_fn.c
> gcc hello.o hello_fn.o -o hello
> $ ./hello
> Hello, world!

二个源文件被涂改要重复生成可执行文件,简单地重复输入 make
即可。通过检核对象文件和着重性文件的时刻戳,程序 make
可辨识哪些文件已经修改并依据对应的规则更新其相应的目的文件:

> $ vim hello.c (打开编辑器修改一下文本)
> $ make
> gcc -Wall -c -o hello.o hello.c
> gcc hello.o hello_fn.o -o hello
> $ ./hello
> Hello, world!

末尾,大家移除 make 生成的文书,输入 make clean:

> $ make clean
> rm -f hello hello.o hello_fn.o

一个规范的 makefile文件一般包括用于安装(make
install
)和测试(make
check)等额外的对象。

正文中提到到的例子都充足简单以至于可以完全不须求makefile,不过对其余大些的次序都使用
make 是很有必不可少的。

亚历克斯Net,二零一三年,杰弗里 Hintion及学生Alex Krizhevsky、Ilya
Sutskever,《ImageNet Classification with Deep Convolutional Neural
Networks》。差异GPU处理图像的不一致部分,仅在有个别层通讯。多少个卷积层,三个全连接层,5000万个可调参数。最后全连接层输出到一千维softmax层,暴发覆盖壹仟类标志分布。幸免过拟合,Dropout
0.5几率隐藏层神经元输出置0,共享权值,下降互适应,收敛迭代次数增添一倍。数据拉长(data
augmentation)变形(水平翻转图像、反射变化flip,原始图像随机平移变换crop,随机光照、彩色变换、颜色抖动)增添新数据。非线性激活函数,ReLU,收敛速度比sigmoid/tanh快。大数额陶冶,120万ImageNet图像数据。GPU完毕,直接从GPU内存读出、写入。L牧马人N(local
response normalization)规范化层。

链接外部库

库是预编译的目的文件(object
files)的汇集,它们可被链接进程序。静态库将来缀为‘.a’的非正规的存档文件(archive
file)
存储。

专业种类库可在目录 /usr/lib/lib 中找到。比如,在类
Unix 系统中 C 语言的数学库一般存储为文件
/usr/lib/libm.a。该库中函数的原型申明在头文件
/usr/include/math.h 中。C 标准库本身蕴藏为
/usr/lib/libc.a,它富含 ANSI/ISO C
标准钦点的函数,比如‘printf’。对每一个 C 程序来说,libc.a 都私行认同被链接。

上面的是一个调用数学库 libm.asin
函数的的事例,创立文件calc.c

> #include
> #include > > int main (void)
> {
> double x = 2.0;
> double y = sin (x);
> printf (“The value of sin(2.0) is %fn”, y);
> return 0;
> }

尝试独立从该文件生成3个可执行文件将造成2个链接阶段的荒谬:

> $ gcc -Wall calc.c -o calc
> /tmp/ccbR6Ojm.o: In function ‘main’:
> /tmp/ccbR6Ojm.o(.text%2B0×19): undefined reference to ‘sin’

函数
sin,未在本程序中定义也不在暗中同意库‘libc.a’中;除非被指定,编译器也不会链接‘libm.a’。

为使编译器能将 sin
链接进主程序‘calc.c’,大家要求提供数学库‘libm.a’。二个便于想到但比较费心的做法是在指令行中显式地钦赐它:

> $ gcc -Wall calc.c /usr/lib/libm.a -o calc

函数库‘libm.a’包括全部数学函数的靶子文件,比如sin,cos,exp,logsqrt。链接器将追寻全数文件来找到包蕴
sin 的目的文件。

如若包涵 sin
的对象文件被找到,主程序就能被链接,三个完整的可执行文件就可生成了:

> $ ./calc
> The value of sin(2.0) is 0.909297

可执行文件包蕴主程序的机器码以及函数库‘libm.a’中 sin 对应的机器码。

为避免在命令行中指定长长的路径,编译器为链接函数库提供了急迅的选项‘-l’。例如,上边的一声令下

> $ gcc -Wall calc.c -lm -o calc

与我们地点点名库全路线‘/usr/lib/libm.a’的通令等价。

相似的话,选项 -l*NAME使链接器尝试链接系统库目录中的函数库文件
lib
NAME*.a。二个重型的程序经常要运用过多 -l
选项来指定要链接的数学库,图形库,网络库等。

拉长卷积层成效。

编译C%2B%2B与Fortran

GCC 是 GNU 编译器集合(GNU Compiler Collection)的首字母缩写词。GNU
编译器集合包括C,C%2B%2B,Objective-C,Fortran,Java
和 Ada 的前端以及那么些语言对应的库(libstdc%2B%2B,libgcj,……)。

前方大家只涉嫌到 C 语言,那么哪些用 gcc 编译其余语言呢?本节将不难介绍
C%2B%2B 和 Fortran 编译的例子。

先是我们尝试编译不难的 C%2B%2B 的经文程序 Hello world

> #include
> int main(int argc,char *argv[])
> {
> std::cout }

将文件保留为‘hello.cpp’,用 gcc 编译,结果如下:

> $ gcc -Wall hello.cpp -o hello
> /tmp/cch6oUy9.o: In function
_\_static\_initialization\_and\_destruction_0(int, int)’:<br /> &gt; hello.cpp:(.text%2B0×23): undefined reference tostd::iosbase::Init::Init()’
> /tmp/cch6oUy9.o: In function
_\_tcf\_0′:<br /> &gt; hello.cpp:(.text%2B0x6c): undefined reference tostd::ios
base::Init::~Init()’
> /tmp/cch6oUy9.o: In function
main’:<br /> &gt; hello.cpp:(.text%2B0x8e): undefined reference tostd::cout’
> hello.cpp:(.text%2B0×93): undefined reference to
std::basic\_ostream&amp; std::operator /tmp/cch6oUy9.o:(.eh\_frame%2B0×11): undefined reference to__gxx_personality_v0′
> collect2: ld returned 1 exit status

出错了!!而且荒唐还很多,很难看懂,这可如何做吧?在诠释从前,大家先试行上边的吩咐:

> $ gcc -Wall hello.cpp -o hello -lstdc%2B%2B

噫,加上-lstdc%2B%2B选项后,编译竟然通过了,而且从不其余警示。运行程序,结果如下:

> $ ./hello
> hello, world

通过上节,大家得以知道,-lstdc%2B%2B 选项用来文告链接器链接静态库
libstdc%2B%2B.a。而从字面上可以看来,libstdc%2B%2B.a 是C%2B%2B
的标准库,那样一来,上边的标题我们就简单了解了──编译 C%2B%2B
程序,要求链接 C%2B%2B 的函数库 libstdc%2B%2B.a。

编译 C 的时候大家不要求钦赐 C 的函数库,为啥 C%2B%2B
要内定呢?那是出于前期 gcc 是指 GNU 的 C 语言编译器(GNU C
Compiler),随着 C%2B%2B,Fortran 等语言的投入,gcc的意义才转移成了 GNU
编译器集合(GNU Compiler Collection)。C作为 gcc
的原生语言,故编译时不需附加的选项。

唯独幸运的是,GCC 包涵专门为 C%2B%2B 、Fortran
等语言的编译器前端。于是,下面的例子,大家可以直接用如下命令编译:

> $ g%2B%2B -Wall hello.cpp -o hello

GCC 的 C%2B%2B 前端是 g%2B%2B,而 Fortran 的情况则某个复杂:在 gcc-4.0
版本以前,Fortran 前端是 g77,而gcc-4.0之后的本子对应的 Fortran
前端则改为 gfortran。下边大家先写3个简练的 Fortran 示例程序:

> C Fortran 示例程序
> PROGRAM HELLOWORLD
> WRITE(*,10)
> 10 FORMAT(‘hello, world’)
> END PROGRAM HELLOWORLD

将文件保留‘hello.f’,用 GCC 的 Fortran 前端编译运行该公文

> $ gfortran -Wall hello.f -o hello
> $ ./hello
> hello, world

咱俩已经通晓,直接用 gcc 来编译 C%2B%2B 时,需求链接 C%2B%2B
标准库,那么用 gcc 编译 Fortran时,命令该怎么写吗?

> $ gcc -Wall hello.f -o helloworld -lgfortran -lgfortranbegin

注意:上面那条命令与 gfortran 前端是等价的(g77
与此稍有不一致)。其中库文件 libgfortranbegin.a (通过命令行选项
-lgfortranbegin 被调用) 包罗运维和平息二个 Fortran
程序所不可不的开首和退出代码。库文件 libgfortran.a 包括 Fortran
底层的输入输出等所须求的运作函数。

对于 g77 来说,上面两条命令是等价的(注意到 g77 对应的 gcc 是 4.0
以前的版本):

> $ g77 -Wall hello.f -o hello
> $ gcc-3.4 -Wall hello.f -o hello -lfrtbegin -lg2c

命令行中的八个库文件分别包涵 Fortran 的发端和剥离代码以及 Fortran
底层的运转函数。

正文翻译自 An Introduction to
GCC
的一部分章节(有转移)

来源:http://wiki.ubuntu.org.cn/

VGGNet,Karen simonyan、Andrew Zisserman 《Very Deep Convolutional
Networks for Large_Scale Visual
Recognition》http://www.robots.ox.ac.uk/~vgg/research/very\_deep/
。4个卷积组(8-16层)、2层全连接层图像特点,1层全连接分类特征。加深卷积层数达到准确率进步瓶颈。

GoogleNet。NIN(Network in Network)思想,Min Lin、Qiang Chen、Shuicheng
Yan论文《Network In Network》https://arxiv.org/abs/1312.4400
。线性卷积层(linear convolution layer)变多层感知卷积层(multilayer
perceptron),全连接层改为全局平均池化。二零一五年 谷歌(Google)Net(英斯ption
V1),Christian Szegedy、Wei Liu散文《Going Deeper with
Convolutions》https://arxiv.org/abs/1409.4842
。使用1×1卷积核降维,在全连接层连接1×1、3x三 、5×5卷积结果。宽度、深度增加,加快。层数更深,22层,差别深度扩展两上损失函数避免反向传来梯度消失。增加三种高低卷积核,降维英斯ption模型,1×1卷积核降低特征映射厚度。

结合网络加深和增强卷积模块作用。

ResNet。2014年,ILSV中华VC不珍爱外部数据物体检测、物体识别项目亚军,MSRA
何凯明,152层。ImageNet
分类、检测、定位、COCO数据集检测(deteciton)、分隔(segmentation)亚军。Kaiming
He、Xiangyu Zhang、Shaoqing Ren、Jian Sun《Deep Residual Learning for
Image Recognition》 https://arxiv.org/abs/1512.03385 。互联网退化(network
degradation),shortcut结构,输入跳层传递加卷积结果。残差(residual),复杂非线性映射H(x)预测图片分类,残差函数(residual
function)F(x)=H(x)-x,优化残差映射比一向优化H(x)大致。

从分类职责到检测职分。图片目的检测,摄像目的检测(VID)。

LAND-CNN,Region Proposal
Networks(奥迪Q5PN)和CNN结合。EscortPNs,任意尺寸图片一层层带识别物体几率分数提出区域。使用小互联网在最终卷积特征映射滑动扫描,滑动网络每便与特征映射窗口全连接,映射到低维向量,送入多少个全连接层(box回归层box-regression
layer和box分类层box-classification
layer)。重复计算,几千个提议区域(region)相互重叠,数拾一回重复提取天性。
Fast奥迪Q5-CNN,加快版本,最后指出区域映射CNN最后卷积层特征映射,一张图片只领到五遍特征,进步速度,瓶颈在EscortPN,帮忙多类物体同时检测,行人车辆检测技能。
Fater-陆风X8-CNN,OdysseyPN交给CNN做,达到实时。Shaoqing Ren、Kaiming He、RossGirshick、Jian Sun散文《Faster Escort-CNN:Towards Real-Time Object Detection
with Region Proposal Networks》 https://arxiv.org/abs/1506.01497

充实新效率模块。

FCN(反卷积)、STNet、CNN与TiguanNN/LSTM混合结构。

MNIST 亚历克斯Net完毕。互连网布局图。
1、仔细研读互联网舆论,领悟每一层输入、输出值、网络布局。
2、依据加载数据、定义互联网模型、陶冶模型、评估模型步骤达成网络。

https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3\_NeuralNetworks/convolutional\_network.py

https://github.com/tensorflow/models/blob/master/tutorials/image/alexnet/alexnet\_benchmark.py

#!/usr/bin/python
# -*- coding:utf8 -*-
# 输入数据
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(“/tmp/data/”, one_hot=True)
import tensorflow as tf
# 定义网络超参数
learning_rate = 0.001
training_iters = 20000
batch_size = 128
display_step = 10
# 定义网络参数
n_input = 784 # 输入的维度(img shape:28×28)
n_classes = 10 # 标记的维度(0-9 digits)
dropout = 0.75 # Dropout 的几率,输出只怕性
# 占位符输入
x = tf.placeholder(tf.float32, [None, n_input])
y = tf.placeholder(tf.float32, [None, n_classes])
keep_prob = tf.placeholder(tf.float32) #dropout
# 卷积操作
def conv2d(name, x, W, b,strides=1):
x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1],
padding=’SAME’)
x = tf.nn.bias_add(x, b)
return tf.nn.relu(x, name=name) #用relu激活函数
# 最大下采样操作
def maxpool2d(name, x, k=2):
return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1],
padding=’SAME’, name=name)
# 规范化操作
def norm(name, l_input, lsize=4):
return tf.nn.lrn(l_input, lsize, bias=1.0, alpha=0.001 / 9.0,
beta=0.75, name=name)
# 全体的互连网参数
weights = {
‘wc1’: tf.Variable(tf.random_normal([11, 11, 1, 96])),
‘wc2’: tf.Variable(tf.random_normal([5, 5, 96, 256])),
‘wc3’: tf.Variable(tf.random_normal([3, 3, 256, 384])),
‘wc4’: tf.Variable(tf.random_normal([3, 3, 384, 384])),
‘wc5’: tf.Variable(tf.random_normal([3, 3, 384, 256])),
‘wd1’: tf.Variable(tf.random_normal([4*4*256, 4096])),
‘wd2’: tf.Variable(tf.random_normal([4096, 4096])),
‘out’: tf.Variable(tf.random_normal([4096, 10]))
}
biases = {
‘bc1’: tf.Variable(tf.random_normal([96])),
‘bc2’: tf.Variable(tf.random_normal([256])),
‘bc3’: tf.Variable(tf.random_normal([384])),
‘bc4’: tf.Variable(tf.random_normal([384])),
‘bc5’: tf.Variable(tf.random_normal([256])),
‘bd1’: tf.Variable(tf.random_normal([4096])),
‘bd2’: tf.Variable(tf.random_normal([4096])),
‘out’: tf.Variable(tf.random_normal([n_classes]))
}
# 定义亚历克斯Net网络模型
def alex_net(x, weights, biases, dropout):
# 向量转为矩阵
x = tf.reshape(x, shape=[-1, 28, 28, 1])
# 第2卷积层
# 卷积
conv1 = conv2d(‘conv1’, x, weights[‘wc1’], biases[‘bc1’])
# 最大池化(向下采样)
pool1 = max_pool(‘pool1’, conv1, k=2)
# 规范化(归一化)
norm1 = norm(‘norm1’, pool1, lsize=4)
# 第1卷积层
# 卷积
conv2 = conv2d(‘conv2’, conv1, weights[‘wc2’], biases[‘bc2’])
# 最大池化(向下采样)
pool2 = max_pool(‘pool2’, conv2, k=2)
# 规范化(归一化)
norm2 = norm(‘norm2’, pool2, lsize=4)
# 第一卷积层
# 卷积
conv3 = conv2d(‘conv3’, conv2, weights[‘wc3’], biases[‘bc3’])
# 最大池化(向下采样)
pool3 = max_pool(‘pool3’, conv3, k=2)
# 规范化(归一化)
norm3 = norm(‘norm3’, pool3, lsize=4)
# 第陆卷积层
conv4 = conv2d(‘conv4’, conv3, weights[‘wc4’], biases[‘bc4’])
# 最大池化(向下采样)
pool4 = max_pool(‘pool4’, conv4, k=2)
# 规范化(归一化)
norm4 = norm(‘norm4’, pool4, lsize=4)
# 第六卷积层
conv5 = conv2d(‘conv5’, conv4, weights[‘wc5’], biases[‘bc5’])
# 最大池化(向下采样)
pool5 = max_pool(‘pool5’, conv4, k=2)
# 规范化(归一化)
norm5 = norm(‘norm5’, pool5, lsize=4)
# 第二全连接层,先把特征图转为向量
fc1 = tf.reshape(norm5, [-1,
weights[‘wd1’].get_shape().as_list()[0]])
fc1 = tf.add(tf.matmul(fc1, weights[‘wd1’]), biases[‘bd1’])
fc1 = tf.nn.relu(fc1)
# Dropout
fc1 = tf.nn.dropout(fc1, dropout)
# 第叁全连接层
fc2 = tf.reshape(fc1, [-1,
weights[‘wd1’].get_shape().as_list()[0]])
fc2 = tf.add(tf.matmul(fc2, weights[‘wd1’]), biases[‘bd1’])
fc2 = tf.nn.relu(fc2)
# Dropout
fc2 = tf.nn.dropout(fc2, dropout)
# 互联网输出层
out = tf.add(tf.matmul(fc2, weights[‘out’]), biases[‘out’])
return out
# 创设模型
pred = alex_net(x, weights, biases, keep_prob)
# 定义损失函数、优化器(学习步长)
cost =
tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred,
labels=y))
optimizer =
tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
# 评估函数
correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
# 磨炼模型和评估模型
# 伊始化全部的共享变量
init = tf.global_variables_initializer()
# 开启壹个陶冶
with tf.Session() as sess:
sess.run(init)
step = 1
# 初始锻练,直到达到training_iters,即200000
while step * batch_size < training_iters:
# 获取批数量
batch_x, batch_y = mnist.train.next_batch(batch_size)
sess.run(optimizer, feed_dict={x: batch_x, y: batch_y, keep_prob:
dropout})
if step % display_step == 0:
# 总括损失值和准确度,输出
loss, acc = sess.run([cost, accuracy], feed_dict={x: batch_x, y:
batch_y, keep_prob: 1.})
print “Iter ” + str(step*batch_size) + “, Minibatch Loss= ” +
“{:.6f}”.format(loss) + “, Training Accuracy= ” + “{:.5f}”.format(acc)
step += 1
print “Optimization Finished!”
# 总括测试精度
print “Testing Accuracy:”, sess.run(accuracy, feed_dict={x:
mnist.test.images[:256], y: mnist.test.labels[:256], keep_prob:
1.})

参考资料:
《TensorFlow技术解析与实战》

迎接推荐上海机械学习工作机遇,小编的微信:qingxingfengzi

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图