pytorch学习笔记六

部署运行你感兴趣的模型镜像

pytorch学习笔记六————使用神经网络拟合数据

上一章节我们用pytorch里面的工具实现了对数据进行线性回归,我们用的是线性模型,这次我们尝试使用神经网络模型对数据进行拟合,整个学习过程与前几章基本相同,就是在某些细节上面需要深究
pytorch有一个专门用于构建神经网络的子模块,称作为torch.nn,它包含创建各种神经网络结构所需的构建块,在这里提供的模型都是nn.Module的子模块,我们可以像调用一个函数一样调用他

线性模型

在pytroch里面的线性模型被称作为nn.Linear它接受3个参数:输入特征的数量,输出特征的数量,以及线性模型是否包含偏置(默认为True)
下面代码构建了一个最简单的线性模型,并且打印了其权重和偏置

import torch.nn as nn
linear_model = nn.Linear(1, 1)
linear_model(t_un_val)
print(linear_model.weight)
print(linear_model.weight)

nn中所有模块都被编写为可以同时为多个输入产生输出,这里的输入输出需要规定下格式,输入的格式是一个 B × N i n B\times N_{in} B×Nin的输入张量,B是批次大小,即一次处理B组数据; N i n N_{in} Nin为输入特征的数量.相应的,输出的格式为 B × N o u t B\times N_{out} B×Nout
对于我们之前的温度数据,我们需要调整输入格式,在这里B为数据的数量, N i n N_{in} Nin为1,这通过unsqueeze()可以很容易的完成

t_c = [0.5,  14.0, 15.0, 28.0, 11.0,  8.0,  3.0, -4.0,  6.0, 13.0, 21.0]
t_u = [35.7, 55.9, 58.2, 81.9, 56.3, 48.9, 33.9, 21.8, 48.4, 60.4, 68.4]
t_c = torch.tensor(t_c).unsqueeze(1)
t_u = torch.tensor(t_u).unsqueeze(1)
t_u.shape

如此,我们用nn.Linear(1,1)代替手动构造模型吗然后将线性模型参数传递给优化器

linear_model = nn.Linear(1, 1)
optimizer = optim.SGD(
    linear_model.parameters(),
    lr=1e-2)

所以我们可以用parameters()来访问模型拥有的参数列表

linear_model.parameters()
# <generator object Module.parameters at 0x7f94b4a8a750>
list(linear_model.parameters())
# [Parameter containing:
#  tensor([[0.7398]], requires_grad=True), Parameter containing:
#  tensor([0.7974], requires_grad=True)]

因此我们可以实现整个模型,其中损失函数我们用nn.MSELoss()代替,这是官方里的均方误差损失函数

def training_loop(n_epochs, optimizer, model, loss_fn, t_u_train, t_u_val,
                  t_c_train, t_c_val):
    for epoch in range(1, n_epochs + 1):
        t_p_train = model(t_u_train)
        loss_train = loss_fn(t_p_train, t_c_train)

        t_p_val = model(t_u_val)
        loss_val = loss_fn(t_p_val, t_c_val)
        
        optimizer.zero_grad()
        loss_train.backward()
        optimizer.step()

        if epoch == 1 or epoch % 1000 == 0:
            print(f"Epoch {epoch}, Training loss {loss_train.item():.4f},"
                  f" Validation loss {loss_val.item():.4f}")

training_loop(
    n_epochs = 3000, 
    optimizer = optimizer,
    model = linear_model,
    loss_fn = loss_fn,
    t_u_train = t_un_train,
    t_u_val = t_un_val, 
    t_c_train = t_c_train,
    t_c_val = t_c_val)

神经网络模型

相比较于上一个模型实现,我们只需要将线性模型替换成神经网络模型即可
一个最简单的神经网络由三个部分组成:一个线性模块,然后一个激活函数,接着又是一个线性模块
nn提供了一种通过nn.Sequential容器来连接模型的方式

seq_model = nn.Sequential(
            nn.Linear(1, 13),
            nn.Tanh(),
            nn.Linear(13, 1))

检查参数的方法,当检查几个子模块组成的模型的参数时,通过名称识别参数时很方便的,named_parameters()方法可以实现该功能

print([param.shape for param in seq_model.parameters()])
for name, param in seq_model.named_parameters():
    print(name, param.shape)

可以看出sequential中模块的名称就是在模块中出现的序号,它也接受orderedDict,可以用它来命名传递给sequential里的模块,我们也可以通过将子模块作为属性来访问一个特定的参数

from collections import OrderedDict
seq_model = nn.Sequential(OrderedDict([
    ('hidden_linear', nn.Linear(1, 8)),
    ('hidden_activation', nn.Tanh()),
    ('output_linear', nn.Linear(8, 1))
]))
print(seq_model.output_linear.bias)

因此将training_loop里的模型参数改成神经网络模型即完成了一个最简单的数据模型
同样我们将其打印出来看其效果,总的来说做的不错
在这里插入图片描述

from matplotlib import pyplot as plt

t_range = torch.arange(20., 90.).unsqueeze(1)

fig = plt.figure(dpi=600)
plt.xlabel("Fahrenheit")
plt.ylabel("Celsius")
plt.plot(t_u.numpy(), t_c.numpy(), 'o')
plt.plot(t_range.numpy(), seq_model(0.1 * t_range).detach().numpy(), 'c-')
plt.plot(t_u.numpy(), seq_model(0.1 * t_u).detach().numpy(), 'kx')

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### PyTorch 学习笔记概述 李毅编写的《PyTorch学习笔记》是一份详尽的学习指南,旨在帮助读者掌握深度学习框架PyTorch的核心概念和技术。这份笔记不仅涵盖了基础理论知识,还提供了大量实践案例和代码实现。 #### 主要内容结构 1. **环境搭建** 安装配置PyTorch运行所需的软件环境,包括Python版本的选择、CUDA支持以及Anaconda的使用方法[^2]。 2. **张量操作** 解释了如何创建、转换和处理多维数组(即张量),这是构建神经网络模型的基础构件之一[^3]. 3. **自动求导机制** 描述了Autograd模块的工作原理及其在反向传播算法中的应用,使用户能够轻松定义复杂的计算图并高效训练模型[^4]. 4. **优化器与损失函数** 探讨了几种常用的梯度下降变体(SGD, Adam等)及相应的损失衡量标准(MSE Loss, CrossEntropyLoss等),这些组件对于调整权重参数至关重要[^5]. 5. **数据加载与预处理** 展示了Dataset类和DataLoader类的功能特性,它们可以简化大规模图像分类任务的数据读取流程;同时也介绍了常见的图片增强技术来扩充样本集规模[^6]. 6. **卷积神经网络(CNN)** 结合具体实例深入剖析CNN架构设计思路,如LeNet,VGG,resnet系列,并给出完整的项目源码供参考学习[^7]. 7. **循环神经网络(RNN/LSTM/GRU)** 阐述时间序列预测场景下RNN家族成员的特点优势,通过手写字符识别实验验证其有效性[^8]. 8. **迁移学习实战演练** 利用预训练好的大型模型作为特征提取器,在新领域内快速建立高性能的应用程序,减少重复劳动成本的同时提高了泛化能力[^9]. 9. **分布式训练入门指导** 当面对超大数据集时,单机难以满足需求,此时可借助于torch.distributed包来进行集群式的协同工作模式探索[^10]. ```python import torch from torchvision import datasets, transforms transform = transforms.Compose([transforms.ToTensor()]) train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True) for images, labels in train_loader: print(images.shape) break ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值