pytorch实现特殊的Module–Sqeuential三种写法

yizhihongxing

PyTorch中的nn.Sequential是一个特殊的模块,它允许我们按顺序组合多个模块。在本文中,我们将介绍三种不同的方法来使用nn.Sequential,并提供两个示例。

方法1:使用列表

第一种方法是使用列表来定义nn.Sequential。在这种方法中,我们将每个模块作为列表的一个元素,并将它们按顺序排列。以下是一个示例:

import torch.nn as nn

model = nn.Sequential([
    nn.Linear(784, 500),
    nn.ReLU(),
    nn.Linear(500, 10)
])

在这个示例中,我们定义了一个名为modelnn.Sequential模块,其中包含一个线性层、一个ReLU激活函数和另一个线性层。这些模块按照它们在列表中的顺序排列。

方法2:使用有序字典

第二种方法是使用有序字典来定义nn.Sequential。在这种方法中,我们将每个模块作为有序字典的一个键值对,并将它们按顺序排列。以下是一个示例:

import torch.nn as nn
from collections import OrderedDict

model = nn.Sequential(OrderedDict([
    ('fc1', nn.Linear(784, 500)),
    ('relu1', nn.ReLU()),
    ('fc2', nn.Linear(500, 10))
]))

在这个示例中,我们定义了一个名为modelnn.Sequential模块,其中包含一个名为fc1的线性层、一个名为relu1的ReLU激活函数和另一个名为fc2的线性层。这些模块按照它们在有序字典中的顺序排列。

方法3:使用函数

第三种方法是使用函数来定义nn.Sequential。在这种方法中,我们定义一个函数,该函数接受一个模块列表作为参数,并返回一个nn.Sequential模块。以下是一个示例:

import torch.nn as nn

def make_model():
    layers = [
        nn.Linear(784, 500),
        nn.ReLU(),
        nn.Linear(500, 10)
    ]
    return nn.Sequential(*layers)

model = make_model()

在这个示例中,我们定义了一个名为make_model的函数,该函数返回一个nn.Sequential模块。我们将模块列表作为参数传递给函数,并使用*运算符将它们解包为单独的参数。然后,我们将返回的nn.Sequential模块赋值给名为model的变量。

示例1:使用nn.Sequential进行手写数字识别

以下是一个使用nn.Sequential进行手写数字识别的示例:

import torch
import torch.nn as nn
import torchvision.datasets as dsets
import torchvision.transforms as transforms

# 加载MNIST数据集
train_dataset = dsets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = dsets.MNIST(root='./data', train=False, transform=transforms.ToTensor())

# 加载数据集
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=100, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=100, shuffle=False)

# 定义模型
model = nn.Sequential(
    nn.Linear(784, 500),
    nn.ReLU(),
    nn.Linear(500, 10)
)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

# 训练模型
total_step = len(train_loader)
for epoch in range(10):
    for i, (images, labels) in enumerate(train_loader):
        images = images.reshape(-1, 28*28)

        # 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)

        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if (i+1) % 100 == 0:
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, 10, i+1, total_step, loss.item()))

# 测试模型
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        images = images.reshape(-1, 28*28)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    print('Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total))

在这个示例中,我们首先加载了MNIST数据集。然后,我们定义了一个名为modelnn.Sequential模块,并定义了一个名为criterion的损失函数和一个名为optimizer的优化器。然后,我们使用训练数据对模型进行了训练,并在每个epoch结束时输出损失值。最后,我们使用测试数据对模型进行了测试,并输出了模型的准确率。

示例2:使用nn.Sequential进行猫狗分类

以下是一个使用nn.Sequential进行猫狗分类的示例:

import torch
import torch.nn as nn
import torchvision.datasets as dsets
import torchvision.transforms as transforms
import torchvision.models as models

# 加载数据集
train_dataset = dsets.ImageFolder(root='./data/train', transform=transforms.Compose([
    transforms.Resize(224),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
]))
test_dataset = dsets.ImageFolder(root='./data/test', transform=transforms.Compose([
    transforms.Resize(224),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
]))
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=100, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=100, shuffle=False)

# 加载预训练模型
model = models.resnet18(pretrained=True)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 2)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)

# 训练模型
total_step = len(train_loader)
for epoch in range(10):
    for i, (images, labels) in enumerate(train_loader):
        # 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)

        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if (i+1) % 100 == 0:
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, 10, i+1, total_step, loss.item()))

# 测试模型
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    print('Accuracy of the model on the test images: {} %'.format(100 * correct / total))

在这个示例中,我们首先加载了猫狗分类数据集。然后,我们加载了一个预训练的ResNet18模型,并将其输出层替换为一个名为fc的线性层。然后,我们定义了一个名为criterion的损失函数和一个名为optimizer的优化器。然后,我们使用训练数据对模型进行了训练,并在每个epoch结束时输出损失值。最后,我们使用测试数据对模型进行了测试,并输出了模型的准确率。

结论

在本文中,我们介绍了三种不同的方法来使用nn.Sequential,并提供了两个示例。如果您按照这些方法进行操作,您应该能够使用nn.Sequential成功定义和训练PyTorch模型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch实现特殊的Module–Sqeuential三种写法 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Pytorch模型量化

    在深度学习中,量化指的是使用更少的bit来存储原本以浮点数存储的tensor,以及使用更少的bit来完成原本以浮点数完成的计算。这么做的好处主要有如下几点: 更少的模型体积,接近4倍的减少; 可以更快的计算,由于更少的内存访问和更快的int8计算,可以快2~4倍。 一个量化后的模型,其部分或者全部的tensor操作会使用int类型来计算,而不是使用量化之前的…

    2023年4月8日
    00
  • 人工智能,丹青圣手,全平台(原生/Docker)构建Stable-Diffusion-Webui的AI绘画库教程(Python3.10/Pytorch1.13.0)

    世间无限丹青手,遇上AI画不成。最近一段时间,可能所有人类画师都得发出一句“既生瑜,何生亮”的感叹,因为AI 绘画通用算法Stable Diffusion已然超神,无需美术基础,也不用经年累月的刻苦练习,只需要一台电脑,人人都可以是丹青圣手。 本次我们全平台构建基于Stable-Diffusion算法的Webui可视化图形界面服务,基于本地模型来进行AI绘画…

    2023年4月5日
    00
  • pytorch单机多卡训练

    训练 只需要在model定义处增加下面一行: model = model.to(device) # device为0号 model = torch.nn.DataParallel(model) 载入模型 如果是多GPU载入,没有问题 如果训练时是多GPU,但是测试时是单GPU,会出现报错 解决办法

    PyTorch 2023年4月8日
    00
  • Yolov5训练意外中断后如何接续训练详解

    当YOLOv5的训练意外中断时,我们可以通过接续训练来恢复训练过程,以便继续训练模型。下面是接续训练的详细步骤: 首先,我们需要保存当前训练的状态。我们可以使用PyTorch提供的torch.save()函数将模型的参数和优化器的状态保存到文件中。例如,我们可以使用以下代码将模型的参数和优化器的状态保存到文件checkpoint.pth中: torch.sa…

    PyTorch 2023年5月15日
    00
  • Pytorch GPU内存占用很高,但是利用率很低如何解决

    当PyTorch GPU内存占用很高,但是利用率很低时,可能是由于以下原因: 数据加载器的num_workers参数设置过高,导致CPU和GPU之间的数据传输效率低下。 模型过于复杂,导致GPU内存占用过高,而GPU利用率低下。 训练数据集过小,导致GPU利用率低下。 为了解决这个问题,我们可以采取以下措施: 调整数据加载器的num_workers参数,使其…

    PyTorch 2023年5月15日
    00
  • PyTorch实现用CNN识别手写数字

    程序来自莫烦Python,略有删减和改动。 import os import torch import torch.nn as nn import torch.utils.data as Data import torchvision import matplotlib.pyplot as plt torch.manual_seed(1) # reprodu…

    2023年4月7日
    00
  • Pytorch nn.Unfold() 与 nn.Fold()图码详解(最新推荐)

    以下是PyTorch中nn.Unfold()与nn.Fold()函数的详细攻略,包含两个示例说明。 简介 在PyTorch中,nn.Unfold()和nn.Fold()函数是用于对张量进行展开和折叠操作的函数。本文将介绍如何使用这两个函数来进行张量的展开和折叠操作。 示例1:使用nn.Unfold()函数对张量进行展开操作 在这个示例中,我们将使用nn.Un…

    PyTorch 2023年5月15日
    00
  • pytorch 7 save_reload 保存和提取神经网络

    import torch import matplotlib.pyplot as plt # torch.manual_seed(1) # reproducible # fake data x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1) # x data (tensor), shape=(100,…

    2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部