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 ,建议先安装,下载地址:https://www.anaconda.com/distribution/ 。
确认已经安装了 Anaconda 后,打开命令行终端,输入如下命令,创建环境并安装相关 python 包。
代码语言:javascript复制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:
代码语言:javascript复制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)
代码语言:javascript复制from keras.models import Sequential
from keras.layers.core import Dense
创建序列模型:
代码语言:javascript复制model = Sequential()
给模型添加层。Keras 将根据第1层自动推断后续所有层的形状。这意味着,你只需为第1层设置输入维度。
代码语言:javascript复制model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(10, activation='softmax'))
编译模型,指定损失函数,优化程序和评估指。
代码语言:javascript复制model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
查看模型架构:
代码语言:javascript复制model.summary()
代码语言:javascript复制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用来定义结构更为复杂的模型。例如多输出模型,有向无环图或具有共享层的模型。
代码语言:javascript复制from keras.layers import Input, Dense
from keras.models import Model
代码语言:javascript复制# 返回一个张量
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()
代码语言:javascript复制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 提供的两种方法,分别创建了相同结构的模型,引导读者从理论过渡到实践。理论深奥难懂,但通过封装良好的框架,却能在最短时间内,将炙手可热地深度学习技术投入实践。希望本文能够帮助对深度学习感兴趣的读者,迈出进入深度学习殿堂的第一步。