首页 > 其他分享 >卷积层

卷积层

时间:2023-08-15 20:45:11浏览次数:32  
标签:nn 卷积 self torch import Conv2d

卷积层

卷积操作

torch.nn是对torch.function的封装

pytorch官网详细介绍了常用的卷积操作函数:conv1d、conv2d、conv3d等,其中Conv1d针对一维的向量,Conv2d针对二维的向量,Conv3d针对三维的向量。在图像处理中,Conv2d的使用次数较多,因此以conv2d为例说明卷积操作(torch.nn.Conv2dtorch.nn.function.conv2d

stride和padding的含义

torch.nn的官网动态展示

import torch
import torch.nn.functional as F

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]])

kernel = torch.tensor([[1, 2, 1],
                       [0, 1, 0],
                       [2, 1, 0]])

# 由于conv2要求的输入的input的shape需要包含minibatch、in_channel、H、W,所以需要进行reshape
input = torch.reshape(input, (1, 1, 5, 5))
kernel = torch.reshape(kernel, (1, 1, 3, 3))

print(input.shape)
print(kernel.shape)

output = F.conv2d(input, kernel, stride=1)
print(output)

output2 = F.conv2d(input, kernel, stride=2)
print(output2)

output3 = F.conv2d(input, kernel, stride=1, padding=1)
print(output3)

卷积层在神经网络中的使用

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)

补充(常用参数为上面的前五个参数):

kernel_size:卷积核的大小,当等于3时表示3×3的卷积核;当为元组(1,2)时表示1×2的卷积核。

dilation:卷积核之间的距离,默认1。参考举例

groups:输入通道和输出通道之间的连接,默认1。

代码实现

以CIFAR10数据集为例:

1.显示卷积层的基本信息

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

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

dataloader = DataLoader(dataset, batch_size=64)

class Baseconv(nn.Module):
    def __init__(self):
        super(Baseconv, 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

baseconv = Baseconv()
print(baseconv)
# 输出结果显示卷积层的各个参数输入通道、输出通道、卷积核结构、步长(横向纵向每次都是走一步)

2.显示输入图像和输出图像的shape

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

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

dataloader = DataLoader(dataset, batch_size=64)

class Baseconv(nn.Module):
    def __init__(self):
        super(Baseconv, 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

baseconv = Baseconv()
for data in dataloader:
    imgs, targets = data
    output = baseconv(imgs)
    print(imgs.shape)
    print(output.shape)
    
#输入的batch-size为64,通道为3,大小32×32
#输出的batch_size为64,通道为6,大小30×30
#计算过程为(不是方形的则分别计算H和W):
输出=(输入+padding-卷积)/stride + 1
即30 = (32+0-3)/1 +1 

3.借助Tensorboard观察卷积前后的图像

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("./dataset2",train=False, transform=torchvision.transforms.ToTensor(),download=True)

dataloader = DataLoader(dataset, batch_size=64)

class Baseconv(nn.Module):
    def __init__(self):
        super(Baseconv, 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

baseconv = Baseconv()

writer = SummaryWriter("logs")

step = 0
for data in dataloader:
    imgs, targets = data
    output = baseconv(imgs)
    # torch.Size([64, 3, 32, 32])
    writer.add_images("Conv2d_input", imgs, step)
    # 由于卷积操作之后的channels = 6,因此需要借助reshape操作将通道数改成3(不太严谨的操作)
    # torch.Size([64, 6, 30, 30]) -> [xxx, 3, 30, 30]
    output = torch.reshape(output, (-1, 3, 30, 30)) # -1表示根据后面的参数自动设置batch_size
    # 注意是images
    writer.add_images("Conv2d_output", output, step)
    step = step + 1

writer.close()

输入和输出的尺寸计算

标签:nn,卷积,self,torch,import,Conv2d
From: https://www.cnblogs.com/yq-ydky/p/17632339.html

相关文章

  • 卷积神经网络
    如果一张28*28*1的图像作为输入,那么传统的神经网络输入的是向量,而卷积神经网络输入的是三维矩阵卷积层作用是特征提取,池化层的作用是压缩特征,注意卷积层的卷积策略是不对图像的最外层的像素进行处理颜色通道的处理策略3个颜色通道,每个颜色通道分别做计算,再把每个通道卷积结......
  • 基于卷积神经网络的MAE自监督方法
    本文分享自华为云社区《基于卷积神经网络的MAE自监督方法》,作者:Hint。图像自监督预训练算法是近年来的重要研究方向,MAE是其中基于ViT实现的代表性方法,学习到了鲁棒的视觉特征。MAE全称是MaskedAutoencoders,是由何凯明提出的自监督预训练方法,借鉴了BERT的预训练任务,将输入图片......
  • 基于卷积神经网络的MAE自监督方法
    本文分享自华为云社区《基于卷积神经网络的MAE自监督方法》,作者:Hint。图像自监督预训练算法是近年来的重要研究方向,MAE是其中基于ViT实现的代表性方法,学习到了鲁棒的视觉特征。MAE全称是MaskedAutoencoders,是由何凯明提出的自监督预训练方法,借鉴了BERT的预训练任务,将输入图片的......
  • 卷积神经网络
    卷积神经网络CNN——常用于图像识别(1)卷积层·卷积——通过对图像进行卷积运算,可以对图像的某个特征进行选择性的增强或减弱·图像的局部性——各个像素点与其附近的像素点之间具有强关联——卷积层利用此对图像的特征进行检测·图像的张数——RGB就是三个,即通道数,单色图......
  • 6.6 实现卷积神经网络LeNet训练并预测手写体数字
    模型架构代码实现importtorchfromtorchimportnnfromd2limporttorchasd2lnet=nn.Sequential(nn.Conv2d(1,6,kernel_size=5,padding=2),nn.Sigmoid(),#padding=2补偿5x5卷积核导致的特征减少。nn.AvgPool2d(kernel_size=2,stride=2),nn.Conv2d(6,16,kern......
  • FCN-全卷积网络-pytorch搭建
    代码摘自:https://github.com/sovit-123/Semantic-Segmentation-using-Fully-Convlutional-Networks预备知识:下载预训练权重,抽取出网络层实例:运行如下代码,自动下载到C:\Users\**\.cache\torch\hub\checkpoints目录下。vgg=models.vgg16(pretrained=True)抽取网络层,vgg.fe......
  • AlexNet深度卷积神经网络——pytorch版
    importtorchfromtorchimportnnfromd2limporttorchasd2lnet=nn.Sequential(#(224-11+1+2)/4=54nn.Conv2d(1,96,kernel_size=11,stride=4,padding=1),nn.ReLU(),#(54-3+1)/2=26nn.MaxPool2d(kernel_size=3,stride=2),#(26+4-5+1)=26......
  • LeNet卷积神经网络——pytorch版
    importtorchfromtorchimportnnfromd2limporttorchasd2lclassReshape(torch.nn.Module):defforward(self,x):#批量大小默认,输出通道为1returnx.view(-1,1,28,28)net=torch.nn.Sequential(#28+4-5+1=28输出通道为6Reshape()......
  • 实现二维卷积层
    importtorchfromtorchimportnnfromd2limporttorchasd2ldefcorr2d(x,k):"""计算二维互相关运算"""#获取卷积核的高和宽h,w=k.shape#输出的高和宽y=torch.zeros((x.shape[0]-h+1,x.shape[1]-w+1))foriinrange(y.shape[0......
  • (通俗易懂)可视化详解多通道 & 多通道输入输出卷积代码实现
    以前对多通道和多通道输入输出的卷积操作不理解,今天自己在草稿纸上画图推理了一遍,终于弄懂了。希望能帮助到大家。多通道可视化一通道的2x2矩阵torch.Size([2,2])相当于torch.Size([1,2,2]),是一通道的2x2矩阵二通道的2x2矩阵torch.Size([2,2,2])代表二通道的2x2矩阵,第一个2表......