线性回归Pytorch方法

借助 PyTorch 实现深度神经网络 - 线性回归 PyTorch 方法 - 第 3 周 | Coursera

随机梯度下降和数据加载器

在每个epoch中,使用一个样本进行更新的方法称为随机梯度下降,而使用所有样本进行更新的方法称为批量梯度下降。

随机梯度下降:

5e7b928f8616432ebf370ca1ccc40b50.png

随机梯度下降的问题:近似损失快速波动

a3c9b66757534c63b9d2a77fe8e3b8a3.png

Pytorch实现:

e68fb7b7093b47e1a87dffc34615685b.png

107f68208caa41149aecbabdd362ba49.png

aba98669622a42159a84f5270ca08477.png

import torch
from torch.utils.data import Dataset, DataLoader
import torch.nn as nn

# 定义数据集类
class Data(Dataset):
    def __init__(self):
        self.x = torch.arange(-3, 3, 0.1).view(-1, 1)
        self.y = 1 * self.x - 1 + 0.1 * torch.randn(self.x.size())
        self.len = self.x.shape[0]

    def __getitem__(self, index):
        return self.x[index], self.y[index]

    def __len__(self):
        return self.len

# 初始化数据和数据加载器
dataset = Data()
trainloader = DataLoader(dataset=dataset, batch_size=1, shuffle=True)

# 定义模型参数
w = torch.tensor(-12.0, requires_grad=True)
b = torch.tensor(-10.0, requires_grad=True)
lr = 0.01  # 学习率
criterion = nn.MSELoss()

# 定义前向传播函数
def forward(x):
    return w * x + b

# 训练模型并记录总损失
LOSS = []

def my_train_model(epochs):
    for epoch in range(epochs):
        total_loss = 0  # 每个epoch的总损失
        for x, y in trainloader:
            yhat = forward(x)
            loss = criterion(yhat, y)
            total_loss += loss.item()
            loss.backward()
            with torch.no_grad():
                w -= lr * w.grad
                b -= lr * b.grad
                w.grad.zero_()
                b.grad.zero_()
        LOSS.append(total_loss)
        print(f"Epoch {epoch + 1}/{epochs}, Loss: {total_loss}")

# 训练模型
my_train_model(10)

小批量梯度下降

允许处理更大的数据集(无法容纳在内存中)

fc2f18325a364722aafa2330918b2e9b.png

077f415ad6c74f2f96f6b3066de051c7.png

总结:

c4cce25ad6bb4013a0f3b501ba10df53.png

37e1d5a5b10544ff9f19978956bd7343.png

import torch
from torch.utils.data import Dataset, DataLoader
import torch.nn as nn

# 定义数据集类
class Data(Dataset):
    def __init__(self):
        self.x = torch.arange(-3, 3, 0.1).view(-1, 1)
        self.y = 1 * self.x - 1 + 0.1 * torch.randn(self.x.size())
        self.len = self.x.shape[0]

    def __getitem__(self, index):
        return self.x[index], self.y[index]

    def __len__(self):
        return self.len

# 初始化数据和数据加载器
dataset = Data()
trainloader = DataLoader(dataset=dataset, batch_size=10, shuffle=True)

# 定义模型参数
w = torch.tensor(-15.0, requires_grad=True)
b = torch.tensor(-10.0, requires_grad=True)
lr = 0.1  # 学习率
criterion = nn.MSELoss()

# 定义前向传播函数
def forward(x):
    return w * x + b

# 训练模型并记录总损失
LOSS_MINI20 = []

def train_model_Mini20(epochs):
    for epoch in range(epochs):
        total_loss = 0  # 每个epoch的总损失
        for x, y in trainloader:
            yhat = forward(x)
            loss = criterion(yhat, y)
            total_loss += loss.item()
            loss.backward()
            with torch.no_grad():
                w -= lr * w.grad
                b -= lr * b.grad
                w.grad.zero_()
                b.grad.zero_()
        LOSS_MINI20.append(total_loss)
        print(f"Epoch {epoch + 1}/{epochs}, Loss: {total_loss}")

# 训练模型
train_model_Mini20(10)

Pytorch中的优化

替换criterion函数

51a203ee52aa487f95fd53cff792e327.png

0e81977b2ae4481c9b3e956c83e51d89.png

bcec77642481465f8d2189f28e21a9b2.png

563fcd10e3c442b8a1132bf937ecc739.png

17f1b3af82254cabaa0000ad604a2e16.png

b862b827bd554d6eaf7f1faab029f0e8.png

训练、验证、测试

参数:w,b

超参数:lr、batch_size

使用验证数据集来决定超参数大小

014a64f0226c40dbaa8f5a663e21a231.png

用Pytorch实现:

ddc70a0bc27f4ee49b6fa13772637c88.png

40450e3c5a76475595631b9f6f71b2d0.png

76825456741a4e949a88efbab3097f09.png

512dcf3ede94417d8783bb9e0d1192b8.png

有点网格搜索优化的感觉

987aa961bb9f41b2af1a66b6d36df7c5.png

68578e669b51423f91417b1ab1600d71.png

01c222cf3cec4553901dd2966dff263c.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值