Pytorch基本操作(7)——池化层、非线性激活

1 前言

在学习李沐在B站发布的《动手学深度学习》PyTorch版本教学视频中发现在操作使用PyTorch方面有许多地方看不懂,往往只是“动手”了,没有动脑。所以打算趁着寒假的时间好好恶补、整理一下PyTorch的操作,以便跟上课程。

学习资源:

2 池化层Pooling layers

2.1 最大池化层torch.nn.MaxPool2d

pytorch官方文档

  • kernel_size - 核大小

  • stride – 池化核移动的步长,一般就是池化核的大小

  • padding – implicit zero padding to be added on both sides

  • dilation – 空洞卷积的参数

  • return_indices – if True, will return the max indices along with the outputs. Useful for torch.nn.MaxUnpool2d later

  • ceil_mode – 出现池化核超出input范围时,是否保留此时覆盖的区域。when True, will use ceil instead of floor to compute the output shape

2.1.1 最大池化的目的

缩小图片,节省计算量

2.1.2 Dilated convolution空洞卷积

在这里插入图片描述

2.1.3 ceil floor mode取整

在这里插入图片描述

2.2 最大池化操作

在这里插入图片描述

2.3 代码操作

import torch
import torchvision
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
input = torch.tensor([[1, 2, 0, 3, 1], 
                     [0, 1, 2, 3, 1], 
                     [1, 2, 1, 0, 0],
                     [5, 2, 3, 1, 1], 
                     [2, 1, 0, 1, 1]], dtype = torch.float32)

input = torch.reshape(input, (-1, 1, 5, 5))
print(input.shape)
torch.Size([1, 1, 5, 5])
class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size = 3, ceil_mode = True)
        
    def forward(self, input):
        output = self.maxpool1(input)
        return output        
tudui = Tudui()
output = tudui(input)
output
tensor([[[[2., 3.],
          [5., 1.]]]])
class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size = 3, ceil_mode = False) # 改为false试一下
        
    def forward(self, input):
        output = self.maxpool1(input)
        return output    
    
tudui = Tudui()
output = tudui(input)
output
tensor([[[[2.]]]])

2.3.1 试下真实数据集

dataset = torchvision.datasets.CIFAR10("../dataset", train = False, download = True, 
                                      transform = torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset, batch_size = 64)
Files already downloaded and verified
tudui = Tudui()

writer = SummaryWriter('logs_maxpool')
step = 0

for data in dataloader:
    imgs, targets = data
    writer.add_images("input", imgs, step)
    output = tudui(imgs)
    writer.add_images("output", output, step)
    step += 1

writer.close()

对比来看output的图像明显模糊(如马赛克)且可以保留部分特征,减少了计算量

在这里插入图片描述

在这里插入图片描述

3 非线性激活Non-linear Activations

  • 非线性变换的主要目的就是给网络引入更多的非线性特征,提升模型的泛化能力

3.1 torch.nn.ReLU

官方介绍

R e L U ( x ) = ( x ) + = m a x ( 0 , x ) ReLU(x)=(x)^+ =max(0,x) ReLU(x)=(x)+=max(0,x)

在这里插入图片描述

3.1.1 代码

  • 关于inplace参数
    在这里插入图片描述
from torch import nn
from torch.nn import ReLU
from torch.nn import Sigmoid

input = torch.tensor([[1, -0.5], 
                     [-1, 3]])

input = torch.reshape(input, (-1, 1, 2, 2))
print(input.shape)
torch.Size([1, 1, 2, 2])
class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.relu1 = ReLU()
        
    def forward(self, input):
        output = self.relu1(input)
        return output
    
tudui = Tudui()
output = tudui(input)
print(output)
tensor([[[[1., 0.],
          [0., 3.]]]])

3.2 torch.nn.Sigmoid

官方介绍

S i g m o i d ( x ) = σ ( x ) = 1 1 + e x p ( − x ) Sigmoid(x)=\sigma(x)= \frac{1}{1+exp(−x)} Sigmoid(x)=σ(x)=1+exp(x)1

在这里插入图片描述

3.2.1 数据集实操

class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.relu1 = ReLU()
        self.sigmoid1 = Sigmoid()
        
    def forward(self, input):
        output = self.sigmoid1(input)
        return output
tensor([[[[0.7311, 0.3775],
          [0.2689, 0.9526]]]])
tudui = Tudui()

writer = SummaryWriter('logs_sigmoid')
step = 0
for data in dataloader:
    imgs, targets = data
    writer.add_images("input", imgs, step)
    
    output = tudui(imgs)
    writer.add_images("output", output, step)
    
    step += 1
    
writer.close()

可以看到

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch中,一维卷积的池化层和全连接层的参数设置和实现过程可以通过以下步骤进行: 1. 导入PyTorch库和定义一维卷积网络的模型类。 ``` import torch import torch.nn as nn class ConvNet(nn.Module): def __init__(self): super(ConvNet, self).__init__() self.conv1 = nn.Conv1d(in_channels=1, out_channels=32, kernel_size=5, stride=1) self.pool1 = nn.MaxPool1d(kernel_size=2, stride=2) self.fc1 = nn.Linear(32 * 48, 10) ``` 2. 在模型类中定义池化层和全连接层的参数。 对于池化层,我们需要定义池化核的大小和步幅。这里我们使用Max Pooling来进行池化操作。 对于全连接层,我们需要定义输入和输出的维度。在本例中,我们的1维卷积层输出的是32通道,每个通道有48个特征。所以输入维度为32 * 48,输出维度为10(这里我们假设我们的数据集有10个类别)。 3. 在模型类中定义前向传播函数。 ``` def forward(self, x): x = self.conv1(x) x = self.pool1(x) x = x.view(-1, 32 * 48) x = self.fc1(x) return x ``` 在前向传播函数中,我们首先通过卷积层对输入数据进行卷积操作,然后通过池化层对卷积结果进行池化操作。接着我们将池化后的结果展开为一维向量,并通过全连接层对其进行分类操作。 4. 实例化模型类并进行训练。 ``` model = ConvNet() criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): images = images.float() labels = labels.long() 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, num_epochs, i+1, total_step, loss.item())) ``` 在训练过程中,我们首先定义损失函数和优化器。然后遍历数据集中的每个批次,将输入数据和标签数据转换为浮点数和长整型数据类型。接着我们通过调用模型的前向传播函数得到输出结果,并计算损失函数。然后通过反向传播更新模型参数,最终得到训练结果。 总的来说,PyTorch中一维卷积的池化层和全连接层的参数设置和实现过程并不复杂,只需要按照上述步骤进行即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值