首页 > 编程语言 >李沐《动手学深度学习》线性回归python代码实现

李沐《动手学深度学习》线性回归python代码实现

时间:2024-11-06 21:17:08浏览次数:3  
标签:python true torch batch 线性 train 李沐 data size

一、手动实现线性回归

# 线性回归的手动实现
%matplotlib inline
import torch
import random
from d2l import torch as d2l

# 随机按照参数w和b外加一些噪音来创造训练数据集data和labels
def synthetic_data(w, b, num_examples):
    X = torch.normal(0, 1, (num_examples, len(w)))
    y = torch.matmul(X, w) + b
    y += torch.normal(0, 0.1, y.shape)
    return X, y.reshape((-1,1))

# 可以按照一定的批次大小来获得一个迭代器,迭代器每次可以取出batch_size大小的data和labels
def data_iter(batch_size, train_data, train_label):
    num_examples = len(train_data)
    indices = list(range(num_examples))
    random.shuffle(indices)
    for i in range(0, num_examples, batch_size):
        batch_indices = torch.tensor(indices[i:min(i+batch_size, num_examples)])
        yield train_data[batch_indices], train_label[batch_indices]
        
# 线性回归模型
def linreg(X, w, b):
    return torch.matmul(X, w) + b

# 计算平方损失
def square_loss(y_hat, y_real):
    return (y_hat - y_real.reshape(y_hat.shape)) ** 2 / 2
            
# 小批量梯度下降
def sgd(params, lr, batch_size):
    # with块中禁止继续构造计算图来减少性能损失
    # 因为仅仅更新梯度的操作不需要用来计算梯度
    with torch.no_grad():
        for param in params:
            param -= lr * param.grad / batch_size  # /batch_szie是因为计算loss的时候没有除以num
            param.grad.zero_() # 清理梯度防止累计

w = torch.tensor([2, -3.4])
b = 4.2
train_x, train_y = synthetic_data(w, b, 100)

true_w = torch.normal(0, 0.1, size = (2, 1), requires_grad = True)
true_b = torch.zeros(1, requires_grad = True)

# 开始训练:
batch_size = 10
lr = 0.01
num_epochs = 10 # 最大迭代次数
net = linreg
loss = square_loss

for epoch in range(num_epochs):
    for X, y in data_iter(batch_size, train_x, train_y):
        l = loss(net(X, true_w, true_b), y)
        l.sum().backward()
        sgd([true_w, true_b], lr, batch_size)
    with torch.no_grad():
        train_l = loss(net(train_x, true_w, true_b) , train_y)
        print('epoch:{}'.format(epoch), 'loss:{:.3f}'.format(train_l.mean()))

二、利用pytorch框架实现

# 线性回归的简洁实现
import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l
from torch import nn #neural network

def load_array(data_arrays, batch_size, is_train = True):
    # 可以通过dataset[i]来访问第i个样本的数据和标签
    dataset = data.TensorDataset(*data_arrays)
    # 返回的DataLoader实例可以按照batch_size的大小来取数据的迭代器,而且是已经shuffle
    return data.DataLoader(dataset, batch_size, shuffle=is_train)

true_w = torch.tensor([2,-3.4])
true_b = 4.2
batch_size = 5
train_x, train_y =  d2l.synthetic_data(true_w, true_b, 100)  # 人造初始化训练数据集

data_iter = load_array((train_x,train_y), batch_size)
# for data,label in data_iter:
#     print(data)
#     print(label)
net = nn.Sequential(
    nn.Linear(2, 1)  # 表示只有一个神经元,接受的输入维度为2,输出的维度为1,并且使用线性函数作为激活函数
)
net[0].weight.data.normal_(0, 0.01) # 初始化网络中的参数w,使用符合均值0,方差0.01的正态分布的值来替换w
net[0].bias.data.fill_(0)  # 初始化偏置项b,初始为0
loss = nn.MSELoss() # 损失函数定义为均方误差(L2范数)
trainer = torch.optim.SGD(net.parameters(), lr=0.01) # 使用随机梯度下降优化器,学习率为0.01

num_epoch = 10
for epoch in range(num_epoch):
    for data, label in data_iter:
        l = loss(net(data), label)
        trainer.zero_grad() # 先利用trainer把参数w、b的梯度清0
        l.backward()
        trainer.step() # 通过梯度下降优化参数
    train_l = loss(net(train_x), train_y)
    print('epoch:{}'.format(epoch),'loss:{:.3f}'.format(train_l))

标签:python,true,torch,batch,线性,train,李沐,data,size
From: https://blog.csdn.net/yuzixuan233/article/details/143471590

相关文章

  • Python学习笔记-生成器的应用与原理
    生成器是Python中一种特殊的迭代工具,通过延迟计算的方式来逐步生成序列中的元素。这种特性使得生成器在处理大数据、无限序列或需要惰性求值的场景中十分有效。生成器的核心思想是通过yield语句逐步返回值,暂停并保留当前状态,直到下次调用继续执行,从而节省内存并优化性能......
  • Python学习笔记-断点操作结合异常处理
    在编程中,调试和错误处理是提升代码质量和开发效率的关键环节。调试能帮助识别并修复问题,异常处理则使得程序能在出现错误时有效地管理而不至于崩溃。断点与异常处理的结合应用是高级编程中不可或缺的技巧,能够帮助更高效地定位问题,提高程序的鲁棒性。本文将通过详细的断点和......
  • Python——数据结构与算法-时间复杂度&空间复杂度-链表&树状结构
    1.数据结构和算法简介程序可以理解为:程序=数据结构+算法概述/目的:都可以提高程序的效率(性能)数据结构指的是存储,组织数据的方式.算法指的是为了解决实际业务问题而思考思路和方法,就叫:算法.2.算法的5大特性介绍概述:为了解决实际业务问题,......
  • python面向对象(一)
    前言Python是一种功能强大的编程语言,因其简洁的语法和强大的库而备受开发者喜爱。而在Python中,面向对象编程(OOP)是一种核心的编程范式,它通过模拟现实世界中的对象和交互来帮助我们设计清晰、易维护的代码。在本篇博客中,我们将深入探讨Python的面向对象编程的基本概念,了解如......
  • 【PAT_Python解】1114 全素日
    原题链接:PTA|程序设计类实验辅助教学平台Tips:以下Python代码仅个人理解,非最优算法,仅供参考!多学习其他大佬的AC代码!defis_prime(n):ifn<=3:returnn>=2ifn%6notin(5,1):returnFalseforiinrange(5,int(n**0.5)+1,6):......
  • 【PAT_Python解】1110 区块反转
    原题链接:PTA|程序设计类实验辅助教学平台Tips:以下Python代码仅个人理解,非最优算法,仅供参考!多学习其他大佬的AC代码!importsys#读取输入head,n,k=map(int,sys.stdin.readline().split())#初始化数据,装入字典,最终取值data={}next={}for_inrange(n):......
  • 【PAT_Python解】1113 钱串子的加法
    原题链接:PTA|程序设计类实验辅助教学平台Tips:以下Python代码仅个人理解,非最优算法,仅供参考!多学习其他大佬的AC代码!defadd_base30(num1,num2):max_length=max(len(num1),len(num2))#在前面补零,使两个字符串长度相同num1=num1.zfill(max_lengt......
  • 0基础学Python——类的单例模式、反射函数、记录类的创建个数、迭代器、生成器及生成
    0基础学Python——类的单例模式、反射函数、记录类的创建个数、迭代器、生成器及生成器练习类的单例模式定义代码演示反射函数代码演示记录类的创建个数迭代器定义特点生成器定义特点写法生成器练习生成器生成1-无穷的数字生成器生成无穷个素数类的单例模式定义......
  • 0基础学Python——面向对象-可迭代、面向对象-迭代器、call方法、call方法实现装饰器
    0基础学Python——面向对象-可迭代、面向对象-迭代器、call方法、call方法实现装饰器、计算函数运行时间面向对象--可迭代实现方法面向对象--迭代器实现方法call方法作用call方法实现装饰器代码演示计算函数运行时间代码演示面向对象–可迭代把对象看做容器,存储......
  • 基于卷积神经网络的柑桔病害识别与防治系统,resnet50,mobilenet模型【pytorch框架+pytho
     更多目标检测和图像分类识别项目可看我主页其他文章功能演示:柑橘病害识别与防治系统,卷积神经网络,resnet50,mobilenet【pytorch框架,python源码】_哔哩哔哩_bilibili(一)简介基于卷积神经网络的柑桔病害识别与防治系是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,......