前言
1.卷积后的大小:
W:矩阵宽,H:矩阵高,F:卷积核宽和高,P:padding(需要填充的0的个数),N:卷积核的个数,S:步长
width:卷积后输出矩阵的宽,height:卷积后输出矩阵的高
width = (W - F + 2P)/ S + 1(向下取整)
height = (H - F + 2P) / S + 1(向下取整)
当conv2d(), max_pool() 中的 padding=SAME时,width=W,height=H,则保证输入输出尺寸图片大小相等,当padding=‘valid’时,P=0,相当于不填充~~
输出图像大小:(width,height,N)其中N代表的卷积核的个数就是在卷积操作中起到的分为N个通道数的作用
当卷积操作中含有膨胀因子d:
当卷积操作中含有膨胀因子d,且padding=pad,k为卷积核尺寸,stride为步长时:
out = (W - (F* d-1)+2* pad)/ S + 1(W、H相同)
2.池化后的大小:
width = (W - F)/ S + 1(向下取整)
height = (H - F) / S + 1(向下取整)
代码如下(示例):
import torch
import torch.nn as nn
import torch.nn.functional as F
from torchsummary import summary
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
self.conv2_drop = nn.Dropout2d()
self.fc1 = nn.Linear(320, 50)
self.fc2 = nn.Linear(50, 10)
def forward(self, x):
x = F.relu(F.max_pool2d(self.conv1(x), 2))
x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
x = x.view(-1, 320)
x = F.relu(self.fc1(x))
x = F.dropout(x, training=self.training)
x = self.fc2(x)
return F.log_softmax(x, dim=1)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # PyTorch v0.4.0
model = Net().to(device)
summary(model, (1, 28, 28))
# summary(model, (1, 56, 56))
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [-1, 10, 24, 24] =28-5+1 260 = (5x5+1)x10
Conv2d-2 [-1, 20, 8, 8] 5,020
Dropout2d-3 [-1, 20, 8, 8] 0
Linear-4 [-1, 50] 16,050
Linear-5 [-1, 10] 510
Net-6 [-1, 10] 0
================================================================
Total params: 21,840
Trainable params: 21,840
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.06
Params size (MB): 0.00
Estimated Total Size (MB): 0.00
----------------------------------------------------------------
⭐在深度学习中,可能对特征图的计算,tensorflow和pytorch的padding计算不同。
- 在tensorflow中:如果你想要输出等于输入,padding="SAME"即可,如果你想要输出别的尺寸的特征图,使用padding=‘VALID’,conv2d会自动计算输出特征图大小。
- 在pytorch中:pytorch里面没有same和valid,所以你想要保持输出等于输入,要利用pad=t,t为填充尺寸,以保持输入输出特征图相等。
3.上采样UpSampling2D
上采样相当于放大多少倍,size=倍数,
卷积操作:
stride=[1,1,1,1]时:
padding=‘SAME’,卷积操作后图片大小不变
padding=‘VALID’,output_height=output_width = (W – F + 1) / S (结果向上取整)
stride≠[1,1,1,1]时:
padding=‘SAME’,output_height = output_width = W / S (结果向上取整)
padding=‘VALID’,output_height=output_width = (W – F + 1) / S (结果向上取整)
池化操作:
池化层通常以卷积层为输入,故此处的W和H分别为卷积层输出的featuremap的宽或者高,F为池化时的ksize的大小,S仍为步长
stride≠[1,1,1,1]时:
padding='SAME’时,output_height = output_width = W / S或者H / S (结果向上取整)
padding='VALID’时,output_height=output_width = (W – F + 1) / S (结果向上取整)
stride=[1,1,1,1]时:
padding='SAME’时,池化后featuremap大小不变,output_width =
W,output_height = H
padding=‘VALID’,output_height=output_width = (W – F + 1) / S (结果向上取整)
卷积输出尺寸进一步说明:
参数含义:
n:特征图的宽或者高
k:卷积核的尺寸
p:padding的数值,一般指单侧填充几个单元
stride:步长
转置卷积输出尺寸:
转置卷积俗称反卷积,但正规叫法是转置卷积。是上采样方式中的一种。
转置卷积用来增大特征图的分辨率的。
上采样方式:
1.插值法
2.反池化
3.反卷积
通常的上采样方式:卷积池化