没有免费的午餐

横坐标是容量,如果模型的容量过高,自由度过高,会过拟合,容量太低,可能没有涵盖到真实的目标函数,会欠拟合。
image.png

  • 没有一种通用的学习算法可以在各种任务中都有很好的表现
  • 算法A在特定数据集上的表现优于另算法B的同时,一定伴随着算法A在另外某一个特定的数据集上有着不如算法B的表现

    神经网络为何爆发式增长

    大数据

  • 数据量爆发式增长,数据维度越来越丰富。

image.png

运算能力提升

集成电路容纳的晶体管数目不断提升,处理器能力的提升

神经网络设计更加强大

神经网络的目标函数是非凸的
面对大量的数据,需要更复杂的网络结构

神经网络简介

神经网络通过从样本中学习特征和标签间的关系,经过学习后的神经网络可以根据新样本的特征计算其标签。
image.png
f()为神经网络函数,W是分类函数中的投影矩阵,image.png为偏置项
训练神经网络的过程就是在寻找一条合适的曲线的过程,使得定义的目标损失函数最小,使得与坐标轴上的所有样本点距离最小。
(前向传播是通过全连接去预测y,loss损失函数去反向传播)

特点:

模型参数多,容量大,非线性,表达能力更强,
高维特征处理能力,可以对高维的数据进行表达,
但可能会过拟合

全连接神经网络基本原理

fully connected NN包含三层结构:输入层、隐含层、输出层
image.png
全连接,指的是,每一层神经元与后面一层的各个神经元都有连接,同层神经元之间不存在连接,也不存在跨层连接。
image.png
反向传播
image.png
反向传播基于梯度下降算法,以目标的负梯度方向对参数进行更新。

TensorFlow

快速构建神经网络,训练深度学习模型。
底端由C++实现,计算速度更快。

安装

pip3 Install Tensorflow(-gpu)

TensorFlow2.0张量

把张量看做n维数组。零阶张量是标量,一阶张量是向量,二阶张量是矩阵。
每一个Tensor有两个基础属性,数据类型和形状
在 TensorFlow 中,每一个 Tensor 都具备两个基础属性:数据类型(默认:float32)和形状。
两种张量类型:

  • tf.Vrriable:变量Tensor,指定初始值,定义可变参数
  • tf.constant:常量Tensor,指定初始值,定义不变化的张量

Keras

Keras是由纯Python编写的基于Tensorflow的开源人工神经网络库(慎独学习框架),是一个高层神经网络API
进行深度学习模型的设计、调试、评估、应用和可视化
Keras在代码结构上由面向对象方法编写,完全模块化并具有可扩展性
在硬件和开发环境方面,Keras支持多操作系统下的多GPU并行计算
允许简单而快速的原型设计(由于用户友好,高度模块化,可扩展性)。
同时支持卷积神经网络和循环神经网络,以及两者的组合。
在 CPU 和 GPU 上无缝运行。

安装

pip install keras

Keras的序列模型

由多个网络层线性堆叠,编译速度快,操作简单。
image.png

序列化模型(keras.models.Sequential)

Keras的序列化模型是由其API中层对象堆叠得到的神经网络模型——多个网络层的线性堆叠
。序列化模型有两种定义方式,一种是运行keras.models.Sequential时由列表指定所有的层对象,另一种是在运行时不指定层API,而是对Sequential类使用model.add添加层对象,这里给出使用的例子:
序列模型不显式定义输入层,因此其第一个层对象要求指定输入数据的大小,例子中使用了参量input_shape,也可等价地使用参量input_dim [10]
Keras 的核心数据结构是 model,一种组织网络层的方式。
最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。
对于更复杂的结构,你应该使用 Keras 函数式 API,它允许构建任意的神经网络图。

Sequential 模型如下所示:
from keras.models import Sequentia
from keras.models import Sequential
model = Sequential()
可以简单地使用 .add() 来堆叠模型:
from keras.layers import Dense
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=10, activation='softmax'))
在完成了模型的构建后, 可以使用 .compile() 来配置学习过程:
model.compile(loss='categorical_crossentropy',
optimizer='sgd',``metrics=['accuracy'])
如果需要,你还可以进一步地配置你的优化器。Keras 的核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性)。
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True))
现在,你可以批量地在训练数据上进行迭代了

x_train 和 y_train 是 Numpy 数组 — 就像在 Scikit-Learn API 中一样。

model.fit(x_train, y_train, epochs=5, batch_size=32)
或者,你可以手动地将批次的数据提供给模型:

model.train_on_batch(x_batch, y_batch)
只需一行代码就能评估模型性能:

loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)
或者对新的数据生成预测:

classes = model.predict(x_test, batch_size=128)

函数化模型(keras.models.Model)

Keras的函数化模型也被称为functional API,其功能是将一个张量指定为输入,另一个张量指定为输出,并将与输入、输出张量之间存在连接的节点(层对象)组合成神经网络模型 [11] 。这里提供一个函数化模型的使用例子。
import keras
# 定义一个8-16-2的感知器
IN = keras.layers.Input(shape=(8,))
HIDDEN = keras.layers.Dense(16, activation=’relu’)(IN)
OUT = keras.layers.Dense(2, activation=’sigmoid’)(HIDDEN)
model = keras.models.Model(inputs=IN, outputs=OUT)
相比于序列化模型,函数化模型显示定义了隐含层的张量,因此可以更容易地搭建非序列化的模型,具有更好的可扩展性。此外,Keras的函数化模型支持自定义的子类继承 [9] ,但在定义子类时,模型的拓扑结构由Keras的Python代码而不是层对象的静态图指定,因此一部分基于模型静态图的方法在子类继承后无法使用 [9

卷积神经网络

包含三层结构:输入层、隐含层(一层或多层)、输出层
输入层: 处理多维数据
隐含层:包含卷积层、池化层
卷积层对输入数据进行特征提取,内部有多个不同的卷积核
随着卷积层的增加,网络从低级特征逐渐提取至高级特征。
池化层通过特征选择简化在卷积层提取到的特征,减少无效特征。
image.png
卷积核:从图像的左上角滑动至右下角
从左到右,从上到下去提取特征(低级特征逐渐提取至高级特征)
image.pngimage.png
池化层:去掉不显著的特征,保留更显著
进行一个降维操作
输出层:一般是全连接层
image.pngimage.png

激活层:把一些线性的输出转化为一些非线性的输出
前向传播计算过程:
image.png
反向传播(训练过程)
比全连接更复杂,将交叉熵作为损失函数
image.png
链式法则求导计算损失函数的梯度
导入Keras库构建全连接神经网络
image.png
image.png
image.png
image.png