一、代码练习
1. pytorch基础练习
1.1 数据定义
一般定义数据使用torch.Tensor
Tensor支持各种各样类型的数据,包括:torch.float32, torch.float64, torch.float16, torch.uint8, torch.int8, torch.int16, torch.int32, torch.int64等
创建Tensor有多种方法,有:ones, zeros, eye, arange, linspace, rand, randn, normal, uniform, randperm
1.2 定义操作
基本运算包括:abs/sqrt/div/exp/fmod/pow ,及一些三角函数 cos/ sin/ asin/ atan2/ cosh,及 ceil/round/floor/trunc 等
布尔运算包括: gt/lt/ge/le/eq/ne,topk, sort, max/min
线性计算包括:trace, diag, mm/bmm,t,dot/cross,inverse,svd 等
其中数积运算@要求操作数类型为float
使用cat函数对张量在X方向或Y方向进行拼接
2. 螺旋数据分类
引入基本的库,初始化重要参数
初始化 X 和 Y。 X 可以理解为特征矩阵,Y可以理解为样本标签。 结合代码可以看到,X的为一个 NxC 行, D 列的矩阵。C 类样本,每类样本是 N个,所以是 N*C 行。每个样本的特征维度是2,所以是 2列。
2.1 线性模型分类
使用 print(model) 把模型输出,可以看到有两层:
- 第一层输入为2(每个样本的特征维度为2),输出为100(神经网络隐层单元数量为100);
- 第二层输入为100(上一层的输出),输出为3(类别数)
可以看出准确率很低,对于这样一个复杂的数据分布,线性模型难以实现准确分类,考虑使用两层神经网络。
2.2 两层神经网络分类
在两个线性层之间添加一个激活函数ReLU,来实现非线性变换。
可以看出,两层神经网络分类准确率高了很多
二、问题总结
1、AlexNet有哪些特点?为什么可以比LeNet取得更好的性能?
AlexNet特点:使用ReLU方法加快训练速度,使用Dropout防止过拟合,使用多GPU训练缩短训练时间。
性能优于LeNet的原因:
- AlexNet采用ReLU激活函数,相较于LeNet采用的Sigmoid,ReLU的计算成本更低,同时也可以避免在饱和区域产生梯度消失而减慢收敛速度的问题。
- 使用多GPU缩短了训练时间。
- AlexNet在全链接层采用Dropout技术,提高了模型的泛化能力。
- AlexNet使用最大池化层,避免平均池化的模糊化效果提升了特征的丰富性。
2、激活函数有哪些作用?
- 没有激活函数的限制,数据逐层积累,类似爆炸一样,需要使用激活函数每次把结果限制在一定范围内;
- 激活函数起到类似神经元的作用,负责信号的控制,来决定该神经元是否激活,从而使得模型学习效果更好。
3、梯度消失现象是什么?
深层网络中,激活函数的导数太小,根据链式求导法则,靠近输入层的参数的梯度因为乘了很多过小的数而趋近于0,导致模型无法更新。
4、神经网络是更宽好还是更深好?
- 更深的网络,有更好的非线性表达能力,可以拟合更加复杂的特征。但是网络加深会带来梯度不稳定、网络退化的问题,过深的网络会使浅层学习能力下降。
- 更宽的网络可以保证每一层都学到丰富的特征。但是太宽的网络会提取过多重复的特征,加大模型计算负担。
选择更深还是更宽的神经网络要视具体情况而定。
5、为什么要使用Softmax?
Softmax训练的深度特征会把整个超空间或者超球按照分类个数进行划分,保证类别是可分的,这一点对多分类任务如MNIST和ImageNet非常合适。
6、SGD 和 Adam 哪个更有效?
SGD基本思想为通过梯度下降的方法,不断调整模型的参数使模型的损失函数最小化。
SGD的优点为实现起来较为简单、效率高,缺点为收敛速度慢、容易陷入局部最小值。
Adam基本思想为通过维护模型的梯度和梯度平方的一阶动量和二阶动量,来调整模型的参数。
Adam的优点为计算效率高,收敛速度快,缺点是需要调整超参数。