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

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 中的Variable一般常用的使用方法

    Variable一般的初始化方法,默认是不求梯度的 import torch from torch.autograd import Variable x_tensor = torch.randn(2,3) #将tensor转换成Variable x = Variable(x_tensor) print(x.requires_grad) #False x = …

    PyTorch 2023年4月7日
    00
  • pytorch之维度变化view/reshape;squeeze/unsqueeze;Transpose/permute;Expand/repeat

    ————恢复内容开始———— 概括:      一. view/reshape      作用几乎一模一样,保证size不变:意思就是各维度相乘之积相等(numel()),且具有物理意义,别瞎变,要不然破坏数据污染数据;     数据的存储、维度顺序非常重要,需要时刻记住            size没有保持固定住,报错  …

    PyTorch 2023年4月7日
    00
  • pytorch 修改预训练model

    class Net(nn.Module): def __init__(self , model): super(Net, self).__init__() #取掉model的后两层 self.resnet_layer = nn.Sequential(*list(model.children())[:-2]) self.transion_layer = nn.…

    PyTorch 2023年4月8日
    00
  • CentOS7.5服务器安装(并添加用户) anaconda3 并配置 PyTorch1.0

    ===========================================================================================[admin@localhost ~]$ sudo vim /etc/sudoersWe trust you have received the usual lecture fr…

    PyTorch 2023年4月8日
    00
  • 利用 Flask 搭建 PyTorch 深度学习服务

    https://www.pytorchtutorial.com/use-flask-to-build-pytorch-server/

    PyTorch 2023年4月8日
    00
  • Pytorch出现 raise NotImplementedError

    ————————————————————————— NotImplementedError Traceback (most recent call last) <ipython-input-32-aa392119100c> in <modul…

    PyTorch 2023年4月6日
    00
  • Pytorch:实战指南

    在做深度学习实验或项目时,为了得到最优的模型结果,中间往往需要很多次的尝试和修改。而合理的文件组织结构,以及一些小技巧可以极大地提高代码的易读易用性。根据我的个人经验,在从事大多数深度学习研究时,程序都需要实现以下几个功能: 模型定义 数据处理和加载 训练模型(Train&Validate) 训练过程的可视化 测试(Test/Inference) 另…

    2023年4月6日
    00
  • pytorch tensor 的拼接和拆分

    torch.catimport torch a=torch.randn(3,4) #随机生成一个shape(3,4)的tensort b=torch.randn(2,4) #随机生成一个shape(2,4)的tensor print(“a:”) print(a) print(“b:”) print(b) print(“拼接结果:”) #print(torch…

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