线性回归-梯度下降算法(PyTorch)

目录

导入包

生成数据集

读取数据集

定义神经网络模型

 定义损失函数

定义优化算法

训练


导入包

import torch
from torch import nn
from torch.utils import data
from d2l import torch as d2l

生成数据集

# 生成数据集(训练集X,测试集y)
true_w = torch.tensor([2,-3.4])# 真实的权重w和偏差b
true_b = 4.2
features, labels = d2l.synthetic_data(true_w, true_b, 1000)# 生成数据集X(训练集),y(测试集)。生成x, y满足关系y = Xw+b+noisey

这里所生成的数据集,是一定情况下满足ture_w(权重)和true_b(偏差)所生成的X和y 

读取数据集

# 读取数据集
def load_array(data_arrays, batch_size, is_train=True):# 加载数据 返回一个PyTorch数据迭代器
    dataset = data.TensorDataset(*data_arrays)# *代表解包操作,将元组data_arrays中每个元素作为参数传入,把输入的两类数据进行一一对应
    return data.DataLoader(dataset, batch_size, shuffle=is_train)# 加载batch_size个数据,shuffle参数控制是否打乱数据(在每个epoch重新打乱数据再取数据)
batch_size = 10
data_iter = iter(load_array((features,labels), batch_size))# 若用for循环遍历这个迭代器,每次会批量取出batch_size个数据,直到取空数据集

该函数返回的是迭代器,只能顺序读取数据集(往前走),不能往后走

定义神经网络模型

# 定义神经网络模型
'''
from torch import nn # 需要导入的包,nn为神经网络的缩写
对于标准深度学习模型,我们可以使用框架的预定义好的层。
首先定义一个模型变量Net,它是一个Sequential类的实例,Sequential类将多个层串联在一起。
当给定输入数据时,Sequential实例将数据传入到第一层中,然后将第一层的输出作为第二层的输入 
 '''
net = nn.Sequential(nn.Linear(2,1))# 两个输入,一个输出
# 初始化模型参数 初始化权重与偏置
net[0].weight.data.normal_(0,0.01)# #normal_(0, 0.01) 权重参数从均值为0,标准差为0.01的正态分布中随机采样
net[0].bias.data.fill_(0)

 定义损失函数

# 定义损失函数 此处使用均方误差
loss = nn.MSELoss()# 均方误差,默认返回所有样本损失的平均值

定义优化算法

# 定义优化方法 训练w和b
trainer = torch.optim.SGD(net.parameters(), lr=0.03)# 梯度下降优化方法,net.parameters()包括了w和b,lr为学习率,相当于步长

训练

# 训练
num_eoochs = 3# 训练次数
for epoch in range(num_eoochs):
    for X,y in data_iter:
        l = loss(net(X), y)# net(X)是通过神经网络模型得到的预测值,与y真实值的均方差
        trainer.zero_grad()# 清空梯度
        l.backward()# 求导,求得各个分量的梯度 这里相当于l.sum().backward() loss()函数已经做了求和
        trainer.step()# 更新优化一次参数
    l = loss(net(features), labels)
    print('epoch{}---loss:{}'.format(epoch, l))
    print(net[0].weight, net[0].bias)# 优化后的参数权重值

'''
输出结果:
epoch0---loss:0.0002833765174727887
Parameter containing:
tensor([[ 1.9937, -3.3930]], requires_grad=True) Parameter containing:
tensor([4.1900], requires_grad=True)
epoch1---loss:0.0002833765174727887
Parameter containing:
tensor([[ 1.9937, -3.3930]], requires_grad=True) Parameter containing:
tensor([4.1900], requires_grad=True)
epoch2---loss:0.0002833765174727887
Parameter containing:
tensor([[ 1.9937, -3.3930]], requires_grad=True) Parameter containing:
tensor([4.1900], requires_grad=True)
'''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值