PyTorch-Linear关系拟合

PyTorch-Linear关系拟合

硬件:NVIDIA-GTX1080

软件:Windows7、python3.6.5、pytorch-gpu-0.4.1

一、基础知识

1、问题:y = a * x^2 + b

2、继承 torch 的 Module

二、代码展示

import torch
import torch.nn.functional as Func     # 激励函数都在这
import matplotlib.pyplot as plt

x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)  # x data (tensor), shape=(100, 1), unsqueeze(dim = 1): shape(100)->shape(100,1)
y = x.pow(2) + 0.2*torch.rand(x.size())                 # noisy y data (tensor), shape=(100, 1)

# 画图
#plt.scatter(x.data.numpy(), y.data.numpy())
#plt.show()

class Net(torch.nn.Module):  # 继承 torch 的 Module
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()     # 继承 Module 的 __init__ 功能
        # 定义每层用什么样的形式
        self.hidden = torch.nn.Linear(n_feature, n_hidden)   # 隐藏层线性输出, type(hidden) = torch.nn.modules.linear.Linear(一个类)
        self.predict = torch.nn.Linear(n_hidden, n_output)   # 输出层线性输出, type(predict) = torch.nn.modules.linear.Linear(一个类)

    def forward(self, x):   # 这同时也是 Module 中的 forward 功能
        # 正向传播输入值, 神经网络分析出输出值
        x = Func.relu(self.hidden(x))      # 激励函数(隐藏层的线性值) self.hidden.forward(x)
        x = self.predict(x)             # 输出值 self.predict.forward(x)
        return x
    
net = Net(n_feature=1, n_hidden=10, n_output=1)

# print(net)  # net 的结构

# optimizer 是训练的工具
optimizer = torch.optim.SGD(net.parameters(), lr=0.5)  # 传入 net 的所有参数, 学习率
loss_func = torch.nn.MSELoss()      # 预测值和真实值的误差计算公式 (均方差), type(torch.nn.MSELoss()) = torch.nn.modules.loss.MSELoss(一个类)

plt.ion()   # 画图
plt.show()

for t in range(100):
    prediction = net(x)     # 喂给 net 训练数据 x, 输出预测值 net.forward(x)
    loss = loss_func(prediction, y)     # 计算两者的误差 loss_func.forward(prediction, y)
    
    optimizer.zero_grad()   # 清空上一步的残余更新参数值
    loss.backward()         # 误差反向传播, 计算参数更新值
    optimizer.step()        # 将参数更新值施加到 net 的 parameters 上
    
    if t % 5 == 0:
        # plot and show learning process
        plt.cla()
        plt.scatter(x.data.numpy(), y.data.numpy())
        plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
        plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color':  'red'})
        plt.pause(0.1)

三、结果展示

四、参考:

https://morvanzhou.github.io/

 

任何问题请加唯一QQ2258205918(名称samylee)!

唯一VX:samylee_csdn

### 使用 PyTorch 构建和训练分类器 #### 准备工作环境 为了构建并训练一个分类器模型,首先需要安装必要的库。如果尚未安装 PyTorch 和 torchvision 库,则可以通过 pip 安装。 ```bash pip install torch torchvision ``` #### 导入所需模块 接下来,在 Python 脚本中导入所需的包: ```python import torch from torch import nn, optim from torch.utils.data import DataLoader from torchvision import datasets, transforms ``` #### 数据预处理 数据集通常需要经过转换才能被神经网络有效利用。这里定义了一个简单的变换链来标准化输入图像,并将其尺寸调整到适合模型的形式。 ```python transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) ]) ``` 加载 MNIST 手写数字识别数据集作为例子,应用上述变换操作。 ```python train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform) train_loader = DataLoader(dataset=train_dataset, batch_size=64, shuffle=True) test_loader = DataLoader(dataset=test_dataset, batch_size=1000, shuffle=False) ``` #### 创建简单全连接层分类器 下面是一个两层感知机的例子,用于实现多类别分类任务。 ```python class SimpleClassifier(nn.Module): def __init__(self): super(SimpleClassifier, self).__init__() self.fc1 = nn.Linear(28 * 28, 128) # 输入大小取决于图片分辨率 self.fc2 = nn.Linear(128, 10) # 输出大小等于类别的数量 def forward(self, x): x = x.view(-1, 28*28) # 展平二维张量成一维向量 x = torch.relu(self.fc1(x)) output = self.fc2(x) return output # 返回未激活的结果给交叉熵损失函数计算 ``` 实例化该模型对象,并移动至 GPU 上运行(如果有可用的话)。 ```python device = 'cuda' if torch.cuda.is_available() else 'cpu' model = SimpleClassifier().to(device) ``` #### 设置优化算法与损失函数 选择合适的优化方法对于提高收敛速度至关重要;而交叉熵则常用来衡量预测分布同真实标签之间的差异程度。 ```python criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) ``` #### 开始训练过程 遍历整个训练集多次迭代更新权重参数直至达到满意的性能指标为止。 ```python epochs = 5 for epoch in range(epochs): running_loss = 0.0 for images, labels in train_loader: images, labels = images.to(device), labels.to(device) optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f"Epoch {epoch+1}/{epochs}, Loss: {running_loss/len(train_loader)}") ``` 完成以上步骤之后就可以得到一个初步训练好的分类器了[^1]。 #### 测试模型准确性 最后通过测试集评估模型的表现情况。 ```python correct = 0 total = 0 with torch.no_grad(): for data in test_loader: images, labels = data[0].to(device), data[1].to(device) outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the 10000 test images: %d %%' % ( 100 * correct / total)) ``` 此部分展示了如何使用 PyTorch 来创建、配置以及训练基本的分类器模型。当然实际应用场景下可能还需要考虑更多因素比如正则化技术防止过拟合等问题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值