卷积神经网络CNN

1.全连接层

  1.多层感知机

多层感知机(Multilayer Perceptron,MLP)是由输入层、隐含层(一层或多层)及输出层构成的神经网络模型,可以解决单层感知器不能解决的线性不可分问题。下面是含有2个隐含层的多层感知器网络拓扑结构图。可以发现,输入层神经元接收输入信号,隐含层和输出层的每一个神经元与之相邻层的所有神经元连接,即全连接。

2.全连接表现形式 

  把图中012 345 678 3*3的输入拉成一列与隐含层a0,a1,a2,a3全连接,与a0连接的权重是w00w10w20 w30w40w50 w60w70w80 3*3的权重;与a1,a2,a3连接的权重也同样。

2.局部连接——卷积神经网络(主要为了解决全连接层缺点:权重参数多,即为了减少权重)

主要为了解决全连接层缺点:权重参数多,即为了减少权重

由全连接的36个权重变成16个

由局部连接16个变成4个 每一个a乘的权重都是下相同的4个只有一种权重下采样也是一个特点(输出维度减小) 带卷积核的就是卷积神经网络,优点就是减少全连接的权重参数

3.单通道卷积核及步长stride

步长为1

步长stride=1,求特征图:先选择粉色部分与卷积核相乘并相加算出映射层的值,再按照步长为1依次往右移动与卷积核进行计算;特征映射层第一层算完之后在向下移动一个算第二层;

计算特征映射层尺寸(特征图)也可以用图中红色公式;即(输入的长减输出的长除以步长再加1)*(输入的宽减输出的宽除以步长再加1)

步长为2 

如果步长为2,那就按照步长为2一次往右移动两格算出特征映射层第一层的值,在往下移动两格算出第二层

 代码展示

print("pytorch的单通道conv2D(通俗意义上的卷积)示例")
import torch
import torch.nn.functional as F
#输入
input = torch.tensor([[1,1,1,0,0],
                      [0,1,1,1,0],
                      [0,0,1,1,1],
                      [0,0,1,1,0],
                      [0,1,1,0,0]])
#卷积核
kernel = torch.tensor([[1,0,1],
                       [0,1,0],
                       [1,0,1]])
print(input.shape)
print(kernel.shape)
#对于卷积操作,输入数据一般为四维张量,需要按照batchsize * 通道数 * 高度 * 宽度的维度进行排列。
#所以这里要进行重新定义尺寸
#重新定义尺寸,把尺寸改成四个数,1个batchsize 1个通道, 长和宽之前一样
#batchsize表示单词传递给程序用于训练的个数
input = torch.reshape(input,(1,1,5,5))     #1个输入;1个矩阵
kernel = torch.reshape(kernel,(1,1,3,3))   #1个卷积核;1个矩阵
print(input.shape)
print(kernel.shape)
#stride = 1 时候的输出
#调用pytorch里面的functional函数里面的conv2d(二维卷积)
output1 = F.conv2d(input,kernel,stride=1)
print(output1)
#stride = 2 时候的输出
output2 = F.conv2d(input,kernel,stride=2)
print(output2)

 4.卷积神经网络填充padding操作

步长为3

如果步长为3按照上图,那么不论是往右移动三步还是往下移动三步都不能工作。所以要进行填充(padding)。这时上下左右都填充了两行,就能进行工作计算feature map了。当然如果够移动进行计算的也可以加padding。padding默认值是padding = ‘VALID’。

 计算特征映射层大小:((输入的长减输出的长加上padding*2)除以步长 再加1)*((输入的宽减输出的宽加上padding*2)除以步长 再加1)  注:输入的长宽都是填充之后的。

代码展示

padding = "same"代表自动填充让特征映射层的长和宽和输入层的一模一样。

和上面代码相接(上面代码的续写)


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

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

output5 = F.conv2d(input,kernel,stride=1,padding="same")
print(output5)

 

5.多通道多卷积核 

一个卷积核可以提取图像的一种特征映射层;多个卷积核可以提取多种特征映射层

一个输入三个卷积核

三个卷积核分别与输入相乘得到三个特征映射层

 三个输入三个卷积核

三个输入三个卷积核得到一个特征映射层;图中第一个feature maps写错了应该是input image

总结

即有几个input image(输入)通道,kernel就有几个通道;想要几个feature map(特征映射层)就要有几个卷积核(kernel)如下图

实例  

三通道的一个输入图像,两个卷积核每个卷积核有三个通道,一共两个卷积核;得到结果必然是有几个卷积核有几个特征映射层;结果为有两个特征映射层。

第一个输入是3通道的32*32,卷积核是6个3通道的5*5;那么特征映射层就是6个28*28的,此时特征映射层做为一个6通道的28*28的输入在计算······

池化层

 实际上就是一种形式的下采样

详情见下面链接池化层详细介绍-CSDN博客文章浏览阅读8.6w次,点赞121次,收藏654次。常见的池化层它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效地原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。..._池化层https://blog.csdn.net/Chen_Swan/article/details/105486854?spm=1001.2014.3001.5506

 维度变小例如图中由224*224变成112*112;但是通道数不变。

常见几种 

最大池化

选取图像区域的最大值作为该区域池化后的值

图中就是左上左下右上右下分别取最大值作为池化后的值

 平均池化

计算图像区域的平均值作为该区域池化后的值

图中就是左上左下右上右下分别取平均值作为池化后的值

代码展示 

import torch

#输入
input = torch.tensor([[1,3,2,4],
                      [1,3,2,4],
                      [5,7,6,8],
                      [5,7,6,8]],dtype=torch.float32)
mp = torch.nn.MaxPool2d(kernel_size=2)  #最大池化,卷积核2*2
ap = torch.nn.AvgPool2d(kernel_size=2)  #平均池化,卷积核2*2
#对于卷积操作,输入数据一般为四维张量,需要按照batchsize * 通道数 * 高度 * 宽度的维度进行排列。
#所以这里要进行重新定义尺寸
#重新定义尺寸,把尺寸改成四个数,1个batchsize 1个通道, 长和宽之前一样
#batchsize表示单词传递给程序用于训练的个数
input = torch.reshape(input,(1,1,4,4))

#执行最大池化
output1 = mp(input)
print(output1)
#执行平均池化
output2 = ap(input)
print(output2)

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值