卷积神经网络

卷积神经网络是一种深度前馈神经网络。

  • 物体定位:预测包含主要物体的图像区域,以便识别区域中的物体。
  • 物体识别:针对分割号的目标进行分类。
  • 目标检测:将图像目标分割出来,针对图像上的像素进行归属。
  • 关键点检测:从图像中检测目标物体上某个关键点的位置。

全连接层

包含W和激活函数。

 全连接层的内容

全连接示意图 

补充说明:

  • 当完成激活(activation)后的结果为一维向量时,结果称为特征向量(激活向量)。
  • 激活后的结果为二维向量时,称为特征层(feature map。有时也称为激活层 activation map)。

卷积层:一种局部操作,通过一定大小的卷积核作用于局部图像区域,从而看到图像的局部信息

保留输入图像的空间特征,对一张图片32*32*3而言,卷积层的输入就是32*32*3的矩阵。

  • 卷积核kernel:简称卷积、滤波器filter。卷积核的大小可以在实际需要时自定义其长和宽 (1*1、3*3、5*5),其通道个数一般设置为与输入图片通道数量一致。
  • 步长(stride):指卷积在输入图片上移动时需要移动的像素数。步长=1,移动一个像素。

卷积每次滑动覆盖的格子范围在图像处理中被称为“感受野”。

 

  •  步长=1,输出的特征层大小为5*5;
  • 步长=2,输出特征层大小为3*3;

通用的卷积形式

        输入图像为W_{1} * H_{1} * D_{1}(宽、高、channel)。kernel大小为F*F,步长为S,pad大小为P,kernel个数为K。

W_{2}=\frac{W_{1}-F+2P}{S}+1

H_{2}=\frac{H_{1}-F+2P}{S}+1

D_{2}=K

eg: 输入为32*32*3,kernel个数为10,大小为5*5,步长为1,pad=2;

根据公式W_{2}=\frac{32-5+2*2}{1}+1=32

H_{2}=\frac{32-5+2*2}{1}+1=32

D_{2}=10

则输出的特征层大小为32*32*10,每个kernel对应的参数个数5*5*3+1=76(+1表示bias),因此卷积的参数个数为76*10=760。

代码:

classtorch.nn.Conv2d(in_channel,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True):
in_channels(int) #输入图片的channel
out_channels(int) #输出(特征层)图片的channel
kernel_size( int or tuple) #kernal的大小
stride( int or tuple,optional) #卷积的步长,默认为1
padding  (int or tuple,optional) #四周pad的大小,默认为0
dilation(int or tuple,optional) #kernel元素间的距离,默认为1
groups(int,optional)#将原始输入channel划分成组数,默认为1
bias (bool,optinal) #如果是True,则输出的bias可学,默认为True

池化层

池化(pooling)对图像进行压缩的一种方法,max pooling、average pooling等。

假设图像输入W_{1} * H_{1} * D_{1},池化参数重,池化kernel的大小为F*F。步长为S,经过池化后:

W_{2}=\frac{W_{1}-F}{S}+1

 H_{2}=\frac{H_{1}-F}{S}+1

D_{2}=D_{1}

F=2,S=2,一个4*4的特征层经过池化filter=2*2,stride=2的最大赤化操作后可以得到一个2*2的特征层。

 池化层对原始特征层的信息进行压缩,是卷积神经网络中很重要的一步。绝大多数情况下,卷积层、池化层、激活层为一个整体出现。

import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
    def __int__(self):# 定义卷积神经网络需要的元素
        super(Net,self).__init__()
        self.conv1 =nn.Conv2d(3,6,5) #定义第一个卷积层
        self.pool = nn.MaxPool2d(2,2)#池化层
        self.conv2= nn.Conv2d(6,16,5) #定义第二个卷积层
        self.fc1 = nn.Linear(16*5*5,120) #全连接层
        self.fc2 = nn.Linear(120,84)  #全连接层
        self.fc3 = nn.Linear(84,10) #最后一个链接层用作10分类
    def forward(self,x): #使用__init__()中的定义,构建卷积神经网络结构
        x = self.pool(F.relu(self.conv1(x))) # 第一个卷积层首先经过ReLU做激活,然后使用前面定义的nn.MaxPool2d(2,2)方法做池化
        x = self.pool(F.relu(self.conv2(x))) #第二个卷积层也要经过ReLU做激活,然后使用前面定义的nn.MaxPool2d(2,2)方法做池化
        x = x.view(-1,16*5*5) #对特征层是Tensor维度进行变换
        x = F.view(self.fc1(x)) #卷积神经网络的特征层经过第一次全连接层操作,然后在通过ReLU层激活
        x = F.relu(self.fc2(x)) #卷积神经网络的特征层经过第二次全连接层操作,然后在通过ReLU层激活
        x = self.fc3(x) #卷积神经网络的特征层经过最后一次全连接层操作,得到最终要分类的结构(10分类标签)
        return x
net=Net()

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值