深度学习入门-09

基于小土堆学习

1、卷积层

卷积操作涉及到一个称为“卷积核”或“滤波器”的小窗口,在输入数据上滑动,并对每个位置上的数据进行加权求和,可能还会加上一个偏置项。这个加权求和的结果就构成了输出特征图(feature map)中的一个元素。卷积核的权重在训练过程中通过反向传播算法学习得到。
卷积层的特点

  • 局部连接:卷积层中的每个神经元只与输入数据的一个局部区域相连,这使得网络能够关注到数据的局部特征。
  • 权重共享:在卷积层中,同一个卷积核的权重在滑动过程中是共享的,这意味着无论卷积核滑动到输入数据的哪个位置,它都使用相同的权重。这大大减少了模型的参数数量。
  • 多卷积核:一个卷积层可以有多个不同的卷积核,每个卷积核都可以提取输入数据的一种特定特征。因此,卷积层的输出通常是一个深度增加的特征图,其中每个深度切片都是由一个不同的卷积核生成的。
  • 步长和填充:卷积操作可以通过步长(stride)和填充(padding)来控制输出特征图的尺寸。步长决定了卷积核滑动的距离,而填充则决定了在输入数据边缘添加多少零值。

在PyTorch中,卷积层是用来处理图像、视频、文本或语音数据中的空间层次结构的重要工具。以下是您提到的各种卷积层的简要概述:

  • nn.Conv1d:应用于一维输入信号(例如时间序列或文本数据)的卷积层。它适用于多个输入平面组成的输入信号。

  • nn.Conv2d:应用于二维输入信号(如图像)的卷积层。它同样适用于多个输入平面组成的输入信号。

  • nn.Conv3d:应用于三维输入信号(如视频或三维医学图像)的卷积层。它适用于多个输入平面组成的输入信号。

  • nn.ConvTranspose1d:应用于一维输入信号的转置卷积层。转置卷积常用于上采样或增加输入数据的维度。

  • nn.ConvTranspose2d:应用于二维输入信号的转置卷积层。同样用于上采样或增加输入数据的维度。

  • nn.ConvTranspose3d:应用于三维输入信号的转置卷积层。也用于上采样或增加输入数据的维度。

  • nn.LazyConv1d, nn.LazyConv2d, nn.LazyConv3d:这些是带有延迟初始化in_channels参数的卷积层版本。这意味着在首次前向传递之前,不需要指定输入通道的数量。

  • nn.LazyConvTranspose1d, nn.LazyConvTranspose2d, nn.LazyConvTranspose3d:这些是带有延迟初始化in_channels参数的转置卷积层版本。

  • nn.Unfold:从批处理的输入张量中提取滑动局部块。这可以用于实现自定义的卷积操作。

  • nn.Fold:将滑动局部块数组组合成一个大的包含张量。这是nn.Unfold操作的逆操作,也常用于自定义卷积操作。

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)

torch.nn.Conv2d 是 PyTorch 中用于应用二维卷积层的一个类。这个类非常适用于处理图像数据,因为它可以在图像的宽度和高度上滑动窗口(或称为“核”),从而提取特征。下面是 torch.nn.Conv2d 类参数的详细解释:

  • in_channels (int): 输入信号的通道数。例如,对于RGB图像,in_channels 就是3。

  • out_channels (int): 卷积产生的通道数。这个参数决定了卷积层输出的深度。
    在这里插入图片描述
    如果out_channels=2,就是2个卷积核,就是又会得出一个数据
    在这里插入图片描述
    在这里插入图片描述

  • kernel_size (int 或 tuple): 卷积核的大小。可以是一个整数,表示卷积核的高度和宽度都是这个值;也可以是一个元组 (height, width),分别指定卷积核的高度和宽度。定义了卷积核的大小,只需要设置尺寸,其中的数字不需要我们设置

  • stride (int 或 tuple, 可选): 卷积时的步长。默认值为1。可以是一个整数,表示在高度和宽度上的步长都是这个值;也可以是一个元组 (stride_height, stride_width),分别指定在高度和宽度上的步长。

  • padding (int 或 tuple, 可选): 输入边缘的填充大小。默认值为0。可以是一个整数,表示在高度和宽度上的填充都是这个值;也可以是一个元组 (padding_height, padding_width),分别指定在高度和宽度上的填充。

  • dilation (int 或 tuple, 可选): 卷积核元素之间的间距。默认值为1。可以是一个整数,表示在高度和宽度上的间距都是这个值;也可以是一个元组 (dilation_height, dilation_width),分别指定在高度和宽度上的间距。

  • groups (int, 可选): 控制输入和输出之间的连接的组数。默认值为1。当使用多个组时,可以实现类似深度可分离卷积的操作,这有助于减少计算量和参数数量。

  • bias (bool, 可选): 是否添加偏置项。默认值为True。

  • padding_mode (string, 可选): 填充的模式,可以是 - ‘zeros’、‘reflect’、‘replicate’ 或 ‘circular’。默认值为 ‘zeros’,表示使用零填充。

  • device (torch.device, 可选): 指定张量所在的设备(CPU或GPU)。

  • dtype (torch.dtype, 可选): 指定张量的数据类型。
    这个类在创建时会初始化卷积核和偏置(如果 bias=True),然后在前向传播时应用卷积操作。输出的形状由输入形状、卷积核大小、步长、填充和间距共同决定。
    不同卷积的特征

定义了一个简单的卷积神经网络模型Test,它包含一个卷积层。然后,它加载CIFAR10数据集,并在测试集上运行模型,打印出模型输出的形状。注意,这里我们只传递图像数据imgs给模型,而不是整个data(它包含图像和标签)。

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

dataset = torchvision.datasets.CIFAR10("./CIFAR", train=False, transform=
torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size=64)


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


test = Test()

for data in dataloader:
    imgs, target = data
    output = test(imgs)
    print(output.shape)

部分输出结果为:

C:\Anaconda3\envs\pytorch_test\python.exe H:\Python\Test\nn_cov2d.py 
Files already downloaded and verified
torch.Size([64, 6, 30, 30])
torch.Size([64, 6, 30, 30])
torch.Size([64, 6, 30, 30])
torch.Size([64, 6, 30, 30])
torch.Size([64, 6, 30, 30])
torch.Size([64, 6, 30, 30])
torch.Size([64, 6, 30, 30])
torch.Size([64, 6, 30, 30])
torch.Size([64, 6, 30, 30])

采用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("./CIFAR", train=False, transform=
torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size=64)

write = SummaryWriter("logs")

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


test = Test()
step = 0

for data in dataloader:
    imgs, target = data
    output = test(imgs)
    print("output.shape",output.shape)
    print("imgs.shape",imgs.shape)
    #imgs.shape torch.Size([64, 3, 32, 32])
    write.add_images("input",imgs,step)
    # output.shape:torch.Size([64, 6, 30, 30])---需要转换为([64, 3, 30, 30])
    #6个channel,导致tensorBoard无法识别解析
    output= torch.reshape(output,(-1,3,30,30))
    #第一个值不知道是多少的时候直接负一,他会自动计算
    write.add_images("output", output, step)
    step = step+1
write.close()

部分运行结果

C:\Anaconda3\envs\pytorch_test\python.exe H:\Python\Test\nn_cov2d.py 
Files already downloaded and verified
output.shape torch.Size([64, 6, 30, 30])
imgs.shape torch.Size([64, 3, 32, 32])
output.shape torch.Size([64, 6, 30, 30])
imgs.shape torch.Size([64, 3, 32, 32])
output.shape torch.Size([64, 6, 30, 30])

图像结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值