【动手学深度学习Pycharm实现2】线性回归的简单实现

前言

李沐大神源代码是用Jupyter写的,笔者想用Pycharm实现并仅作为学习笔记,如有侵权,请联系笔者删除。


一、背景

线性回归虽然简单,但是麻雀虽小五脏俱全,这其中包含了:数据如何读取,模型的搭建,参数初始化,损失函数以及训练模块,能让我们这种初学者能快速了解大概流程。

二、线性回归代码

笔者对沐神部分代码进行了注释,并添加了个人理解。

Python版本:3.8.6
torch版本:1.11.0
d2l版本:0.17.5

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

true_w = torch.tensor([2,-3.4])
true_b = 4.2
features, labels = d2l.synthetic_data(true_w, true_b, 1000)  #构造人造数据集

def load_array(data_arrays, batch_size, is_train=True):
    """构造一个PyTorch数据迭代器"""
    dataset = data.TensorDataset(*data_arrays) # *号作用是对data_arrays解开入参,这一行等价于下面一行的代码
   #dataset = data.TensorDataset(data_arrays[0],data_arrays[1])
    return data.DataLoader(dataset, batch_size, shuffle=is_train)

batch_size = 10
data_iter = load_array((features, labels), batch_size) # 从数据集中随机取batch_size个数据

# 沐神视频中是:next(iter(data_iter))
print(next(iter(data_iter))[0])
print(next(iter(data_iter))[1])

net = nn.Sequential(nn.Linear(2,1)) # Sequential: list of layers 一个容器

net[0].weight.data.normal_(0, 0.01) # 等价于参数初始化
net[0].bias.data.fill_(0)

loss = nn.MSELoss() # pytorch自带均方根误差函数

trainer = torch.optim.SGD(net.parameters(), lr=0.03) # 小批量梯度下降

num_epochs = 3
for epoch in range(num_epochs):
    for X, y in data_iter:
        l = loss(net(X), y)   # 计算总损失
        trainer.zero_grad()   # 梯度设为0
        l.backward()          # 计算梯度
        trainer.step()        # 权值参数更新
    l = loss(net(features), labels)
    print(f'epoch {epoch + 1}, loss {l:f}')

输出如下:
【动手学深度学习Pycharm实现2】线性回归的简单实现_第1张图片


讨论

笔者感觉这里训练时的data_iter并不会像笔者 Pytorch学习笔记1 data_iter那样会遍历所有数据集,而是每次都随机选取batch_size个大小的数据进行梯度更新,这样可能会使得一些数据会被训练多次,而一些数据从未被训练,不知道大家是什么想法,欢迎评论区讨论。

你可能感兴趣的:(python,pycharm,深度学习,神经网络,pytorch)