第二次作业:深度学习基础


要求

【第一部分】视频学习心得及问题总结 了解深度学习相关概念,深度学习与人工智能、机器学习间的关系,神经网络学习与实践应用。
【第二部分】代码练习 在谷歌 Colab 上完成 pytorch 代码练习中的 2.1 pytorch基础练习、2.2 螺旋数据分类,关键步骤截图,并附一些自己的想法和解读。


学习总结

在这里插入图片描述

一、pytorch基础练习

由此可见,使用torch.Tensor()创建的矩阵,默认数据类型是float,在做标量积时应注意两个矩阵数据类型要匹配。
在这里插入图片描述
统一数据类型的其中两种方法:

v = torch.arange(1, 5, dtype = torch.float)
print(m @ v)
m.int()

二、 螺旋数据分类

1.一些准备工作

下载plot_lib.py

!wget https://raw.githubusercontent.com/Atcold/pytorch-Deep-Learning/master/res/plot_lib.py

导入库,指定运行设备

# 螺旋数据分类
import random
import torch
from torch import nn, optim
import math
from IPython import display
from plot_lib import plot_data, plot_model, set_default

# 指定运行使用的设备,torch可以在GPU上运行cuda,如果cuda空闲,则选择cuda,否则再用cpu
device=torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("device:",device)

初始化重要参数,生成平面螺旋图

# 初始化随机数种子。神经网络的参数都是随机初始化的,
# 不同的初始化参数往往会导致不同的结果,当得到比较好的结果时我们通常希望这个结果是可以复现的,
# 因此,在pytorch中,通过设置随机数种子也可以达到这个目的
seed = 12345
random.seed(seed)
torch.manual_seed(seed)

N = 1000  # 每类样本的数量,红黄蓝各1000个点,共3000个点
D = 2  # 每个样本的特征维度,坐标(x,y)
C = 3  # 样本的类别,红黄蓝
H = 100  # 神经网络里隐层单元的数量

# 初始化样本特征
X = torch.zeros(N * C, D).to(device)
Y = torch.zeros(N * C, dtype=torch.long).to(device)
for c in range(C):
    index = 0
    t = torch.linspace(0, 1, N) # 在[0,1]间均匀的取10000个数,赋给t
    # 下面的代码不用理解太多,总之是根据公式计算出三类样本(可以构成螺旋形)
    # torch.randn(N) 是得到 N 个均值为0,方差为 1 的一组随机数,注意要和 rand 区分开
    inner_var = torch.linspace( (2*math.pi/C)*c, (2*math.pi/C)*(2+c), N) + torch.randn(N) * 0.2
    
    # 每个样本的(x,y)坐标都保存在 X 里
    # Y 里存储的是样本的类别,分别为 [0, 1, 2]
    for ix in range(N * c, N * (c + 1)):
        X[ix] = t[index] * torch.FloatTensor((math.sin(inner_var[index]), math.cos(inner_var[index])))
        Y[ix] = c
        index += 1

print("Shapes:")
print("X:", X.size())
print("Y:", Y.size())

在这里插入图片描述

plot_data(X, Y)

在这里插入图片描述

2.构造线性模型

# 构建线性模型分类

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)优化
#注意:SGD改为Adom,注意二者区别
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()

运行结果:
在这里插入图片描述
在这里插入图片描述

尝试理解一下这个预测过程:
在这里插入图片描述

3.构建两层神经网络分类

和上面模型不同的是,在两层之间加入了一个 ReLU 激活函数

关于ReLU激活函数:
在这里插入图片描述

代码改动的部分:

model = nn.Sequential(
    nn.Linear(D, H),
    nn.ReLU(),      # 加入了激活函数ReLU
    nn.Linear(H, C)
)

运行结果:
在这里插入图片描述
使用两层神经网络可以使逼近效果显著提升,达到了0.95左右,但仍有提升空间,尝试增加层数至三层

3.构建三层神经网络分类

代码改动部分:

model = nn.Sequential(
    nn.Linear(D, H),
    nn.ReLU(),      
    nn.Linear(H,2*H), #加一层
    nn.ReLU(), # 激活函数
    nn.Linear(2*H, C)
)

运行结果:
在这里插入图片描述
这样损失降低到0.006,正确率达到了0.999


总结

什么情况下线性模型效果不好
进行优化的思路
本例中增加神经网络的节点数和层数可以使准确率显著提升
训练轮次,损失函数,线性,激活函数,
1.sigmold激活函数
2.轮次增加,收敛慢梯度消失现象,
3.换成ReLU函数,需要的轮次数降低
4.最后增加一个nn.Softmax()函数
归一化逻辑回归,所的结果为分在某个类的概率
适用于类别很多的情况
5.增加深度,但要注意梯度消失现象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

in&de

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值