前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Keras 从零开始构建深度神经网络

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

作者头像
我是一条小青蛇
发布2019-10-23 13:12:54
9370
发布2019-10-23 13:12:54
举报
文章被收录于专栏:青笔原创青笔原创

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 提供的两种方法,分别创建了相同结构的模型,引导读者从理论过渡到实践。理论深奥难懂,但通过封装良好的框架,却能在最短时间内,将炙手可热地深度学习技术投入实践。希望本文能够帮助对深度学习感兴趣的读者,迈出进入深度学习殿堂的第一步。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-202,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 预备知识
    • 1.1 什么是神经网络?
      • 1.2 感知器 Perceptron
        • 1.3 神经网络与线性代数
          • 1.4 深度神经网络
          • 2. 准备工作
          • 3. 使用 Keras 创建深度神经网络模型
            • 3.1 序列化模型(Sequential model)
              • 3.2 函数式API(Functional API)
              • 结语
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档