从Keras开始掌握深度学习-1 环境搭建与简单入门

什么是Keras,为什么要学Keras

在学习深度学习的过程中,有些人用的是MatLab,有些人用的Python。而使用Python的同学必定也用过Tensorflow、PyTorch这些机器学习库。但通过Tensorflow等这些库来实现我们的深度学习模型的时候仍然需要大量的编程,对诸如前向传递、后向传递、优化算法等方法都要自己去通过编程实现。这对于初学者来说简直就是噩梦一样。
相比来说,Keras是一个高层神经网络API,Keras由纯Python编写而成并基TensorflowTheano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果。
Keras的Sequential模型API可以让我们通过简单地操作将神经网络的层加入到模型中,下面通过一个简单的例子来看我们是怎样通过Sequential的API来实现一个神经网络模型的。

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten()) # input layer
model.add(tf.keras.layers.Dense(128,activation=tf.nn.relu)) # hidden layer
model.add(tf.keras.layers.Dense(128,activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(10,activation=tf.nn.softmax))

在Keras中,通过仅仅5行代码就可以实现一个MLP多层感知机的神经网络模型,而在TensorFlow中相应的代码往往是上百行。Keras的方便性可见一斑。

环境搭建

在学习了这么久的机器学习过后,Windows、Linux下的环境也应该搭建了很多次。由于Keras的后端我们选择使用TensorFlow,因此整个环境的搭建便不需要过多地浪费笔墨。
在进一步进行学习之前,我推荐大家通过VirtualEnv或者Anaconda来创建Python的虚拟环境,这样我们安装的软件包不会相互影响,使得针对机器学习开发与桌面软件或服务器开发的不同虚拟环境相对干净。
这里以Anaconda为例说明环境搭建的要求。
环境要求:
1、Anaconda(要求安装Python3版本)
2、TensorFlow*
3、Keras*
4、Jupyter Notebook*
5、CUDA和CuDNN
上述各个软件的安装这里不再赘述,前面的教程里面有相应的讲解。带有星号的则是可以通过pip指令进行安装的。
在安装完毕之后,我们来到CMD控制台(Windows环境下),输入如下命令来建立虚拟环境。

conda create --name tensorflow python=3.*

python的版本具体由安装的时候的版本来指定,如安装的是Python3.6的Anaconda则指定python=3.6
使用如下指令激活虚拟环境

activate tensorflow

在激活虚拟环境之后,我们的控制台提示前面会加入(tensorflow)D:\dev\pythonwork>的提示。
使用如下指令退出虚拟环境

deactivate tensorflow

在激活了环境之后通过简单地pip install指令来安装TensorFlow与Keras。安装完毕之后使用jupyter notebook来打开Jupyter交互式编译器。

Keras简单入门——实现MLP手写体识别

说到神经网络的入门,有何人想不到MNIST呢?
对于本教程的Keras的简单入门,我们也将编写一个多层感知机的MNIST手写数字识别的神经网络。通过这个教程你将会真正意义上地感受到Keras的好处。
首先导入TensorFlow和Keras的包。

import tensorflow as tf
import keras

上述代码在Jupyter Notebook这个交互式的笔记本中看起来是这样的。


Jupyter Notebook中的代码

通过选中这一行,并且点击Run按钮,我们可以只运行这一行代码,这使得当我们需要修改代码的时候从修改的地方开始执行,而不是执行全部代码。这也是我们为何选择Jupyter Notebook来进行学习,而不是选择诸如PyCharm等IDE进行学习的原因。
在导入完TensorFlow和Keras两个包之后,我们通过keras自带的方法来加载MNIST的数据集,并通过load_data的方法解包(unpack)到训练集和测试集。

mnist = keras.datasets.mnist # 28x28大小的图像的0-9数字的手写体数据集
(x_train,y_train),(x_test,y_test) = mnist.load_data()

在准备好训练集和测试集之后,让我们先来看看MNIST中的数据到底是怎样的格式的。通过print(x_train[0])输出训练集的第一个28x28的图像数据。

[...
 [  0   0   0   0   0   0   0   0   0   0   0   0   3  18  18  18 126 136
  175  26 166 255 247 127   0   0   0   0]
 [  0   0   0   0   0   0   0   0  30  36  94 154 170 253 253 253 253 253
  225 172 253 242 195  64   0   0   0   0]
 [  0   0   0   0   0   0   0  49 238 253 253 253 253 253 253 253 253 251
   93  82  82  56  39   0   0   0   0   0]
 [  0   0   0   0   0   0   0  18 219 253 253 253 253 253 198 182 247 241
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  80 156 107 253 253 205  11   0  43 154
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0  14   1 154 253  90   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
...]

可以看到这是一个28x28的二维数组,元素的取值从0到255。也就是说,MNIST手写数字数据集中的图片是单通道的灰度图片。单纯地从数值的角度来看这张图片十分烧脑,甚至看不出这是一个数字,那么这时我可以通过matplotlib.pyplot来进行绘图。如果你有相应的经验,那么可以自己继续写下去,然后将上面的数字显示出来,之后再回来看下面的代码。
在继续进行之前,先导入matplotlib.pyplot的包,然后使用plt的imshow来显示图像。

import matplotlib.pyplot as plt

plt.imshow(x_train[0], cmap='gray')
plt.show()
x_train[0]的图像

通过pyplot我们可以很明显地看到,x_train[0]是一个数值为5的手写数字。
在继续下去之前,我们还需要对MNIST的数据进行一些简单地处理,将0-255的整数标准化为0-1的范围之间的浮点数。幸运的是,Keras给我们提供了将这些数值标准化的方法。

x_train=keras.utils.normalize(x_train,axis=1)
x_test=keras.utils.normalize(x_test,axis=1)

通过keras.utils.normalize我们可以轻松地将测试集和数据集标准化。

标准化之后的图像

那么接下来便是重头戏了,也就是我们在开头所说过的,通过Keras的Sequential模型来构建这个多层感知机的模型。如果你对于神经网络不很了解,不知道什么是多层感知机的话,可以看一下我前面写的机器学习相关的文章。
在Keras中,使用Sequential模型十分简单通过keras.models.Sequential来创建一个模型对象,然后依次调用add来添加层,层添加的顺序则是从输入层到输出层的顺序。最后,我们通过compile来编译这个模型,在编译的时候需要指定模型的优化算法、损失函数和评价指标。

model = keras.models.Sequential()
model.add(keras.layers.Flatten()) # input layer
model.add(keras.layers.Dense(128,activation=tf.nn.relu)) # hidden layer
model.add(keras.layers.Dense(128,activation=tf.nn.relu))
model.add(keras.layers.Dense(10,activation=tf.nn.softmax))

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
             metrics=['accuracy'])

上述6行代码则完整地定义了这个MLP的模型。首先是输入层,输入层指定是Flatten(扁平)的,也就是把二维的图像数据一维化,输入多层感知机。然后通过Dense创建2个128个神经元的全连接层,该全连接层使用ReLU作为激活函数。最后再创建一个与上一个隐藏层全连接的具有10个输出的全连接层作为输出层,通过SoftMax函数将输出映射为0~9的10个概率的输出。
最后通过model.fit(x_train,y_train,epochs=3)开始指定训练集、测试集和epochs来进行训练。训练时的输出如下:

Epoch 1/3
60000/60000 [==============================] - 7s 115us/step - loss: 0.2641 - acc: 0.9229
Epoch 2/3
60000/60000 [==============================] - 5s 84us/step - loss: 0.1073 - acc: 0.9662
Epoch 3/3
60000/60000 [==============================] - 5s 84us/step - loss: 0.0726 - acc: 0.9775

可以看到,通过3个epochs的训练过后,网络的损失达到了0.07,准确率达到了97.75%。但这只是对测试集的训练得到的结果,有时模型会出现过拟合的情况,此时便需要通过对模型没有遇见过的验证集的数据进行测试。

val_loss,val_acc=model.evaluate(x_test,y_test)
print(val_loss,val_acc)

运行评估之后,针对验证集输出如下:

10000/10000 [==============================] - 0s 47us/step
0.0927426937890239 0.9701

由此可见,针对验证集进行评估之后,模型的损失为0.0927、准确率为97.01%。这证明模型并未出现过拟合。
通过predictions = model.predict([x_test])针对x_test进行预测,使用numpy的argmax方法来得到相应预测的值应该是多少。
将预测的结果使用pyplot可视化显示出来便可以看出预测是否是对的。

predictions = model.predict([x_test])

import numpy as np
print(np.argmax(predictions[0]))

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

推荐阅读更多精彩内容