在”手写数字识别”中
了解到了mnist数据集
对运算过程中运算的具体对象有点问题
1
2
3
4
5
6
7
8
9
10
11import sys, os
sys.path.append(os.pardir)
from dataset.mnist import load_mnist
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False) #一开始不知道这是什么意思
print(x_train.shape)
print(t_train.shape)
print(x_test.shape)
print(t_test.shape)
对于代码中出现的两个元组,一开始不知道 t_train t_test 代表什么,在纠结了一段时间后终于明白了
x_train 是训练用的图像数据
t_train 是训练图像的解,即每个图像对应的数字
x_test 是用于测试的图像数据
t_test 是测试图像的解,即每个图像对应的数字
认识了正规化、预处理和 one-hot 表示法
正规化指的是将数据进行转化,如对图像的每个像素数值除以256,使其数值在0到1之间,方便后续运算
预处理,顾名思义,就是在运算之前对数据进行转换,如正规化等
one-hot 表示法是指对运算结果只将 解 所对应的值设为1,即将 解 作为索引,设置该索引的值为1;在对图像进行预测的脚本中,获取解的过程便是基于one-hot表示法的,如下 p= np.argmax(y)
1 | for i in range(len(x)): |
另外,在阅读到设计神经网络时,学到了有关输入层和输出层与数据之间的关系
输入层为待训练数据的大小,如训练手写数字识别时输入层为784,即为训练图像的大小
输出层为分类数目,如训练的手写数字结果只有0到9十种可能,故将输出层设为十
在“从数据中学习”中
特征量是指可以从输入数据中准确地提取本质数据的转换器,通常表示为向量形式
特征量是由人设计的
不同问题对应不同特征量
深度学习中特征量是由机器来学习的
泛化能力
泛化能力是指处理未被观察过的数据(不包含在训练数据中的数据)的能力
过拟合
只对某个数据集过度拟合的状态称为过拟合
可以理解为训练的模型只对某个数据集起作用
损失函数
损失函数是表示神经网络性能的“恶劣程度”的指标,即当前的神经网络对监督数据在多大程度上不拟合,在多大程度上不一致
均方误差
$$
E=\frac{1}{2}\Sigma_k(y_k-t_k)^2
$$
这里y_k表示神经网络的输出,t_k表示监督数据,k表示数据维数
交叉熵误差
$$
E=-\Sigma_kt_k\log{y_k}
$$
损失函数的意义
个人认为,损失函数存在的意义是作为模型调参结果的重要指标,由于测试精度的变化是不连续的(因为测试数据有限,测试结果的精度就取决于测试数据的多少),故无法体现模型调参后微小的变化,而损失函数是连续的,任何微小的改动都可能改变损失函数的结果(可以认为损失函数的精度比测试结果的精度高得多),故需要损失函数来衡量调参后的结果
数值微分
利用某个给定的微小值的差分求导数的过程,称为数值微分
导数与偏导数的定义
梯度及梯度法
梯度法:函数的取值从当前位置沿着梯度方向前进一段距离,然后在新的地方重新求梯度,再沿着新梯度方向前进,逐渐减小函数值
学习算法(随机梯度下降法)的实现
神经网络的学习步骤:
前提
神经网络存在合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为“学习”
步骤1(mini-batch)
从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们的目标是减小mini-batch的损失函数的值
步骤2(计算梯度)
为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向
步骤3(更新参数)
将权重参数沿梯度方向进行微小更新
步骤4(重复)
重复步骤1、步骤2、步骤3
epoch: epoch是一个单位,一个epoch表示学习中所有训练数据均被使用过一次时的更新次数
误差方向传播法
计算图
了解正向传播、反向传播及局部计算的定义
链式法则
复合函数导数的定义
如果某个函数由复合函数表示,则该复合函数的导数可以用构成复合函数的各个函数的导数的乘积表示
链式法则是关于复合函数的导数的性质
反向传播
反向传播的计算顺序
先将节点的输入信号乘以节点的局部导数(偏导数),然后传递给下一个节点
- 加法节点的反向传播
加法节点的反向传播只乘以1
- 乘法节点的反向传播
乘法节点的反向传播会将上游的值乘以正向传播时的输入信号的“翻转值”后传递给下游
对翻转值的理解:书上说的是“表示一种翻转关系”,个人认为是参与运算的另一个值,以乘法为例:乘法涉及到两个值,则传播到某一个方向的值为上游的值乘以参与运算的另一个对象的值