动手学习深度学习-线性回归的从零开始实现

文章介绍了如何在Python中使用PyTorch库构建一个简单的线性回归模型,包括数据合成、模型定义、损失函数以及随机梯度下降优化算法的应用。作者通过实例展示了如何训练模型并计算损失,以实现实时数据分析和预测。
摘要由CSDN通过智能技术生成
# coding=utf-8
# %matplotlib inline,只用于jupyter中
# 数据处理阶段
import random

import torch


# 现在构造人工数据集
def synthetic_data(w, b, num_examples):
    """生成y=wx+b+噪声"""
    x = torch.normal(0, 1, (num_examples, len(w)))  # torch.normal是PyTorch中的一个函数,用于生成服从正态分布的随机数
    y = torch.matmul(x, w) + b  # torch.matmul(x, w)是PyTorch中的一个函数,用于计算两个张量(矩阵)的矩阵乘法
    y += torch.normal(0, 0.01, y.shape)  # 添加噪声
    return x, y.reshape((-1, 1))  # 让Y恢复到张量形式


true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)


def data_iter(beatch_size, features, labels):
    num_examples = len(features)
    indices = list(range(num_examples))
    random.shuffle(indices)
    for i in range(0, num_examples, beatch_size):
        batch_indices = torch.tensor(
            indices[i:min(i + beatch_size, num_examples)]
        )  # 从索引i开始,取连续beatch_size个样本的索引值。
        # 如果i+beatch_size超过了num_examples,则取到最后一个样本的索引值。
        yield features[batch_indices], labels[batch_indices]


batch_size = 10

for x, y in data_iter(batch_size, features, labels):
    print(x, "\n", y)
    break

# 定义初始化模型参数
w = torch.normal(0, 0.01, size=(2, 1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)


# 定义模型
def linreg(x, w, b):
    return torch.matmul(x, w) + b


# 定义损失函数,方差损失函数
def squared_loss(y_hat, y):
    return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2
    # 这段代码中的y.reshape(y_hat.shape)是为了确保y的形状与y_hat相同,以便进行逐元素的相减操作


# 定义优化算法,随机梯度下降算法
def sgd(params, lr, batch_size):
    with torch.no_grad():
        for param in params:
            param -=  lr * param.grad / batch_size
        #param.grad.data.zero_()



lr = 0.03  #表示学习率,是优化算法中的超参数,用于控制参数更新的步长
num_epochs = 10
net = linreg
loss = squared_loss

for epoch in range(num_epochs):
    for x, y in data_iter(batch_size, features, labels):
        l = loss(net(x, w, b), y)
        l.sum().backward()
        sgd([w,b],lr,batch_size)

    with torch.no_grad():
        w.grad.data.zero_()
        b.grad.data.zero_()
        train_l = loss(net(features, w, b), labels)
        print('epoch %d, loss %f' % (epoch + 1, train_l.mean().item()))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值