pytorch【简单实现梯度下降】

文章目录

  • 一、导入需要的库
  • 二、定义我们神经网络的结构
  • 三、实例化我们的网络结构
  • 四、定义损失函数
  • 五、定义优化算法
  • 六、实现梯度下降

一、导入需要的库

#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附近左右。这样我们就简单实现了一个梯度下降的算法
pytorch【简单实现梯度下降】_第1张图片

你可能感兴趣的:(深度学习,pytorch,python,深度学习)