pytorch【简单实现梯度下降】

本文介绍了如何使用PyTorch实现一个3分类问题的神经网络,从导入库、定义网络结构、设置损失函数和优化算法,到实际执行梯度下降过程。重点展示了如何运用ReLU和Sigmoid激活函数,并观察损失值的逐渐降低。
摘要由CSDN通过智能技术生成

一、导入需要的库

#3 分类,500个样本,20个特征,共3层,第一层13个神经元,第二层八个神经元
#第一层激活函数是relu,第二层激活函数是sigmoid
import torch
import torch.nn as nn
from torch.nn import functional as F
import torch.optim as optim

二、定义我们神经网络的结构

#指定我们的随机参数,可以自行设定
torch.manual_seed(420)
#这里我们初始化创建20个特征的500条记录
X = torch.rand((500, 20), dtype=torch.float32) * 200
#然后创建500个一维的标签,这里的3并不会被取到
#这里的size=(500,)表示是一维的,因为我们下面在传入标签的时候,pytorch会告诉我们要使用一维的标签
y = torch.randint(low=0, high=3, size=(500,), dtype=torch.float32)

#learing rate,学习率
lr=0.1
#动量参数
gama=0.9
#input_是我们需要输入的特征个数,也就是我们上面定义的20
input_ = X.shape[1]
#output_是我们需要输出的分类的情况,也就是我们上面指定的3
output_ = y.unique()


#定义神经网络的架构
#继承nn.Module类
class Model(nn.Module):
    def __init__(self, in_features=40, out_features=2):
        super().__init__()
        #定义我们第一层神经网络,bias=false表示我们不需要生成偏置函数
        self.linear1 = nn.Linear(in_features, 13, bias=False)
        self.linear2 = nn.Linear(13, 8, bias=False)
        #定义输出层
        self.output = nn.Linear(8, 3, bias=True)

    def forward(self, x):
    	#使用激活函数处理我们第一层的数据,按照 我们上面的目的,我们第一层使用relu函数
        sigma1 = torch.relu(self.linear1(x))
        #第二层按照我们上面的目的,我们使用sigmoid函数
        sigma2 = torch.sigmoid(self.linear2(sigma1))
        #zhat是我们的预测值,最后我们将我们的预测结果进行返回。
        zhat = self.output(sigma2)
        return zhat

三、实例化我们的网络结构

torch.manual_seed(420)
#传入我们的输入·的特征个数和要输出的特征个数
net = Model(in_features=input_, out_features=output_)

四、定义损失函数

#定义损失函数
#这里我们将其定义为交叉熵损失函数
criterion = nn.CrossEntropyLoss()

五、定义优化算法

#定义优化算法
#传入我们的权重矩阵,lr是学习率,然后gama是我们的动量参数
opt=optim.SGD(net.parameters()
#传入我们的学习参数
              ,lr=lr
              #传入我们的动量参数
              ,momentum=gamma
)

六、实现梯度下降

#向前传播
#计算本轮向前传播的损失函数值
#反向传播-得到了梯度
#更新权重和动量
#清空梯度,请出原来计算出来的,基于上一个点的坐标计算的梯度
zhat=net.forward(X)#最后一个线性层的输出结果
loss=criterion(zhat,y.reshape(500).long())#计算损失函数
loss.backward()

#更新权重w,更新动量v
opt.step()#步子,走一步
#将我们原来的梯度清除
opt.zero_grad()
print(loss)
print(net.linear1.weight.data[0][:10])

每一次执行我们第六部分的代码,我们都可以观察到我们的损失值在不断减小,最终停留在1.0附近左右。这样我们就简单实现了一个梯度下降的算法
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

桜キャンドル淵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值