PyTorch 中的卷积层

写个小示例,构建一个卷积神经网络来实现一个对数据集进行Conv2d的一个卷积操作。 

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

dataset = torchvision.datasets.CIFAR10("../DATA", #设置保存路径
                                       train=False, #是否下载训练数据
                                       transform= torchvision.transforms.ToTensor(), #转换成tensor数据
                                       download= True #下载
                                       )
dataloader = DataLoader(dataset, batch_size=64) #每次迭代取64个数据

class Myconv2d(nn.Module):
    def __init__(self):
        super(Myconv2d, self).__init__()
        self.conv1 = Conv2d(in_channels=3,#输入图像的通道数
                            out_channels=6,#输出图像的通道数
                            kernel_size=3,#卷积核大小,可以用元组的方式设置不规则卷积核
                            stride=1,#卷积步长
                            padding=0)#是否对边缘进行填充

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

Mycnn = Myconv2d()

for data in dataloader:
    imgs,targets = data
    output = Mycnn(imgs)
    print(imgs.shape)
    print(output.shape)

 详细解释一下这段代码

这个就是下载并实例化测试数据集CIFAR10,这个数据集时由pytorch提供可以直接下载和调用。

运行完之后我们会发现多了一个DATA文件夹,路径为

"../DATA"  ..表示项目文件夹的上层文件夹中,一个.表示在项目文件夹中

你们也可以用自己的数据,不用官方提供的测试数据,pytorch第一步:加载数据Dataset_浪浪山猪的博客-CSDN博客

这段代码为加载数据,将数据集转化成可以迭代的数据集,每次迭代取数据集中的64个数据 不不懂的可以看我这个pytorch中的DataLoader_浪浪山猪的博客-CSDN博客

这个就是自定义卷积层了

这个代码段中定义了一个名为 Myconv2d 的类,继承自 PyTorch 中的 nn.Module 类。这个类实现了一个简单的卷积层,并定义了该层的输入通道数、输出通道数、卷积核大小、步长和填充等参数。

在初始化函数 __init__() 中,我们通过调用 Conv2d 函数来创建一个 2D 卷积层对象 self.conv1in_channels 参数指定输入数据的通道数,这里为 3,表示输入的是一张 RGB 彩色图片,有 3 个通道。out_channels 参数指定卷积层输出的通道数,这里为 6,表示卷积层会输出 6 个不同的特征图。kernel_size 参数指定卷积核的大小,这里为 3x3。stride 参数指定卷积核的步长,这里为 1,表示卷积核在水平和垂直方向上移动一步进行卷积操作。padding 参数指定图像边缘周围添加的填充像素数量,这里为 0,表示不添加填充。

在前向传播函数 forward() 中,我们将输入数据 x 传递给卷积层对象 self.conv1 前向传播函数 conv2d() 进行卷积操作,得到输出结果 x。最后将输出结果 x 返回,这个返回结果就是卷积层对输入数据进行卷积操作后得到的特征图。

需要注意的是,这个示例只使用了一个卷积层,因此在实际应用中可能并不够用。为了获得更好的卷积特征,我们通常会使用多个卷积层和池化层等结构来构建一个深度卷积神经网络。

实例化这个卷积层

对于dataloader进行迭代,我之前说了dataloader设置每次迭代取64张图片,对每张图片进行卷积操作Mycnn(imgs),这个Mycnn(img)就是调用卷积层中的forward前向传播函数,之前我们在初始化函数__init__中定义了一个卷积conv1。实际上就是对每张图片进行一个conv2d的一个卷积操作,而conv2d是pytorch内置的一个基本的卷积操作。具体来说,conv2d() 函数通过滑动大小为 n×n 的卷积核(也称为滤波器/过滤器),在输入数据的各个位置上进行点乘操作,并将结果叠加起来形成输出特征图。可以看一下官方文档Conv2d — PyTorch 2.0 documentation

运行结果是这个样子的

可以看出,每次迭代取64张图片作为一个图片组,卷积处理前为3通道数据,卷积处理后为6通道,30*30像素,因为之前调用conv2d就是传入的参数就是输入3通道图像,输出6通道图像。

为什么像素会变小呢,主要是因为边缘的像素点由于缺少邻近像素,没有办法进行卷积操作,我们设置的padding=0,表示不对边缘进行填充,如果。

这样一个简单的神经网络的卷积层的构建就完成了,希望对你今后的卷积神经网络的理解和学习有所帮助。

猜你喜欢

转载自blog.csdn.net/m0_50317149/article/details/130974350