卷积神经网络--CNN

Conv1D(一维卷积层)

  • 应用场景:主要用于处理序列数据,如时间序列分析、自然语言处理(NLP)中的文本数据等。
  • 输入尺寸:(N, C, L)
    • N:批次大小,即一次处理多少个样本。
    • C:通道大小,对于文本数据,通常是词嵌入的维度;对于时间序列,可以是不同的特征数量。
    • L:序列长度,即每个样本中的元素数量。

Conv2D(二维卷积层)

  • 应用场景:广泛用于图像数据的处理,如图像分类、物体检测和图像分割等任务。
  • 输入尺寸:(N, C, H, W)
    • N:批次大小。
    • C:通道大小,对于彩色图像,一般为3(RGB);对于灰度图像,则为1。
    • H:特征图的高度。
    • W:特征图的宽度。

Conv3D(三维卷积层)

  • 应用场景:主要用于处理视频数据或体积数据,如视频识别、医学图像分析(如CT扫描)。
  • 输入尺寸:(N, C, D, H, W)
    • N:批次大小。
    • C:通道大小。
    • D:特征图的深度,对于视频数据,可以理解为帧数。
    • H:特征图的高度。
    • W:特征图的宽度。

Arguments 共同参数

  • in_channels:输入数据的通道数。
  • out_channels:卷积产生的通道数,决定了卷积层输出的维度。
  • kernel_size:卷积核的大小,控制卷积窗口的维度。对于Conv1D,通常是一个整数;对于Conv2D和Conv3D,可以是一个整数或一个元组,分别代表不同维度的大小。
  • stride:卷积的步长,控制卷积核移动的间隔。较大的stride值会导致输出尺寸减小。
  • padding:输入两边的零填充数量,用于控制输出的空间维度。较大的padding值可以使输出尺寸增大。
  • dilation:卷积核中元素之间的间距,用于控制卷积核的“膨胀”效果。
  • groups:控制输入和输出之间的连接模式。当groups=1时,每个输入通道与每个输出通道相连。当groups等于输入通道数时,实现了所谓的“深度卷积”,每个输入通道仅与一个输出通道相连。

这些参数共同决定了卷积层的行为和输出特征的形状。通过调整这些参数,可以设计出适应特定应用需求的卷积神经网络。

import torch
from torch import nn

# 定义一个Net类,这是构建神经网络的基础框架
class Net(nn.Module): # 你的模型应该继承自nn.Module类。
    def __init__(self, in_c=3):
        super().__init__()
        # 定义第一个卷积层,它接受in_c个通道的输入,输出32个通道,使用3x3的卷积核,步长为1,边缘填充为1
        # 边缘填充为1是为了使输出图像的高度和宽度与输入图像相同,前提是步长为1
        self.conv1 = nn.Conv2d(in_channels=in_c, out_channels=32, kernel_size=3, stride=1, padding=1)
        
        # 定义ReLU激活函数,用于增加模型的非线性,有助于学习复杂的特征
        self.relu1 = nn.ReLU()
        # 定义最大池化层,使用2x2的池化窗口和2的步长,用于降低特征维度并保留最重要的信息
        self.maxpool2d = nn.MaxPool2d(kernel_size=(2, 2), stride=2)
        
    def forward(self, x):
        # 输入x通过卷积层,输出通道变为32,尺寸保持不变(因为padding=1)
        x = self.conv1(x) # [1, 3, 224, 224] -> [1, 32, 224, 224]
        
        # 通过ReLU激活函数,激活函数本身不改变数据的尺寸
        x = self.relu1(x) # [1, 32, 224, 224]
        
        # 通过最大池化层,输出的高度和宽度减半,变为112x112
        x = self.maxpool2d(x)  # [1, 32, 224, 224] -> [1, 32, 112, 112]
        
        return x
        # 最终,这个模型将输出一个具有32个通道,每个通道大小为112x112的特征图
        # 这个输出可以用作后续层的输入,或者在分类、检测任务中进一步处理

if __name__ == '__main__':
    # 实例化Net类,输入通道数为3(假设处理RGB图像)
    net = Net(in_c=3)
    # 创建一个随机输入张量,模拟一个批次中有1个样本,每个样本有3个通道,尺寸为224x224的图像
    input_data = torch.randn((1, 3, 224, 224))
    
    # 将输入数据传递给网络,执行前向传播,获取网络输出
    output = net(input_data)
    # 打印输出数据的形状,预期为[1, 32, 112, 112],表明批次大小为1,输出通道为32,图像尺寸为112x112
    print(output.shape)

激活函数

激活函数在神经网络中扮演着非常重要的角色。你可以把激活函数想象成一个决策门,它决定了一个神经元是否应该被激活,即输出信号给下一个层次的神经元。激活函数的引入使得神经网络能够学习和执行更复杂的任务,如非线性问题的求解。

  • 举例:ReLU(Rectified Linear Unit,线性整流函数)是最常用的激活函数之一。它的工作原理很简单:如果输入是正数,它就直接输出这个数;如果输入是负数,它就输出0。这种简单的方法有助于解决一些训练过程中的问题,并帮助模型更快地学习。

传播函数

  • 前向传播:当我们提到传播函数时,通常指的是前向传播和反向传播。前向传播是数据通过神经网络的过程。在这个过程中,从输入层开始,经过隐藏层,最终到达输出层。每一层的输出都是下一层的输入,加上激活函数的作用,这样一直传播到最后。

  • 反向传播:一旦我们得到了输出层的结果,我们会计算它和真实结果之间的误差。反向传播就是这个误差如何被用来调整网络中各个权重的过程。从输出层开始,误差会被一层层传回输入层,途中逐步调整权重,以期减少误差。

  • 例子:想象你在训练一个网络来识别猫和狗的图片。前向传播就像是给网络看一张图片,并让它猜这是猫还是狗。反向传播则是基于它猜错了(比如,它把猫猜成了狗),告诉它应该如何调整内部的设置(权重),以便下次能猜得更准。

池化

池化是一种减少数据维度的方法,同时保留最重要的信息。池化操作通常跟在卷积层后面,在处理图像时特别有用。

  • 举例:最常见的池化操作是最大池化。在最大池化中,你可以把它想象成用一个小网格覆盖图像,然后在每个网格中只保留最亮的那个点(假设亮度代表信息的重要性)。这样做的结果是,图像的大小减小了,但最亮的点保留了下来,即保留了图像中最重要的特征。

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值