深度学习与pytorch基础学习
本周学习目标:
- Part1 视频学习:专知课程 01-绪论、02-深度学习概述
- Part2 代码练习:pytorch 基础练习 、 螺旋数据分类
具体学习内容:
一、理论部分
1.人工智能>机器学习>深度学习
人工智能:使一部机器像人一样进行感知、认识、决策、执行的人工程序或系统。
机器学习:计算机系统能够利用经验提高自身性能(最常用定义)。
深度学习:不同于传统机器学习,应用了深度神经网络。
2.神经网络基础
M_P神经元:
激活函数:神经元继续传递信息、产生新连接的概率(超过阈值被激活,但不一定传递)。
激活函数举例:
神经网络每一层的作用:
在神经元总数相当的情况下,增加网络深度可以比增加宽度带来更强的网络表示能力:产生更多的线性区域。
深度和宽度对函数复杂度的贡献是不同的,深度的贡献是指数增长的,而宽度的贡献是线性的。
二、实践环节
1.pytorch基础练习
遇见的问题:
m @ v
运行时报出数据类型不匹配的错误,需要将v从long转化为float类型。
2.螺旋数据分类
步骤1:下载绘图函数到本地
步骤2:引入基本的库,然后初始化重要参数
步骤3:初始化 X 和 Y。 X 可以理解为特征矩阵,Y可以理解为样本标签。 结合代码可以看到,X的为一个 NxC 行, D 列的矩阵。C 类样本,每类样本是 N个,所以是 N*C 行。每个样本的特征维度是2,所以是 2列。
在 python 中,调用 zeros 类似的函数,第一个参数是 y方向的,即矩阵的行;第二个参数是 x方向的,即矩阵的列,大家得注意下,不要搞反了。下面结合代码看看 3000个样本的特征是如何初始化的。
步骤4:构建模型,进行螺旋数据分类:
1.线性模型:
learning_rate = 1e-3
lambda_l2 = 1e-5
# nn 包用来创建线性模型
# 每一个线性模型都包含 weight 和 bias
model = nn.Sequential(
nn.Linear(D, H),
nn.Linear(H, C)
)
model.to(device) # 把模型放到GPU上
# nn 包含多种不同的损失函数,这里使用的是交叉熵(cross entropy loss)损失函数
criterion = torch.nn.CrossEntropyLoss()
# 这里使用 optim 包进行随机梯度下降(stochastic gradient descent)优化
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, weight_decay=lambda_l2)
# 开始训练
for t in range(1000):
# 把数据输入模型,得到预测结果
y_pred = model(X)
# 计算损失和准确率
loss = criterion(y_pred, Y)
score, predicted = torch.max(y_pred, 1)
acc = (Y == predicted).sum().float() / len(Y)
print('[EPOCH]: %i, [LOSS]: %.6f, [ACCURACY]: %.3f' % (t, loss.item(), acc))
display.clear_output(wait=True)
# 反向传播前把梯度置 0
optimizer.zero_grad()
# 反向传播优化
loss.backward()
# 更新全部参数
optimizer.step()
输出结果:
线性模型的准确率最高只能达到 50% 左右,对于这样复杂的一个数据分布,线性模型难以实现准确分类。
2.ReLU激活函数:
# 这里可以看到,和上面模型不同的是,在两层之间加入了一个 ReLU 激活函数
model = nn.Sequential(
nn.Linear(D, H),
nn.ReLU(),
nn.Linear(H, C)
)
model.to(device)
输出结果:
准确率得到显著提升,还可以寻找更适合的激活函数。
3.Leaky ReLU激活函数:
model = nn.Sequential(
nn.Linear(D, H),
nn.LeakyReLU(),
nn.Linear(H, C),
)
model.to(device)
输出结果:
与ReLU激活函数相比有了部分提升,还可以寻求进一步优化,比如加深网络层数。
4.加深网络层数+Leaky ReLU激活函数:
model = nn.Sequential(
nn.Linear(D, H),
nn.LeakyReLU(),
nn.Linear(H, H),
nn.LeakyReLU(),
nn.Linear(H, C),
)
model.to(device)
在每层网络之间使用Leaky ReLU激活函数。
输出结果:
加深网络层数之后,准确率得到进一步提升。
5.加深网络层数+ReLU 激活函数
model = nn.Sequential(
nn.Linear(D, H),
nn.ReLU(),
nn.Linear(H, H),
nn.ReLU(),
nn.Linear(H, C),
)
model.to(device)
输出结果:
损失进一步缩小。
三、实验总结:
通过不同的激活函数对比,发现在三层神经网络下Leaky ReLU激活函数对于螺旋数据分类更为适宜,精确度提高,损失降低;
由于深度和宽度对函数复杂度的贡献是不同的,深度的贡献是指数增长的,而宽度的贡献是线性的,在加深神经网络后,精确度得到显著提高,损失降低,在使用ReLU激活函数时损失相较于Leaky ReLU更低。
猜想:在三层神经网络下Leaky ReLU激活函数的表现好于ReLU激活函数,但是在加深网络层数后反而是ReLU激活函数损失更低,是否Leaky ReLU激活函数过拟合?