一、搭建属于你的第一个神经网络


文章代码来源:《deep learning on keras》,非常好的一本书,大家如果英语好,推荐直接阅读该书,如果时间不够,可以看看此系列文章,文章为我自己翻译的内容加上自己的一些思考,水平有限,多有不足,请多指正,翻译版权所有,若有转载,请先联系本人。
个人方向为数值计算,日后会向深度学习和计算问题的融合方面靠近,若有相近专业人士,欢迎联系。


系列文章:
一、搭建属于你的第一个神经网络
二、训练完的网络去哪里找
三、【keras实战】波士顿房价预测
四、keras的function API
五、keras callbacks使用
六、机器学习基础Ⅰ:机器学习的四个标签
七、机器学习基础Ⅱ:评估机器学习模型
八、机器学习基础Ⅲ:数据预处理、特征工程和特征学习
九、机器学习基础Ⅳ:过拟合和欠拟合
十、机器学习基础Ⅴ:机器学习的一般流程十一、计算机视觉中的深度学习:卷积神经网络介绍
十二、计算机视觉中的深度学习:从零开始训练卷积网络
十三、计算机视觉中的深度学习:使用预训练网络
十四、计算机视觉中的神经网络:可视化卷积网络所学到的东西


还记得第一次跑出自己的神经网络的那种欣喜感,仿佛是看着自己的第一个孩子出生了一样。为了让更多人尽快也体验的这种欣喜感,特此总结此系列教程,代码来自书<deep learning on keras>.
简要介绍一下我们需要的:

  • 安装annaconda,它自带的很多科学计算包能够省掉很多我们自己安装的麻烦
  • 打开cmd,输入pip install tensorflow,默认安装的是cpu版tensorflow,对于我们这新手级别的,已经够用了,要装gpu版比较麻烦
  • 在装好tensorflow以后再pip install keras,这个keras是基于tensorflow或者caffe的,我习惯使用tensorflow,keras是在tensorflow上的进一步封装,使用起来非常简单,我们只需要把精力放在网络结构的搭建上就够了。

引入库和数据集

此处我们引入MNIST数据集,这是一个手写数字数据集,由60000个训练集和10000个测试集构成。

import keras
from keras.datasets import mnist
(trainimages, trainlabels), (testimages, testlabels) = mnist.loaddata()

这句代码表示调用数据集mnist,把训练图片和标签分别存到trainimages和trainlabels里面,测试图片和标签分别存在testimages和testlabels里面。
接下来我们看一看具体是如何储存这些数据的:

>>> train_images.shape
(60000, 28, 28)
>>> len(train_labels)
60000
>>> train_labels
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)

我们看到计算机使用数组的形式来储存这些数据,(60000,28,28)代表着有60000个图片,每一个的大小是28*28。而labels则更加直接,每一个位置对应于图片的位置为数字的大小。
接下来,看一下测试集的情况,其实完全类似:

>>> test_images.shape
(10000, 28, 28)
>>> len(test_labels)
10000
>>> test_labels
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)

搭建训练框架

from keras import models
from keras import layers
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))

我们从keras引入了models 和layers,前者用来搭建整个模型框架。

  • models.Sequential()这一句代表我们之后加layers是按照顺序从前往后加。
  • 至于layers.Dense则是设置这一层的具体参数第一个为输出维度,第二项为激活函数类型,第三维为输入的形状,我们看到shape的第二项逗号之后没有东西,这个是根据输入数据来自动补的,例如我们输入数据为28*28*60000个,那么第二项则是28*28*60000/28/28=60000,也就是说总数一定要是28*28的整数倍,不然会报错。
  • 第二层layers输出为10,激活函数为softmax,就是将10个输出里面最大取1,最小取0,最后就得到了我们需要的预测值,至于为什么这里不需要输入,这就是keras的好处了,它自动计算需要的输入的大小,所以我们只需要关心最开始的输入大小,不需要逐层计算每一层的大小,这对于深层网络的搭建非常方便。
network.compile(optimizer='rmsprop',
  loss='categorical_crossentropy',
  metrics=['accuracy'])

设置优化器,损失函数,还有需要显示的指标,这三个都是可以改的,大家可以help(network.compile)来查看更多有关这些参数的东西。

预处理数据和标签

train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
testimages = testimages.astype('float32') / 255

输入的图像是unit8类型的,我们转化为float32,因为python里面很多运算只支持float32类型,然后将形状拉长为28*28的,因为我们构建的网络是一个简单的全连接网络,也就是逐个像素点的预测,最后是归一化的问题,由于像素值一开始都是0-255,我曾经就感到很奇怪为什么要全部归一化到0-1,不就是等比例缩放吗,为什么会影响到收敛性呢,感兴趣的同学可以搜索神经网络正则化相关的知识。

from keras.utils import to_categorical
train_labels = to_categorical(train_labels)
testlabels = tocategorical(testlabels)

对标签下手,将原来的十个数字转化成分类的编码,这个具体为什么以后会再详细介绍。

开始训练!

>>> network.fit(train_images, train_labels, epochs=5, batch_size=128)
Epoch 1/5
60000/60000 [==============================] - 9s - loss: 0.2524 - acc: 0.927
Epoch 2/5
51328/60000 [========================>.....] - ETA: 1s - loss: 0.1035 - acc: 0.9692

keras还有一个好处就是它的可视化做的比较好,开始训练以后,有一个动态的小箭头告诉你训练到什么程度了,让人感到很舒服。再解释一下代码,第一项,放入训练数据,第二项放入对应的标签,epochs代表要训练多少批次,因为这个优化是一个循环往复的过程,需要不断的循环才能逐渐靠近最优,最后就是batch_size,这是minibatch,这也是正则化相关内容,如果每次都将全部的数据集放进来才训练一次,那么我们的训练进度就会很慢,所以我们就会把数据分成很多小批次,一次喂一点进去,而为什么偏偏是128呢,这是因为计算机是二进制的,给它2的次方的数,运算会更加快。

评估训练效果

>>> test_loss, test_acc = network.evaluate(test_images, test_labels)
>>> print('test_acc:', test_acc
testacc: 0.9785

通过上述指令,在训练完以后network输入测试集和对应的标签来进行测试。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容