机器视觉笔记5——前向传播函数

引言

        在基于PyTorch建立卷积残差结构的时候,发现在神经网络结构中除了继承nn.module类,通过__init__()函数实现卷积、批量归一化、ReLU激活函数外,还有一个很重要的部分——前向传播函数forward()。

        你会发现这个forward()函数在神经网络构建中是必须要写的,它是实现模型功能、实现各层之间连接关系的核心,为什么forward()函数有这样作用?

概述

        前向传播(Forward Propagation)官方来说,是神经网络中的一种计算过程,用于将输入数据经过各层网络的权重和激活函数进行计算,最终得到网络的输出结果。在训练过程中,前向传播是从输入数据开始,通过网络的各层逐步计算到输出结果的过程。

        如图所示,输入层:

  • a1​[0]:表示输入层(第一层)中的第一个神经元(索引为0);

  • a2​[0]:表示神经网络的第二层(第二隐藏层)中的第一个神经元(索引为0);

  • 类似地,a2​[1] 表示第二层中的第二个神经元,依此类推

        隐藏层:

  • a1​[1]:表示隐藏层(第二层)中的第一个神经元(索引为1),在典型的神经网络中,隐藏层是指除输入层和输出层之外的所有层;

  • a2​[1]:表示隐藏层(第二层)中的第二个神经元(索引为1),a2​[2] 表示第二层中的第三个神经元,以此类推。

        输出层:

  • a1​[2] 表示输出层(第三层)中的第一个也是唯一的神经元(索引为2)。

        两个神经元之间的权重为w,于是可得:

a1[1] = f(w11[1]*a1[0] + w12[1]*a2[0] + w13[1]*a3[0] + B1)

        权重 wij​[k] 表示连接第i 层的第 j 个神经元与第 (i+1)层的k个神经元之间的连接权重,

Bk为每个神经元的偏置。于是,输出层数值:

         上述A1=f(w1*A0+B1)数据转换表达式,f()为非线性变换的激活函数,一般采用sigmoid、ReLU、tanh 等,通常基于经验和实验结果得到。也就是,神经网络前向传播函数foward()是通过激活函数处理权重乘以输入神经元加上偏置B1的结果共同作用得到的。

 卷积残差的前向传播              

        为了解决深度神经网络中梯度消失问题,并提高网络训练效果,引入残差块。残差函数的前向传播函数作用是对输入进行处理,使其通过残差块并返回输出。

        在super(BasicBlock, self).__init__()中调用了父类 nn.Module 的初始化函数,确保正确地初始化 BasicBlock 类,初始化函数中定义了卷积层、批量归一化和激活函数。

       

class BasicBlock()
    def __init__(self,inplanes,planes):
        super(BasicBlock,self).__init__
        self.conv1  =   nn.Conv2d(inplanes,planes[0],kernel_size=1,stride=1,padding=0,bias=False)
        self.bn1    =   nn.BatchNorm2d(plane[0])
        self.relu1  =   nn.LeakyReLU(0.1)
        
        self.conv2  =   nn.Conv2d(planes[0], planes[1], kernel_size=3, stride=1, padding=1, bias=False)
        self.bn2    =   nn.BatchNorm2d(planes[1])
        self.relu2  =   nn.LeakyReLU(0.1)
        
    def forward(self,x)
        residual    =   x
        
        out =   self.conv1
        out =   self.bn1(out)
        out =   self.relu1(out)
        
        out =   self.conv2(out)
        out =   self.bn2(out)
        out =   self.relu2(out)
            
        out +=  residual
        return out

        上述代码定义了一个残差块(Residual Block),用于构建深度神经网络的基本模块。BasicBlock 的类继承自PyTorch模型组件nn.Module类,初始化接受两个参数:inplanes 表示输入特征图的通道数,planes 是一个包含两个元素的列表,表示残差块中两个卷积层的输出通道数。

        比如:有一个输入特征图,其通道数为 64。我们想要构建一个残差块,其中第一个卷积层的输出通道数为 128,第二个卷积层的输出通道数为 256。将 inplanes 设置为 64,表示输入特征图的通道数为 64。然后,将 planes 设置为一个包含两个元素的列表 [128, 256],表示两个卷积层的输出通道数分别为 128 和 256。初始化这个 BasicBlock:

block = BasicBlock(inplanes=64, planes=[128, 256])

        这样就创建了一个残差块,其中第一个卷积层的输出通道数为 128,第二个卷积层的输出通道数为 256。

        在上述代码中,forward 函数是 BasicBlock 类的一个方法,用于定义残差块的前向传播过程。这个函数接收一个输入张量 x,代表了残差块的输入特征。在 forward 函数中,先将输入特征保存为 residual,这是为了后续进行残差连接时使用。然后,通过第一个卷积层、批量归一化层和 LeakyReLU 激活函数对输入特征进行处理,得到中间特征 out1。接着,通过第二个卷积层、批量归一化层和 LeakyReLU 激活函数再次对 out1 进行处理,得到最终输出特征 out2。最后,将输入特征 x 和最终输出特征 out2 进行残差连接,即将它们相加,得到残差块的最终输出。

        卷积残差中的整个 forward 函数的作用就是对输入特征进行一系列的卷积、批量归一化和非线性变换操作,然后通过残差连接得到最终的输出特征。

  forward()方法是执行前向传播的函数,而__init__()方法用于初始化网络结构。__init__() 方法定义了网络的结构和参数初始化,而forward() 方法执行了实际的前向传播计算。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值