第一周-深度学习与pytorch基础

深度学习与pytorch基础学习

本周学习目标:

  1. Part1 视频学习:专知课程 01-绪论、02-深度学习概述
  2. Part2 代码练习:pytorch 基础练习 、 螺旋数据分类

具体学习内容:

一、理论部分

1.人工智能>机器学习>深度学习

人工智能:使一部机器像人一样进行感知、认识、决策、执行的人工程序或系统。
机器学习:计算机系统能够利用经验提高自身性能(最常用定义)。
深度学习:不同于传统机器学习,应用了深度神经网络。
概述

2.神经网络基础

M_P神经元
M_P神经元
激活函数:神经元继续传递信息、产生新连接的概率(超过阈值被激活,但不一定传递)。
激活函数举例
举例
举例2
神经网络每一层的作用
作用
在神经元总数相当的情况下,增加网络深度可以比增加宽度带来更强的网络表示能力:产生更多的线性区域。
深度和宽度对函数复杂度的贡献是不同的,深度的贡献是指数增长的,而宽度的贡献是线性的

二、实践环节

1.pytorch基础练习

遇见的问题

m @ v

运行时报出数据类型不匹配的错误,需要将v从long转化为float类型。
tensor

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)

输出结果:
ReLU
准确率得到显著提升,还可以寻找更适合的激活函数。

3.Leaky ReLU激活函数:

model = nn.Sequential(
    nn.Linear(D, H),
    nn.LeakyReLU(),
    nn.Linear(H, C),
)
model.to(device)

输出结果:
Leaky
与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激活函数。
输出结果:
3层网络
加深网络层数之后,准确率得到进一步提升。

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激活函数过拟合?

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值