基于Python入门深度学习

2018 年 6 月 4 日 论智
来源:Medium
编译:weakish

编者按:Python软件基金会成员(Contibuting Member)Vihar Kurama简明扼要地介绍了深度学习的基本概念,同时提供了一个基于Keras搭建的深度学习网络示例。

深度学习背后的主要想法是,人工智能应该借鉴人脑。这一观点带来了“神经网络”这一术语的兴起。大脑包含数十亿神经元,这些神经元之间有数万连接。深度学习算法在很多情况下复现了大脑,大脑和深度学习模型都牵涉大量计算单元(神经元),这些神经元自身并不如何智能,但当它们互相交互时,变得智能起来。

我觉得人们需要了解深度学习在幕后让很多事情变得更好。Google搜索和图像搜索已经使用了深度学习技术;它允许你使用“拥抱”之类的词搜索图像。

—— Geoffrey Hinton

神经元

神经网络的基本构件是人工神经元,人工神经元模拟人脑神经元。它们是简单而强大的计算单元,基于加权的输入信号,使用激活函数产出输出信号。神经元遍布神经网络的各层。

人工神经网络如何工作?

深度学习包含建模人脑中的神经网络的人工神经网络。当数据流经这一人工网络时,每层处理数据的一个方面,过滤离散值,识别类似实体,并产生最终输出。

输入层(Input Layer) 这一层包含的神经元仅仅接受输入并将其传给其他层。输入层中的神经元数目应当等于数据集的属性数或特征数。

输出层(Output Layer) 输出层输出预测的特征,基本上,它取决于构建的具体模型类别。

隐藏层(Hidden Layer) 在输入层和输出层之间的是隐藏层。在训练网络的过程中,隐藏层的权重得到更新,以提升其预测能力。

神经元权重

权重指两个神经元之间的连接的强度,如果你熟悉线性回归,你可以将输入的权重想象成回归公式中的系数。权重通常使用较小的随机值初始化,例如0到1之间的值。

前馈深度网络

前馈监督神经网络是最早也是最成功的神经网络模型之一。它们有时也称为多层感知器(Multi-Layer Perceptron,MLP),或者简单地直接称为神经网络。

输入沿着激活神经元流经整个网络直至生成输出值。这称为网络的前向传播(forward pass)

激活函数

激活函数将输入的加权和映射至神经元的输出。之所以被称为激活函数,是因为它控制激活哪些神经元,以及输出信号的强度。

有许多激活函数,其中最常用的是ReLU、tanh、SoftPlus。

图片来源:ml-cheatsheet


反向传播

比较网络的预测值和期望输出,通过一个函数计算误差。接着在整个网络上反向传播误差,每次一层,权重根据其对误差的贡献作相应程度的更新。这称为反向传播(Back-Propagation)算法。在训练集的所有样本上重复这一过程。为整个训练数据集更新网络称为epoch。网络可能需要训练几十个、几百个、几千个epoch。

代价函数和梯度下降

代价函数衡量神经网络在给定的训练输入和期望输出上“有多好”。它也可能取决于权重或偏置等参数。

代价函数通常是标量,而不是向量,因为它评价的是网络的整体表现。使用梯度下降(Gradient Descent)优化算法,权重在每个epoch后增量更新。

比如,误差平方和(Sum of Squared Errors,SSE)就是一种常用的代价函数。

权重更新的幅度和方向通过计算代价梯度得出:

η为学习率

下为单个系数的代价函数梯度下降示意图:

多层感知器(前向传播)

多层感知器包含多层神经元,经常以前馈方式互相连接。每层中的每个神经元和下一层的神经元直接相连。在许多应用中,多层感知器使用sigmoid或ReLU激活函数。

现在让我们来看一个例子。给定账户和家庭成员作为输入,预测交易数。

首先我们需要创建一个多层感知器或者前馈神经网络。我们的多层感知器将有一个输入层、一个隐藏层、一个输出层,其中,家庭成员数为2,账户数为3,如下图所示:

隐藏层(i、j)和输出层(k)的值将使用如下的前向传播过程计算:

  
  
    
  1. i = (2 * 1) + (3 * 1) = 5

  2. j = (2 * -1) + (3 * 1) = 1

  3. k = (5 * 2) + (1 * -1) = 9

上面的计算过程没有涉及激活函数,实际上,为了充分发挥神经网络的预测能力,我们还需要使用激活函数,以引入非线性。

比如,使用ReLU激活函数:

这一次,我们的输入为[3, 4],权重分别为[2, 4], [4, -5], [2, 7]

  
  
    
  1. i = (3 * 2) + (4 * 4) = 22

  2. i = relu(22) = 22

  3. j = (3 * 4) + (4 * -5) = -8

  4. j = relu(-8) = 0

  5. k = (22 * 2) + (0 * 7) = 44

  6. k = relu(44) = 44


基于Keras开发神经网络

关于Keras

Keras是一个高层神经网络API,基于Python,可以在TensorFlow、CNTK、Theano上运行。(译者注:Theano已停止维护。)

运行以下命令可以使用pip安装keras:

  
  
    
  1. sudo pip install keras

在Keras中实现深度学习程序的步骤

  1. 加载数据

  2. 定义模型

  3. 编译模型

  4. 训练模型

  5. 评估模型

  6. 整合

开发Keras模型

keras使用Dense类描述全连接层。我们可以通过相应的参数指定层中的神经元数目,初始化方法,以及激活函数。定义模型之后,我们可以编译(compile)模型。编译过程将调用后端框架,比如TensorFlow。之后我们将在数据上运行模型。我们通过调用模型的fit()方法在数据上训练模型。

  
  
    
  1. from keras.models import Sequential

  2. from keras.layers import Dense

  3. import numpy

  4. # 初始化随机数值

  5. seed = 7

  6. numpy.random.seed(seed)

  7. # 加载数据集(PIMA糖尿病数据集)

  8. dataset = numpy.loadtxt('datasets/pima-indians-diabetes.csv', delimiter=",")

  9. X = dataset[:, 0:8]

  10. Y = dataset[:, 8]

  11. # 定义模型

  12. model = Sequential()

  13. model.add(Dense(16, input_dim=8, init='uniform', activation='relu'))

  14. model.add(Dense(8, init='uniform', activation='relu'))

  15. model.add(Dense(1, init='uniform', activation='sigmoid'))

  16. # 编译模型

  17. model.compile(loss='binary_crossentropy',

  18. optimizer='adam', metrics=['accuracy'])

  19. # 拟合模型

  20. model.fit(X, Y, nb_epoch=150, batch_size=10)

  21. # 评估

  22. scores = model.evaluate(X, Y)

  23. print("%s: %.2f%%" % (model.metrics_names[1], scores[1] * 100))

输出:

  
  
    
  1. $python keras_pima.py

  2. 768/768 [==============================] - 0s - loss: 0.6776 - acc: 0.6510

  3. Epoch 2/150

  4. 768/768 [==============================] - 0s - loss: 0.6535 - acc: 0.6510

  5. Epoch 3/150

  6. 768/768 [==============================] - 0s - loss: 0.6378 - acc: 0.6510

  7. .

  8. .

  9. .

  10. .

  11. .

  12. Epoch 149/150

  13. 768/768 [==============================] - 0s - loss: 0.4666 - acc: 0.7786

  14. Epoch 150/150

  15. 768/768 [==============================] - 0s - loss: 0.4634 - acc: 0.773432/768

  16. [>.............................] - ETA: 0sacc: 77.73%

我们训练了150个epoch,最终达到了77.73%的精确度。

原文地址:https://towardsdatascience.com/deep-learning-with-python-703e26853820

登录查看更多
2

相关内容

《深度学习》圣经花书的数学推导、原理与Python代码实现
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
188+阅读 · 2019年12月28日
基于TensorFlow和Keras的图像识别
Python程序员
16+阅读 · 2019年6月24日
干货 | 深入理解深度学习中的激活函数
计算机视觉life
16+阅读 · 2019年1月29日
深度学习入门必须理解这25个概念
AI100
7+阅读 · 2018年6月6日
深度学习入门笔记
论智
7+阅读 · 2018年3月31日
深度学习入门指南:初学者必看!
专知
7+阅读 · 2017年11月30日
入门 | 一文概览深度学习中的激活函数
深度学习世界
4+阅读 · 2017年11月3日
给初学者的深度学习简介
36大数据
3+阅读 · 2017年10月19日
【深度学习】给初学者的深度学习简介
产业智能官
8+阅读 · 2017年10月17日
深度学习实战(二)——基于Keras 的深度学习
乐享数据DataScientists
15+阅读 · 2017年7月13日
A survey on deep hashing for image retrieval
Arxiv
14+阅读 · 2020年6月10日
A Comprehensive Survey on Graph Neural Networks
Arxiv
13+阅读 · 2019年3月10日
Arxiv
53+阅读 · 2018年12月11日
A Survey on Deep Transfer Learning
Arxiv
11+阅读 · 2018年8月6日
Neural Arithmetic Logic Units
Arxiv
5+阅读 · 2018年8月1日
Arxiv
5+阅读 · 2017年4月12日
VIP会员
相关资讯
基于TensorFlow和Keras的图像识别
Python程序员
16+阅读 · 2019年6月24日
干货 | 深入理解深度学习中的激活函数
计算机视觉life
16+阅读 · 2019年1月29日
深度学习入门必须理解这25个概念
AI100
7+阅读 · 2018年6月6日
深度学习入门笔记
论智
7+阅读 · 2018年3月31日
深度学习入门指南:初学者必看!
专知
7+阅读 · 2017年11月30日
入门 | 一文概览深度学习中的激活函数
深度学习世界
4+阅读 · 2017年11月3日
给初学者的深度学习简介
36大数据
3+阅读 · 2017年10月19日
【深度学习】给初学者的深度学习简介
产业智能官
8+阅读 · 2017年10月17日
深度学习实战(二)——基于Keras 的深度学习
乐享数据DataScientists
15+阅读 · 2017年7月13日
相关论文
A survey on deep hashing for image retrieval
Arxiv
14+阅读 · 2020年6月10日
A Comprehensive Survey on Graph Neural Networks
Arxiv
13+阅读 · 2019年3月10日
Arxiv
53+阅读 · 2018年12月11日
A Survey on Deep Transfer Learning
Arxiv
11+阅读 · 2018年8月6日
Neural Arithmetic Logic Units
Arxiv
5+阅读 · 2018年8月1日
Arxiv
5+阅读 · 2017年4月12日
Top
微信扫码咨询专知VIP会员