【目录】
1d/2d/3d卷积
卷积-nn.Conv2d()
转置卷积-nn.ConvTranspose
0、tensor维度的理解
- shape参数的个数应为维度数,每一个参数的值代表该维度上的长度
shape=(100,784)
代表该张量有两个维度,第一个维度长度为100,第二个维度长度为784,二维数组100行784列
shape=(2,)
代表该张量有一个维度,第一个维度长度为2,一维数组1行2列
- 卷积的权重:即为卷积核的权值;
2d卷积的shape为(batch size,channel,kernel_height,kernel_width),与输入信号的形式一致(batch size,channel,feature_height,feature_width)。
3d卷积的shape为(batch size,channel,kernel_deep,kernel_height,kernel_width),与输入信号的形式一致(batch size,channel,feature_deep,feature_height,feature_width)。
# conv_layer_1 = nn.Conv2d(3, 1, 3, bias=False)#in_channels,out_channels,kernel_size
conv_layer_1 = nn.Conv2d(3, 1, 3, bias=False, padding=1)
conv_layer_1.weight.data = torch.ones(conv_layer_1.weight.shape)
# conv_layer_1.weight.shape(1,3,3,3)为(batchsize,height,width,channel)
- 3d卷积常用到unsqueeze用于扩充维度
img_tensor.unsqueeze_(dim=0) # C*H*W to B*C*H*W
img_tensor.unsqueeze_(dim=2) # B*C*H*W to B*C*D*H*W
- 张量的切片
img_tensor[:, 1, :, :] 对第一维数据取所有,第二维数据只取第二个
img_tensor = torch.ones((1, 3, 5, 5))
# 构建shape为(1,3,5,5)的图像矩阵,3通道,5×5
print(img_tensor)
img_tensor[:, 1, :, :] = img_tensor[:, 1, :, :]*2
# 对第一维数据取所有,第二维数据只取第二个
print(img_tensor)
img_tensor[:, 2, :, :] = img_tensor[:, 2, :, :]*3
# 对第一维数据取所有,第二维数据只取第三个
print(img_tensor)
#outputs_print
tensor([[[[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]],
[[2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2.]],
[[3., 3., 3., 3., 3.],
[3., 3., 3., 3., 3.],
[3., 3., 3., 3., 3.],
[3., 3., 3., 3., 3.],
[3., 3., 3., 3., 3.]]]])
1、1d/2d/3d卷积
卷积核是特征匹配器,应用到图像中对图像的每一个像素进行检测,判断其与卷积核的模式是否相似。
2、nn.Conv2d
空洞卷积:卷积核是间隔开的,主要用于分割任务,主要是用于提升感受野。
最终输出响应值的时候需要加上偏置这一项
-
nn.Conv2d输出图像特征尺寸计算
二维卷积Conv2的parameters属性中有weights和bias两个参数,其中权值是一个四维张量。
【输出图片计算公式】:N = (W − F + 2P )/S+1 W为输入图片大小,F为滤波器大小,P为padding,S为stride
为何四维张量对应二维卷积[卷积核个数,输入通道数,卷积核尺寸w,卷积核尺寸h],实现的是二维卷积?
因为始终是在二维平面上做卷积,只是在三个通道上分别做卷积然后求和;输入的通道数,意味着多个输入信号。二维卷积核在多个通道上同时做卷积。
2、转置卷积
-
正常卷积(提取图像特征)
图像尺寸为4*4 => 图像为16*1(16个像素值×1张图像)
卷积核为3*3 => 卷积核K4*16((输出特征图像素的总个数2×2)*(3×3权值补零(输入图像像素)))
-
转置卷积
输入的图像是比较小的,通过卷积核之后输出一个更大的图像
卷积核K16-4((输出特征图像素的总个数)*(从3×3的卷积核中剔除后得到尺寸为4(输入图像像素)))
正常卷积核转置卷积的卷积核是一个转置的关系,但是转置矩阵内的元素是完全不相同的,只是在shape上是转置的关系,实际上是不可逆的。
stride几乎决定了整个上采样的大小
-
nn.ConvTranspose2d
-
转置卷积尺寸计算
转置卷积的通病——棋盘效应
是由于不均匀的重叠导致的,pytorch 1.7版本之后修复了棋盘效应