过大的输入数据未归一化会导致损失过大,导致溢出无法正常训练。归一化方法有:Min-Max归一化、平均值归一化等。
为什么要数据归一化:
数据集一般划分为训练集、验证集和测试集。
训练集用于模型迭代训练。
在神经网络中,验证数据集用于:
测试集用来评估最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。
目前绝大部分的深度学习框架都将整个AI模型的计算过程抽象成数据流图(Data Flow Graphs)。为了方便地重用AI模型的计算过程,我们需要将它运行的数据流图、相应的运行参数(Parameters)和训练出来的权重(Weights)保存下来,这就是AI模型文件的内容。
TensorFlow
的Checkpoint Files
用Protobuf
去保存数据流图,用SSTable
去保存权重;Keras
用Json
表述数据流图而用h5py
去保存权重;PyTorch
由于是主要聚焦于动态图计算,模型文件甚至只用pickle
保存了权重而没有完整的数据流图。
TensorFlow
在设计之初,就考虑了从训练、预测、部署等复杂的需求,所以它的数据流图几乎涵盖了整个过程可能涉及到操作,例如初始化、后向求导及优化算法、设备部署(Device Placement)和分布式化、量化压缩等,所以只需要通过TensorFlow
的模型文件就能够获取模型完整的运行逻辑,所以很容易迁移到各种平台使用。
开放式神经网络交换(Open Neural Network Exchange,简称ONNX)是由微软、FaceBook、亚马逊等多个公司一起推出的,针对机器学习设计的开放式文件格式,可以用来存储训练好的模型。它使得不同的人工智能框架
可以采用相同格式存储模型数据并交互。
对于多层网络来说,绝对不能用零初始化!!如果初始值都是0,所以梯度均匀回传,导致所有W的值都同步更新,没有差别。
这样的话,无论多少轮,最终的结果也不会正确。
标准正态初始化方法(随机初始化)保证激活函数的输入均值为0,方差为1。
Xavier初始化方法:正向传播时,激活值的方差保持不变;反向传播时,关于状态值的梯度的方差保持不变。
MSRA初始化方法:正向传播时,状态值的方差保持不变;反向传播时,关于激活值的梯度的方差保持不变。
以下是几种初始化方法的应用场景:
在线性变换后应用以引入非线性,帮助神经网络学习各种现象。
为什么要使用激活函数:非线性激活函数可以使神经网络逼近复杂函数。如果没有激活函数,多层神经网络和单层神经网络没有差别。
网络的泛化问题:所谓泛化,就是模型在测试集上的表现要和训练集上一样好。
出现过拟合的原因:
解决过拟合问题:
SMOTE(Synthetic Minority Over-sampling Technique)
,通过人工合成新样本来处理样本不平衡
问题,提升分类器性能。池化,又称为下采样(downstream sampling or sub-sampling)。池化方法分为两种,一种是最大值池化 Max Pooling,一种是平均值池化 Mean/Average Pooling。
池化层的目的是:
相比常规卷积,深度可分离卷积的参数更少。
转置卷积(Transpose Convolution),一些地方也称为“反卷积”,在深度学习中表示为卷积的一个逆向过程,可以根据卷积核大小和输出的大小,恢复卷积前的图像尺寸,而不是恢复原始值。
>>> input = torch.randn(1, 16, 12, 12)
>>> downsample = nn.Conv2d(16, 16, 3, stride=2, padding=1)
>>> upsample = nn.ConvTranspose2d(16, 16, 3, stride=2, padding=1)
>>> h = downsample(input)
>>> h.size()
torch.Size([1, 16, 6, 6])
>>> output = upsample(h, output_size=input.size())
>>> output.size()
torch.Size([1, 16, 12, 12])