一、导入需要的库
#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附近左右。这样我们就简单实现了一个梯度下降的算法