Pytorch 实现下采样的方法(卷积和池化)

本文详细探讨了卷积下采样(通过Max Pooling和卷积层)在深度学习中的应用,以及如何通过不同卷积核大小配合padding保持图像尺寸。通过实例代码展示了3x3、5x5和7x7卷积核的使用,并解释了卷积参数计算方法。
摘要由CSDN通过智能技术生成

# 卷积核大小和下采样实现

标签(空格分隔): 深度学习
https://www.zhihu.com/question/307839910(卷积下采样和池化下采样的区别)
---

### 1.下采样的实现:maxpooling 或者 conv,k=2,s=2 实现下采样两倍(池化下采样比较粗暴,可能将有用的信息滤除掉,而卷积下采样过程控制了步进大小,信息融合较好)
```
        self.conv_downsampling = nn.Conv2d(3,3,kernel_size=2,stride=2)
        self.max_pooling = nn.MaxPool2d(kernel_size=2)
        输出:torch.Size([1, 3, 128, 128]) torch.Size([1, 3, 128, 128])

```

### 2.卷积核大小为3,5,7时,padding为1,2,3 时,图像卷积后大小不变(Pytorch默认conv的s=1,p=0)
```
        self.conv33 = nn.Conv2d(3,3,kernel_size=3,padding=1)
        self.conv55 = nn.Conv2d(3,3,kernel_size=5,padding=2)
        self.conv77 = nn.Conv2d(3,3,kernel_size=7,padding=3)
        输出:torch.Size([1, 3, 256, 256]) torch.Size([1, 3, 256, 256]) torch.Size([1, 3, 256, 256])

```
### 3.卷积核参数计算方法:卷积核大小(n*d*w) * inchanels * outchannels

## Code
```
import torch
from torch import  nn

class test(nn.Module):
    def __init__(self):
        super(test, self).__init__()
        self.conv_downsampling = nn.Conv2d(3,3,kernel_size=2,stride=2)
        self.max_pooling = nn.MaxPool2d(kernel_size=2)
        self.conv33 = nn.Conv2d(3,3,kernel_size=3,padding=1)
        self.conv55 = nn.Conv2d(3,3,kernel_size=5,padding=2)
        self.conv77 = nn.Conv2d(3,3,kernel_size=7,padding=3)
    def forward(self,x):
        out1 = self.conv_downsampling(x)
        out2 = self.max_pooling(x)
        out3 = self.conv33(x)
        out4 = self.conv55(x)
        out5 = self.conv77(x)
        print(out1.shape,out2.shape,\
              out3.shape,out4.shape,\
              out5.shape)

if __name__ == '__main__':
    data = torch.randn(1,3,256,256)
    test_func = test()
    test_func(data)

```

PyTorch中,卷积采样(convolutional downsampling)通常通过使用池化层(pooling layer)来实现池化层可以减小特征图的空间尺寸,从而实现采样的效果。以下是一个示例代码,演示如何在PyTorch中使用池化层进行卷积采样: ```python import torch import torch.nn as nn # 定义一个简单的卷积神经网络 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1) self.pool = nn.MaxPool2d(kernel_size=2, stride=2) def forward(self, x): x = self.conv1(x) x = self.pool(x) return x # 创建网络实例 net = Net() # 创建一个随机输入张量,大小为[batch_size, channels, height, width] input_tensor = torch.randn(1, 3, 32, 32) # 将输入张量传递给网络进行前向计算 output_tensor = net(input_tensor) # 打印输出张量的尺寸 print(output_tensor.size()) ``` 在上面的示例中,我们定义了一个简单的卷积神经网络(`Net`),其中包含一个卷积层(`conv1`)和一个池化层(`pool`)。在前向计算过程中,输入张量经过卷积层后,通过池化层进行下采样操作。最后,我们打印输出张量的尺寸,可以看到在空间维度上进行了下采样。 需要注意的是,池化层的参数`kernel_size`和`stride`可以根据具体需求进行调整,它们分别指定了池化窗口的大小和滑动步长。在示例中,我们使用了最大池化(`MaxPool2d`),还可以使用平均池化(`AvgPool2d`)等其他类型的池化层。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值