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的输入在计算······
池化层
实际上就是一种形式的下采样
维度变小例如图中由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)