Week3:[任务二] 第一节 nn网络层-卷积层

【目录】

  • 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版本之后修复了棋盘效应

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值