Pytorch基础(四)—— 卷积层

一、概念

卷积从数学的角度讲是一种矩阵的运算方法。我们可以用一个卷积核对一个矩阵进行卷积运算,具体运算过程图示可以见pytorch官网
在这里插入图片描述
在这里插入图片描述

卷积运算按输入数据的通道数可分为单通道和多通道两种。
单通道是指卷积核只有一个的情况。
多通道包括两种。
分别是单个卷积核对应多通道输入;多卷积核对应多通道输入,这种最常见。
具体内容可见文章。
深度学习笔记(一):卷积层+池化层+激活函数+全连接层

二、Pytorch示例

在torch.nn下,卷积层按输入数据维度可分为1维,2维,3维。最常用的就是2维Conv2d,参数解释可以见官网。
下面用CIFAR10数据集做测试。

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10("../dataset", train=False, transform=torchvision.transforms.ToTensor(), download=False)

dataloader = DataLoader(dataset, batch_size=64)

class Wzh(nn.Module):
    def __init__(self):
        super(Wzh, self).__init__()
        self.conv1 = Conv2d(in_channels=3, out_channels=6, kernel_size=3)

    def forward(self, a):
        a = self.conv1(a)
        return a

wzh = Wzh()

w = SummaryWriter("Conv2D")
i = 0
for data in dataloader:
    imgs, targets = data
    output = wzh(imgs)    
    output = torch.reshape(output, (-1, 3, 30, 30))
    
    w.add_images("input", imgs, i)
    w.add_images("output", output, i)
    i = i + 1

卷积结果如下:
原图原图
在这里插入图片描述卷积后
从图的变化来看,卷积后的图片保留了原始图片的边缘特征。

### PyTorch卷积层的使用方法 #### 创建并初始化卷积层PyTorch中,可以通过`nn.Conv2d`类创建二维卷积层。此函数接收几个重要参数,包括输入通道数、输出通道数以及卷积核大小等[^1]。 ```python import torch.nn as nn conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1) ``` 这段代码定义了一个接受三通道(如RGB图像)作为输入,并产生十六个不同特征图作为输出的卷积层;同时指定了卷积核尺寸为\(3 \times 3\)像素,步幅(stride)设为1表示每次移动一格进行计算,填充(padding)同样设置成1以保持输入输出空间维度一致。 #### 将卷积层应用于张量 一旦建立了卷积层实例之后,就可以将其作用于任意形状匹配的数据上: ```python input_tensor = torch.randn(8, 3, 64, 64) # 假设有batch size为8的一批图片数据 output_tensor = conv_layer(input_tensor) print(output_tensor.shape) # 输出应形如torch.Size([8, 16, 64, 64]),即经过一层Conv2d变换后的结果 ``` 上述例子展示了如何利用之前定义好的`conv_layer`对象对一批随机生成的小批量(batched)三维张量执行前向传播(forward pass),从而得到新的特征映射(feature maps)。 #### 构建多层卷积网络 对于更复杂的任务来说,单个卷积层往往不足以捕捉足够的抽象层次的信息。因此,在实践中经常采用堆叠多个这样的模块再加上其他组件比如最大池化(Max Pooling)等方式来增强模型表达能力[^3]。 ```python class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv_block = nn.Sequential( nn.Conv2d(3, 16, 3, 1, 1), nn.ReLU(), nn.MaxPool2d(kernel_size=2), nn.Conv2d(16, 32, 3, 1, 1), nn.ReLU(), nn.MaxPool2d(kernel_size=2) ) def forward(self, x): return self.conv_block(x) model = SimpleCNN() dummy_input = torch.zeros((1, 3, 128, 128)) out = model(dummy_input) print(out.shape) # 应该打印出类似torch.Size([1, 32, 32, 32]) ``` 在这个简单的案例里展示了一种由两组交替排列着的标准件组成的浅度卷积神经网路——每组内部先做一次线性的滤波操作再接激活函数(Rectified Linear Unit),最后通过下采样缩小分辨率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值