查看原文
其他

深度学习第17讲:keras入门和快速上手指南

louwill Python爱好者社区 2019-04-07

作者:鲁伟
一个数据科学践行者的学习日记。数据挖掘与机器学习,R与Python,理论与实践并行。
个人公众号:数据科学家养成记 (微信ID:louwill12)


前文传送门:

深度学习笔记1:利用numpy从零搭建一个神经网络

深度学习笔记2:手写一个单隐层的神经网络

深度学习笔记3:手动搭建深度神经网络(DNN)

深度学习笔记4:深度神经网络的正则化

深度学习笔记5:正则化与dropout

深度学习笔记6:神经网络优化算法之从SGD到Adam

深度学习笔记7:Tensorflow入门

深度学习笔记8:利用Tensorflow搭建神经网络

深度学习笔记9:卷积神经网络(CNN)入门

深度学习笔记10:三维卷积、池化与全连接

深度学习笔记11:利用numpy搭建一个卷积神经网络

深度学习笔记12:卷积神经网络的Tensorflow实现

深度学习笔记13:Tensorflow实战之手写mnist手写数字识别

深度学习笔记14:CNN经典论文研读之Le-Net5及其Tensorflow实现

深度学习笔记15:ubuntu16.04 下深度学习开发环境搭建与配置

深度学习笔记16:CNN经典论文研读之AlexNet及其Tensorflow实现


      深度学习到这个进度,笔者觉得有必要开始对一些优秀的深度学习框架进行介绍了。在前面几讲中,我们着重对 Tensorflow 进行了介绍,并用其实现了一些数据例子。Tensorflow 虽然很强大,但语法和使用便利性上对于新手来说并不是那么的友好,所以到这里笔者需要给大家介绍 keras 了。

      keras 是一款使用纯 python 编写的神经网络 API,使用 keras 能够快速实现你的深度学习方案,所以 keras 有着为快速试验而生的美称。keras 以 TensorflowTheano 、CNTK 为后端,意思就是 keras 的底层计算都是以以上这些框架为基础的,这使得 keras 能够专注于快速搭建起神经网络模型。

keras 搭建神经网络的基本流程

      利用 keras 搭建神经网络模型非常快速和高效,其模型实现的核心流程可以用四个步骤来概括。具体如下:

      第一步就是设计你的网络结构(add):
      调用 
keras 神经网络的各个模块来组件你的模型架构,通过 add 方法来叠加。这一步是最需要仔细考虑的地方,关乎你的神经网络的复杂性和高效与否。简单示例如下:

from keras.layers import Dense, Activation model.add(Dense(units=64, input_dim=100)) model.add(Activation("relu")) model.add(Dense(units=10)) model.add(Activation("softmax"))

      上面的示例中,我们从 keras 的 layers 模块中导入了 Dense 全连接层、Activation 激活层,构造了一个包含两个全连接层和一个 relu 和 softmax 激活的网络模型。

      第二步是将设计好模型进行编译(compile):

model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

      第三步就是对训练数据进行拟合训练(fit):

model.fit(x_train, y_train, epoche=5, batch_size=32)

      最后就是对训练好的模型进行评估(evaluate):

loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)

      这样你就用 keras 将你的神经网络模型快速实现了。之后你可以考虑对模型进行调整和优化,但将想法和方案实现落地这个过程是非常快速的。至于 keras 的具体细节和其他的一些功能,大家可以参考keras 的官方文档:https://keras.io/

当然也有中文版的:http://keras-cn.readthedocs.io/en/latest/

keras 模拟数据例子

      下面我们用 numpy 生成的随机数的例子来使用 keras 去搭建神经网络,我们模拟一个 softmax 多分类的例子:

import keras from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD

# Generate dummy data
import numpy as np x_train = np.random.random((1000, 20)) y_train = keras.utils.to_categorical(np.random.randint(10, size=(1000, 1)), num_classes=10) x_test = np.random.random((100, 20)) y_test = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10) model = Sequential()
# Dense(64) is a fully-connected layer with 64 hidden units.
# in the first layer, you must specify the expected input data shape:# here, 20-dimensional vectors.
model.add(Dense(64, activation='relu', input_dim=20)) model.add(Dropout(0.5)) model.add(Dense(64, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax')) sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='categorical_crossentropy',              optimizer=sgd,              metrics=['accuracy']) model.fit(x_train, y_train,          epochs=20,          batch_size=128) score = model.evaluate(x_test, y_test, batch_size=128)

      模型训练:

      模型总结,这也是 keras 的一个比较好的功能之一,可以让你对了解模型的基本概要:

      由模型总结我们看到神经网络每一层的输入输出大小以及需要训练的参数个数,非常明了。

利用 keras 实现 LeNet-5 模型

      在之前的推送中我们使用了 Tensorflow 和 mnist 数据例子来实现了 Yann Lecun 大佬的 LeNet-5 模型,本节我们将继续使用 keras 来搭建 LeNet-5 模型。依然是按照前面所讲到的 keras 搭建神经网络模型四步骤,LeNet-5 模型搭建如下:

import keras
from keras.layers import Conv2D, Dense, Dropout, Activation, MaxPooling2D, Flatten
from keras.models import Sequential
import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# define lenet5 model
def lenet5(X_train, y_train):    model = Sequential()
   
   # first step: create sequential model and add layers    model.add(Conv2D(6, (5, 5), strides=1, padding='valid',                     input_shape=(32, 32, 1), activation='relu'))    model.add(MaxPooling2D(pool_size=(2, 2)))    model.add(Conv2D(16, (5, 5), strides=1, activation='relu'))    model.add(MaxPooling2D(pool_size=(2, 2)))    model.add(Conv2D(1203, (5, 5), strides=1, activation='relu'))    model.add(Flatten())    model.add(Dense(84))    model.add(Activation('relu'))    model.add(Dropout(0.25))    model.add(Dense(10))    model.add(Activation('softmax'))  
   # second step:compile the model    model.compile(loss='categorical_crossentropy',                  optimizer='adam',                  metrics=['accuracy'])    
   
   # third step: fit the model    model.fit(X_train, y_train, batch_size=128, epochs=10)    
   return model
 
# fourth step: evaluate the model
def eval_score(model, X_test, y_test):    score = model.evaluate(X_test, y_test, batch_size=128)    
   return score
   
if __name__ == '__main__':    mnist = input_data.read_data_sets('MNIST_data', one_hot=True)    sess = tf.InteractiveSession()    X_train = mnist.train.images    X_train = tf.reshape(X_train, [-1, 28, 28, 1])    X_train = tf.pad(X_train, [[0,0],[2,2],[2,2], [0,0]]).eval()    y_train = mnist.train.labels    X_test = mnist.test.images    X_test = tf.reshape(X_test, [-1, 28, 28, 1])    X_test = tf.pad(X_test, [[0,0],[2,2],[2,2], [0,0]]).eval()    y_test = mnist.test.labels    model = lenet5(X_train, y_train)    print(model.summary())    score = eval_score(model, X_test, y_test)    print(score)

      在上述代码中,我们利用 keras 四步法快速搭建起了 LeNet5 模型,并使用 mnist 手写数字数据集进行了训练。这里需要说明的一点是,笔者这里的 mnist 数据是通过 Tensorflow 下载导入的,其实 keras 本身也有 mnist 的数据导入模块。这么做主要是笔者想要通过 Tensorflow 对训练集的维度做 padding 时方便,mnist 数据集输入大小的 shape 为 28x28x1,但在 Lecun 的论文原文中,输入图像是 32x32x1,所以在搭建原始的 LeNet5 结构时需要对输入在一开始就做一个 padding。

模型训练过程如下:

模型概要如下:


最后我们使用 LeNet5 在测试集上取得了 99.01% 的准确率:

参考资料:

https://keras.io/

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”,开始学习Python课程:

关注后在公众号内回复“课程”即可获取:

小编的Python入门免费视频课程!!!

【最新免费微课】小编的Python快速上手matplotlib可视化库!!!

崔老师爬虫实战案例免费学习视频。

陈老师数据分析报告制作免费学习视频。

玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存