pytorch 常用线性函数详解

PyTorch常用线性函数详解

在本文中,我们将介绍PyTorch中常用的线性函数,包括线性层、批归一化、Dropout和ReLU。我们还将提供两个示例,一个是使用线性层进行图像分类,另一个是使用批归一化进行图像分割。

线性层

线性层是一种将输入张量与权重矩阵相乘并加上偏置向量的操作。在PyTorch中,我们可以使用nn.Linear模块来实现线性层。以下是一个示例:

import torch
import torch.nn as nn

# Define input tensor
x = torch.randn(1, 784)

# Define linear layer
linear = nn.Linear(784, 10)

# Apply linear layer
y = linear(x)

# Print shape of output tensor
print(y.shape)

在这个示例中,我们首先定义了一个输入张量x,它的形状为(1, 784)。接下来,我们定义了一个线性层linear,它将输入张量的大小从(1, 784)转换为(1, 10)。然后,我们将输入张量x应用于线性层,并打印输出张量y的形状。

批归一化

批归一化是一种将输入张量的均值和方差归一化的操作。在PyTorch中,我们可以使用nn.BatchNorm2d模块来实现批归一化。以下是一个示例:

import torch
import torch.nn as nn

# Define input tensor
x = torch.randn(1, 64, 32, 32)

# Define batch normalization layer
batch_norm = nn.BatchNorm2d(64)

# Apply batch normalization
y = batch_norm(x)

# Print shape of output tensor
print(y.shape)

在这个示例中,我们首先定义了一个输入张量x,它的形状为(1, 64, 32, 32)。接下来,我们定义了一个批归一化层batch_norm,它将输入张量的每个通道的均值和方差归一化。然后,我们将输入张量x应用于批归一化层,并打印输出张量y的形状。

Dropout

Dropout是一种在训练过程中随机丢弃一些神经元的操作,以减少过拟合。在PyTorch中,我们可以使用nn.Dropout模块来实现Dropout。以下是一个示例:

import torch
import torch.nn as nn

# Define input tensor
x = torch.randn(1, 64, 32, 32)

# Define dropout layer
dropout = nn.Dropout(p=0.5)

# Apply dropout
y = dropout(x)

# Print shape of output tensor
print(y.shape)

在这个示例中,我们首先定义了一个输入张量x,它的形状为(1, 64, 32, 32)。接下来,我们定义了一个Dropout层dropout,它将输入张量的每个元素随机丢弃一定比例的概率。我们使用p=0.5来指定丢弃50%的概率。然后,我们将输入张量x应用于Dropout层,并打印输出张量y的形状。

ReLU

ReLU是一种常用的激活函数,它将所有负值都设置为零。在PyTorch中,我们可以使用nn.ReLU模块来实现ReLU。以下是一个示例:

import torch
import torch.nn as nn

# Define input tensor
x = torch.randn(1, 64, 32, 32)

# Define ReLU layer
relu = nn.ReLU(inplace=True)

# Apply ReLU
y = relu(x)

# Print shape of output tensor
print(y.shape)

在这个示例中,我们首先定义了一个输入张量x,它的形状为(1, 64, 32, 32)。接下来,我们定义了一个ReLU层relu,它将输入张量的所有负值都设置为零。我们使用inplace=True来指定在原地修改输入张量。然后,我们将输入张量x应用于ReLU层,并打印输出张量y的形状。

示例1:使用线性层进行图像分类

以下是使用线性层进行图像分类的示例代码:

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

# Define transformation
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])

# Load dataset
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)

# Define data loader
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)

# Define model
model = nn.Sequential(
    nn.Linear(3*32*32, 512),
    nn.ReLU(inplace=True),
    nn.Linear(512, 10)
)

# Define loss function and optimizer
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# Train model
for epoch in range(10):
    for i, (images, labels) in enumerate(train_loader):
        # Flatten images
        images = images.view(-1, 3*32*32)

        # Forward pass
        outputs = model(images)
        loss = criterion(outputs, labels)

        # Backward and optimize
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

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

# Test model
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        # Flatten images
        images = images.view(-1, 3*32*32)

        # Forward pass
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)

        # Compute accuracy
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

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

在这个示例中,我们首先定义了一个变换transform,它将图像转换为张量并进行归一化。然后,我们加载了CIFAR10数据集,并定义了训练和测试数据加载器。接下来,我们定义了一个包含两个线性层和一个ReLU层的模型。我们使用交叉熵损失函数和随机梯度下降优化器来训练模型。最后,我们在测试集上测试模型,并打印准确率。

示例2:使用批归一化进行图像分割

以下是使用批归一化进行图像分割的示例代码:

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

# Define transformation
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# Load dataset
train_dataset = datasets.Cityscapes(root='./data', split='train', mode='fine', target_type='semantic', transform=transform)
test_dataset = datasets.Cityscapes(root='./data', split='test', mode='fine', target_type='semantic', transform=transform)

# Define data loader
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=16, shuffle=False)

# Define model
model = nn.Sequential(
    nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(64),
    nn.ReLU(inplace=True),
    nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(64),
    nn.ReLU(inplace=True),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(128),
    nn.ReLU(inplace=True),
    nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(128),
    nn.ReLU(inplace=True),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(256),
    nn.ReLU(inplace=True),
    nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(256),
    nn.ReLU(inplace=True),
    nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(256),
    nn.ReLU(inplace=True),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(512),
    nn.ReLU(inplace=True),
    nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(512),
    nn.ReLU(inplace=True),
    nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(512),
    nn.ReLU(inplace=True),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(512),
    nn.ReLU(inplace=True),
    nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(512),
    nn.ReLU(inplace=True),
    nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(512),
    nn.ReLU(inplace=True),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.ConvTranspose2d(512, 256, kernel_size=4, stride=2, padding=1),
    nn.BatchNorm2d(256),
    nn.ReLU(inplace=True),
    nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(256),
    nn.ReLU(inplace=True),
    nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(256),
    nn.ReLU(inplace=True),
    nn.ConvTranspose2d(256, 128, kernel_size=4, stride=2, padding=1),
    nn.BatchNorm2d(128),
    nn.ReLU(inplace=True),
    nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(128),
    nn.ReLU(inplace=True),
    nn.ConvTranspose2d(128, 64, kernel_size=4, stride=2, padding=1),
    nn.BatchNorm2d(64),
    nn.ReLU(inplace=True),
    nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
    nn.BatchNorm2d(64),
    nn.ReLU(inplace=True),
    nn.Conv2d(64, 19, kernel_size=1, stride=1)
)

# Define loss function and optimizer
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=0.0005)

# Train model
for epoch in range(10):
    for i, (images, labels) in enumerate(train_loader):
        # Forward pass
        outputs = model(images)
        loss = criterion(outputs, labels)

        # Backward and optimize
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

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

# Test model
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        # Forward pass
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)

        # Compute accuracy
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

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

在这个示例中,我们首先定义了一个变换transform,它将图像转换为张量并进行归一化。然后,我们加载了Cityscapes数据集,并定义了训练和测试数据加载器。接下来,我们定义了一个包含多个卷积层、批归一化层和反卷积层的模型。我们使用交叉熵损失函数和随机梯度下降优化器来训练模型。最后,我们在测试集上测试模型,并打印准确率。

总结

在本文中,我们介绍了PyTorch中常用的线性函数,包括线性层、批归一化、Dropout和ReLU,并提供了两个示例说明。这些技术对于图像分类和图像分割任务非常有用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch 常用线性函数详解 - Python技术站

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

相关文章

  • tesseract cuda pytorch安装 提升Tesseract-OCR输出的质量

    tesseract下载地址:https://digi.bib.uni-mannheim.de/tesseract/   https://blog.csdn.net/u010454030/article/details/80515501   http://www.freeocr.net/   OpenCV OCR and text recognition wi…

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

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

    2023年4月6日
    00
  • pytorch中histc()函数与numpy中histogram()及histogram2d()函数

    引言   直方图是一种对数据分布的描述,在图像处理中,直方图概念非常重要,应用广泛,如图像对比度增强(直方图均衡化),图像信息量度量(信息熵),图像配准(利用两张图像的互信息度量相似度)等。 1、numpy中histogram()函数用于统计一个数据的分布 numpy.histogram(a, bins=10, range=None, normed=None…

    2023年4月8日
    00
  • Pytorch入门之VAE

    关于自编码器的原理见另一篇博客 : 编码器AE & VAE 这里谈谈对于变分自编码器(Variational auto-encoder)即VAE的实现。   1. 稀疏编码 首先介绍一下“稀疏编码”这一概念。        早期学者在黑白风景照片中可以提取到许多16*16像素的图像碎片。而这些图像碎片几乎都可由64种正交的边组合得到。而且组合出一张碎…

    2023年4月8日
    00
  • Pytorch 加载保存模型,进行模型推断【直播】2019 年县域农业大脑AI挑战赛—(三)保存结果

    在模型训练结束,结束后,通常是一个分割模型,输入 1024×1024 输出 4x1024x1024。 一种方法就是将整个图切块,然后每张预测,但是有个不好处就是可能在边界处断续。   由于这种切块再预测很ugly,所以直接遍历整个图预测(这就是相当于卷积啊),防止边界断续,还有一个问题就是防止图过大不能超过20M。 很有意思解决上边的问题。话也不多说了。直接…

    2023年4月6日
    00
  • pytorch使用过程中遇到的一些问题

    问题一 ImportError: No module named torchvision torchvison:图片、视频数据和深度学习模型 解决方案 安装torchvision,参照官网 问题二 安装torchvision过程中遇到 Could not find a version that satisfies the requirement olefil…

    PyTorch 2023年4月8日
    00
  • 动手学深度学习PyTorch版-task03

    课后习题 训练集、验证集和测试集的意义https://blog.csdn.net/ch1209498273/article/details/78266558有了模型后,训练集就是用来训练参数的,说准确点,一般是用来梯度下降的。而验证集基本是在每个epoch完成后,用来测试一下当前模型的准确率。因为验证集跟训练集没有交集,因此这个准确率是可靠的。那么为啥还需要…

    2023年4月8日
    00
  • Anaconda安装pytorch和paddle的方法步骤

    安装PyTorch和Paddle需要先安装Anaconda,以下是Anaconda安装PyTorch和Paddle的方法步骤的完整攻略。 1. 安装Anaconda 首先,需要从Anaconda官网下载适合自己操作系统的安装包,然后按照安装向导进行安装。安装完成后,可以在命令行中输入conda –version来检查是否安装成功。 2. 安装PyTorch…

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