阅读 216

Keras 从零开始构建深度神经网络

Keras 是一个用于定义和训练神经网络的高阶API。简单的说,Keras 是对 TensorFlow 等深度学习框架的更高一层的封装,以提供更加优雅,用户友好的接口设计。因此,Keras 不能独立运行,需要底层框架的支持,这个底层框架可以是 TensorFlow, CNTK, Theano。推荐使用 TensorFlow , 本文也是以 TensorFlow 为例。

1. 预备知识

1.1 什么是神经网络?

在人工智能领域,通常所说的“神经网络”,完整说法应该是“人工神经网络”。它是人类为了使机器具备人类的智力行为,使用计算机算法模拟人类神经系统,开发的一种机器学习技术。人类的神经系统是由一个个神经元彼此相连,构成的复杂网络系统。

下图是大脑神经元结构,神经元从它的多个树突(DENDRITES)接收输入(神经冲动),经过处理,判断是否通过轴突(AXON)输出神经冲动。

1.2 感知器 Perceptron

正如神经元是构成大脑神经系统的基本单元,感知器(Perceptron)是构人工神经网络的基本单元。它接收多个输入(x_1, x_2, \ldots, x_n),通过线性函数和激活函数(Step Function 是激活函数的一种),得到输出\hat{y}

线性函数:

f(x) = \mathbf{W}\mathbf{x} + b

其中,\mathbf{W}\mathbf{x} 为向量,\mathbf{W}=(w_1, w_2, \ldots, w_n), \mathbf{x}=(x_1, x_2, \ldots, x_n),因此也可以展开如下:

w_1 x_1 + w_2 x_2 + \ldots + w_n x_n + b = y'

Step Function 是阶越函数,在神经网络中,通常称这类函数为激活函数:

f(x) = \left\{ \begin{array}{rl}
 0 &\mbox{ if $x<0$} \\
 1 &\mbox{ if $x>=0$ }
       \end{array} \right.

1.3 神经网络与线性代数

神经网络的数学原理是线性代数。在单个感知器中,输入到输出,实际就是,输入向量 \mathbf{x} 与权重向量 \mathbf{W} 的点积,再加上一个偏置单元 b (标量)。为了表示的一致性,通常也会将偏置单元看作是,输入为 1 , 权重为 b 的特殊单元。

(x_1, x_2, \cdots, x_n, 1) \cdot (w_1, w_2, \cdots, w_n, b) = y'

1 个感知器对应 1 个输出,多个具有不同权重向量感知器,接收相同输入向量,就对应多个输出,这样一组感知器就构成神经网络的层(layer)。相比于单个感知器,层能接收多个输入,并得到多个输出,而权重不再以向量表示,取而代之为矩阵。因此,层的数学模型就是,输入向量乘以权重矩阵,得到输出向量。

(x_1, x_2, \cdots, x_n, 1)
\left| \begin{array}{ccc}
  w_{11} & w_{12} & \cdots & w_{1m} \\
  w_{21} & w_{22} & \cdots & w_{2m} \\
  \cdots & \cdots & \cdots & \cdots \\
  w_{n1} & w_{n2} & \cdots & w_{nm} \\
  b_1 & b_2 & \cdots & b_m
  \end{array}\right| = (y_1, y_2, \cdots, y_m)

1.4 深度神经网络

所谓的深度学习或深度神经网络,就是由多个感知层首尾相连,即前一个层的输出对应后一个层的输入,构成的多层感知器。其中,第1层也叫输入层(Input Layer),最后1层也叫输出层(Output Layer),中间层也叫隐藏层(Hidden Layer)。

2. 准备工作

在对深度神经网络有个基本概念后,接下来使用 Keras 搭建一个深度神经网络模型。在此之前,需要先安装相关软件和 python 包。

如果还没安装 Anaconda ,建议先安装,下载地址:www.anaconda.com/distributio…

确认已经安装了 Anaconda 后,打开命令行终端,输入如下命令,创建环境并安装相关 python 包。

conda create -n DNN python=3.6
conda activate DNN

pip install --upgrade pip
pip install numpy pandas matplotlib jupyter notebook tensorflow Keras
pip install seaborn

pip freeze | grep -Ei "numpy|pandas|matplotlib|tensorflow|Keras"
复制代码

out:

Keras==2.3.0
Keras-Applications==1.0.8
Keras-Preprocessing==1.1.0
matplotlib==3.1.1
numpy==1.17.2
pandas==0.25.1
tensorflow==1.14.0
tensorflow-estimator==1.14.0
复制代码

3. 使用 Keras 创建深度神经网络模型

Keras 提供两种创建神经网络的方法: 序列化模型(Sequential model),函数式API(Functional API)。

下面分别使用两种方法,创建最简单的3层神经网络模型,1个输入层,1个隐藏层和1个输出层,其中输入大小(shape)为 100, 输出大小为 10,隐藏层大小为 32。

3.1 序列化模型(Sequential model)

from keras.models import Sequential
from keras.layers.core import Dense
复制代码

创建序列模型:

model = Sequential()
复制代码

给模型添加层。Keras 将根据第1层自动推断后续所有层的形状。这意味着,你只需为第1层设置输入维度。

model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(10, activation='softmax'))
复制代码

编译模型,指定损失函数,优化程序和评估指。

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])
复制代码

查看模型架构:

model.summary()
复制代码
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 32)                3232      
_________________________________________________________________
dense_2 (Dense)              (None, 10)                330       
=================================================================
Total params: 3,562
Trainable params: 3,562
Non-trainable params: 0
_________________________________________________________________
复制代码

3.2 函数式API(Functional API)

Keras 函数式API用来定义结构更为复杂的模型。例如多输出模型,有向无环图或具有共享层的模型。

from keras.layers import Input, Dense
from keras.models import Model
复制代码
# 返回一个张量
inputs = Input(shape=(100, ))

# 给模型层实例,传入输入张量,返回一个输出张量
output_1 = Dense(32, activation='relu')(inputs)
outputs = Dense(10, activation='softmax')(output_1)

# 根据输入和输出,创建一个包含一个输入层,一个隐藏层和一个输出层的模型
model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 查看模型结构
model.summary()
复制代码
Model: "model_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 100)               0         
_________________________________________________________________
dense_3 (Dense)              (None, 32)                3232      
_________________________________________________________________
dense_4 (Dense)              (None, 10)                330       
=================================================================
Total params: 3,562
Trainable params: 3,562
Non-trainable params: 0
_________________________________________________________________
复制代码

结语

本文从初学者角度,介绍深度神经网络的基本概念和数学原理,然后通过使用非常流行深度学习框架 Keras 提供的两种方法,分别创建了相同结构的模型,引导读者从理论过渡到实践。理论深奥难懂,但通过封装良好的框架,却能在最短时间内,将炙手可热地深度学习技术投入实践。希望本文能够帮助对深度学习感兴趣的读者,迈出进入深度学习殿堂的第一步。


微信扫描二维码 获取最新技术原创

关注下面的标签,发现更多相似文章
评论