[Deep-Learning-with-Python]神经网络入手学习[上]
神经网络入手[上]
- [x] 神经网络的核心部分
- [x] Keras介绍
- [ ] 使用Keras解决简单问题:分类和回归
神经网络剖析
神经网络的训练与下列对象相关:
- 网络层Layers,网络层结合形成神经网络模型;
- 输入数据以及对应标签;
- 损失函数,定义用来学习的反馈信号;
- 优化方法,定义学习过程。
关系图:

网络层堆叠形成网络模型,网络模型由输入数据得到预测值。损失函数比较预测值与实际值,得到损失函数值:用来评估预测结果的好坏;优化方法用损失值来更新网络模型的权重系数。
网络层:神经网络模型的构建模块
网络层是神经网络的基本数据结构。一个网络层把一个或多个数据输入张量进行数据处理过程得到一个或多个输出张量。一些网络层是无状态的(没有网络参数),但大多数网络层是有状态的---网络层的权重系数,这些通过随机梯度下降算法学到的权重张量,形成了网络层的知识。
不同的网络进行的数据处理各不相同,因此需要的数据格式及数据类型也有所差异。比如:2D张量,形状为(samples,features)存储简单的向量信息,通常是全连接层(FC 或 Dense)的输入格式要求;LSTM网络层通常处理3D张量,形状为(samples,timesteps,featuers)的序列数据;2D卷积层通常处理存储在4D张量中的图片数据。
可以把网络层看做深度学习的乐高积木块,通过积木块我们可以搭建不同的网络模型。在Keras框架中通过把相互兼容的网络层堆叠形成数据处理过程,而网络层的兼容性是指该网络层接收特定形状的输入张量同时返回特东形状的输出张量。
例如:
from keras import layers
layer = layers.Dense(32, input_shape=(784, ))
定义的网络层只接收2D张量,第一维度为784,;同时网络层输出的第一维度为32。
在Keras中,不必担心网络的兼容性,因为添加到网络模型中的网络层是动态构建地,匹配接下来连接的网络层。比如:
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(32, input_shape=(784, )))
model.add(layers.Dense(32))
第二个Dense层不必定义接收张量的形状,keras能自动定义。
网络模型:网络层堆叠而成
一个神经网络模型是网络层的非循环连接而成。最常见的是网络层的线性连接堆叠,讲一个输入张量转换为一个输出张量。
也存在不同的网络拓扑结构,如:
- 二分支网络模型;
- 多分支网络模型;
- Inception块.
网络模型的拓扑结构定义了一个假设空间。通过选择网络模型的拓扑结构,限制了假设空间能进行的张量操作,通过这些张量操作有输出张量得到对应的输出张量;之后寻找这些张量操作中涉及到的权重系数张量。
网络模型结构的选择与其说是一门科学不如说是一门艺术,尽管存在一些可以依赖的经验和原理,但只有不断尝试才能使你成为一个优秀的神经网络缔造者。
损失函数和优化算法:配置学习过程的关键
网络模型结构定义完成之后,仍然需要定义两件事:
- 损失函数:训练过程中最小化的函数值,一种评估网络模型的表现;
- 优化算法:决定基于损失函数如何更新权重系数;有常见的SGD,以及变种SGD算法。
多输出神经网络模型可能有多个损失函数(一个输出一个损失函数)。但是梯度下降过程必然是基于一个损失函数标量值;所以,对于有多个损失函数的网络模型来说,所有的损失函数值必须整合(平均化处理)成一个标量值。
特定问题需要选择特定的损失函数。对于常见的问题,如:分类、回归、序列预测,有对应的指导-选择正确的损失函数。具体:二分类问题使用对数损失binary crossentropy,多分类问题采用分类交叉熵categorical crossentropy,回归问题使用均方误差,序列学习问题采用Connectionist temporal classification(CTC)损失函数等等。只有在面对真正要解决的科学问题时,才能决定要使用的损失函数类型以及定义。
Keras 介绍
Keras是一个Python语言的深度学习框架,提供了快速搞笑的深度学习网络模型定义和训练方法。Keras设计初衷是为了方便科学家能进行快速实验。Keras特征:
- 相同代码同时支持CPU、GPU运行;
- 用户友好API--网络模型定义、训练方便;
- 内置卷积神经网络、循环神经网络等等;
- 支持任意的网络架构:多输入、多输出网络模型,网络层共享,模型共享等等。
Keras支持所有的Python版本,从2.7到3.6(mid-2017).Keras 有200000个用户,从学术科学家和工程师到新手以及大公司的毕业生,还有兴趣爱好者。Google、Netflix、Uber、CERN、Yelp,Square以及上百个创业公司都猜使用Keras框架应用在相应的业务上。Keras也是Kaggle上流行的网络框架。
Keras,TensorFlow,Theano 和 CNTK
Keras 是一个模型级别的工具库,提供构建神经网络模型的高级API。Keras并不进行底层的操作比如张量操作和导数计算;相应地,Keras以来与特定的张量库进行这些操作,作为Keras的背后引擎。目前,Keras支持3个背后引擎:TensorFlow、Theano和CNTK。将来,有望支持更多的深度学习框架成为Keras的背后计算引擎。

Keras开发
Keras工作流大致如下:
- 定义训练数据:输入张量和目标张量;
- 定义网络层(或网络模型):由输入张量处理得到输出张量;
- 配置训练过程--选择损失函数、优化算法以及监测指标;
- 通过调用模型的fit()方法在训练数据上迭代训练。
模型定义有两种方法:使用Sequential类(使用于网络层的线性堆叠,目前最常见);以及函数式API(支持任意网络架构,更灵活)。
方法一:Sequential类
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(784,)))
model.add(layers.Dense(10, activation='softmax'))
方法二: 函数式API
input_tensor = layers.Input(shape=(784,))
x = layers.Dense(32, activation='relu')(input_tensor)
output_tensor = layers.Dense(10, activation='softmax')(x)
model = models.Model(inputs=input_tensor, outputs=output_tensor)
一旦模型架构定义完成,不必区分到底网络模型是怎么定义的,之后的处理步骤没有差别。
学习过程在编译过程中配置:定义优化算法、损失函数和监测指标。比如:
from keras import optimizers
model.compile(optimizer=optimizer.RMSProp(lr=0.001),loss='mse',metrics=['accuracy'])
最后,通过fit()方法将numpy数组形式的输入数据(以及对应标签)输入到网络模型中进行模型的学习过程。
model.fit(input_tensor, target_tensor, batch_size=128, epochs=10)
[Deep-Learning-with-Python]神经网络入手学习[上]的更多相关文章
- Deep learning with Python 学习笔记(11)
总结 机器学习(machine learning)是人工智能的一个特殊子领域,其目标是仅靠观察训练数据来自动开发程序[即模型(model)].将数据转换为程序的这个过程叫作学习(learning) 深 ...
- Deep learning with Python 学习笔记(10)
生成式深度学习 机器学习模型能够对图像.音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出与模型在训练数据中所见到的艺术作品具有相似特征的新作品 ...
- Deep learning with Python 学习笔记(9)
神经网络模型的优化 使用 Keras 回调函数 使用 model.fit()或 model.fit_generator() 在一个大型数据集上启动数十轮的训练,有点类似于扔一架纸飞机,一开始给它一点推 ...
- Deep learning with Python 学习笔记(8)
Keras 函数式编程 利用 Keras 函数式 API,你可以构建类图(graph-like)模型.在不同的输入之间共享某一层,并且还可以像使用 Python 函数一样使用 Keras 模型.Ker ...
- Deep learning with Python 学习笔记(7)
介绍一维卷积神经网络 卷积神经网络能够进行卷积运算,从局部输入图块中提取特征,并能够将表示模块化,同时可以高效地利用数据.这些性质让卷积神经网络在计算机视觉领域表现优异,同样也让它对序列处理特别有效. ...
- Deep learning with Python 学习笔记(6)
本节介绍循环神经网络及其优化 循环神经网络(RNN,recurrent neural network)处理序列的方式是,遍历所有序列元素,并保存一个状态(state),其中包含与已查看内容相关的信息. ...
- Deep learning with Python 学习笔记(5)
本节讲深度学习用于文本和序列 用于处理序列的两种基本的深度学习算法分别是循环神经网络(recurrent neural network)和一维卷积神经网络(1D convnet) 与其他所有神经网络一 ...
- Deep learning with Python 学习笔记(3)
本节介绍基于Keras的使用预训练模型方法 想要将深度学习应用于小型图像数据集,一种常用且非常高效的方法是使用预训练网络.预训练网络(pretrained network)是一个保存好的网络,之前已在 ...
- Deep learning with Python 学习笔记(2)
本节介绍基于Keras的CNN 卷积神经网络接收形状为 (image_height, image_width, image_channels)的输入张量(不包括批量维度),宽度和高度两个维度的尺寸通常 ...
随机推荐
- web应用服务端cache策略初探
一般来说,网站随着访问量以及数据库的增大,访问速度将会越来越慢,如何优化这个响应速度,增大用户支持容量是网站从小到中,到大的必经之路. 你也可能听说过对于大型web站点一般严重依赖于cache来弹性放 ...
- Oracle EBS AP更新供应商地址
SELECT pvs.vendor_site_id, pvs.party_site_id, hps.party_site_name, hps.object_version_number, hps.pa ...
- Linq排序方式与Lambda排序方式比较以及OrderBy、ThenBy的使用
沿用之前某一篇文章的实体类与EF操作类代码.数据库中增加几条数据 Linq 的排序方式,下面例子是根据RoleId 升序,Name降序 EFContext<Member> efMember ...
- 获取INET4与INET6的信息
获取INET4与INET6的信息 参考书籍: 本人封装的源码: // // IPAddressInfo.h // YXNETWORK // // http://www.cnblogs.com/YouX ...
- swift如何打印对象的地址
swift如何打印对象的地址 打印对象的地址还是有着很多实用价值的,在swift中,你可以用以下的方式打印一个对象的地址: 打印结果: 有时候,if let a = b 这种操作会给人一种错觉,认为 ...
- 使用 CSS 根据兄弟元素的个数来调整样式
在某些场景下,我们需要根据兄弟元素的总数来为它们设置样式.最常见的场景就是,当一个列表不断延长时,通过隐藏控件或压缩控件等方式来节省屏幕空间,以此提升用户体验. 为保证一屏内容能展示更多的内容,需要将 ...
- mysql中FIND_IN_SET函数的使用
有种需求,A和B是父子关系,B和C是父子关系,C与D亦是父子关系,以此类推,无限级 现在需要查询到某一级(包括本级)下面所有的,就需要用到FIND_IN_SET函数 select * from tab ...
- Android 高级UI设计笔记23:Android 夜间模式之 两种常用方法(降低屏幕亮度+替换theme)
1. 夜间模式 所谓的夜间模式,就是能够根据不同的设定,呈现不同风格的界面给用户,而且晚上看着不伤眼睛.特别是一些新闻类App实现夜间模式是非常人性化的,增强用户体验. 2. 我根据网上的资料 以及自 ...
- BZOJ2286:[SDOI2011]消耗战(树形DP,虚树)
Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军 ...
- [JSOI2018]潜入行动
题目 我好菜啊,嘤嘤嘤 原来本地访问数组负下标不会报\(RE\)或者\(WA\),甚至能跑出正解啊 这道题还是非常呆的 我们发现\(k\)很小,于是断定这是一个树上背包 发现在一个点上安装控制器并不能 ...