了解DCGAN需要学习一下转置卷积
转置卷积和之前学的卷积的区别是转置卷积是上采样,普通的卷积是下采样
上采样和下采样:
下采样:池化操作就是经典的下采样,将一张图片缩小,采用不同的方法将像素点合并从而获得更小分辨率的照片就叫做下采样。
上采样:也叫做图像插值上采样就和下采样反过来,将一张照片放大,在像素点之间根据放大倍数,以插值的形式插入像素值从而达到放大图像的目的。
关于卷积可以查看#深度学习到卷积-CSDN博客
1.卷积的操作
下面是卷积的过程:
将输入的4*4大小的矩阵经过一个卷积核计算之后得到一个2*2的矩阵
下图左边是卷积的操作 右边是转置卷积的操作 左边是降维操作 右边是升维操作
卷积中卷积核的操作:
排列成一个卷积矩阵 用0作为补充
把输入的图像转化成一维的向量:
卷积核转换的卷积矩阵与图像转成一维的向量进行矩阵相乘得到一个2*2的矩阵
2.转置矩阵的操作
转置矩阵是把卷积核排列的卷积矩阵转置一下 再与输入的图片转换成的一维向量进行矩阵相乘
将相乘后的结果拉成二维的 如图所示 就是一个4*4的矩阵 是由原来输入的2*2大小的图像得到的 是一个升维的操作
3.相关计算
卷积:
i:输入图像的尺寸
k:卷积核的尺寸
p:边界填充
s:步长
转置卷积(在卷积公式的基础上进行换算,转置卷积和卷积正好是一个相反的操作):
4.相关代码
1.卷积
import torch
import torch.nn as nn
input = torch.tensor([[4.0,5.0,8.0,7.0],[1.0,8.0,8.0,8.0],[3.0,6.0,6.0,4.0],[6.0,8.0,7.0,8.0]])
print("输入值的大小:",input.shape)input = input.view(-1,1,4,4)downsample = nn.Conv2d(1,1,3,stride = 1,padding = 0)o = downsample(input)print("输出值:",o)
print("输出值的大小:",o.shape)
print()
input = torch.tensor([[4.0,5.0,8.0,7.0],[1.0,8.0,8.0,8.0],[3.0,6.0,6.0,4.0],[6.0,8.0,7.0,8.0]])
- 这行代码创建了一个形状为
[4, 4]
的二维张量,代表一个4x4的矩阵。
- 这行代码创建了一个形状为
print("输入值的大小:",input.shape)
- 打印输入张量的形状,输出为
torch.Size([4, 4])
。
- 打印输入张量的形状,输出为
input = input.view(-1,1,4,4)
- 将输入张量重新调整为形状
[1, 1, 4, 4]
,以匹配卷积层期望的输入形状(批次大小,通道数,高度,宽度)。-1
在这里让PyTorch自动计算批次大小(因为只有一个样本,所以为1)。(批次大小决定了在每次梯度更新时,有多少数据样本被用来计算梯度)
- 将输入张量重新调整为形状
downsample = nn.Conv2d(1,1,3,stride = 1,padding = 0)
- 创建一个卷积层,输入通道数为1,输出通道数也为1,卷积核大小为3x3,步长为1,填充为0。
o = downsample(input)
- 将调整后的输入张量传递给卷积层,得到输出张量
o
。
- 将调整后的输入张量传递给卷积层,得到输出张量
print("输出值:",o)
- 打印输出张量的值。由于卷积核、步长和填充的设置,输出张量的形状和输入相同(但值会根据卷积运算改变)。
print("输出值的大小:",o.shape)
- 打印输出张量的形状,输出为
torch.Size([1, 1, 4, 4])
。
- 打印输出张量的形状,输出为
结果图:
2.转置卷积
import torch
import torch.nn as nn
input = torch.tensor([[2.0,1.0],[4.0,4.0]])
input = input.view(-1,1,2,2)
print("输入值的大小:",input.shape)upsample = nn.ConvTranspose2d(1,1,3,stride=1,padding=0)
o = upsample(input)print("输出值:",o)
print("输出值的大小:",o.shape)
input = torch.tensor([[2.0,1.0],[4.0,4.0]])
- 这行代码创建了一个2x2的张量(Tensor),它是PyTorch中用于存储数据的基本数据结构。张量类似于NumPy的ndarray,但可以在GPU上运行以加速计算。这个张量包含四个元素:[2.0, 1.0, 4.0, 4.0]。
input = input.view(-1,1,2,2)
- 这行代码改变了
input
张量的形状。view
方法用于返回具有相同数据但不同形状的新张量。这里的-1
让PyTorch自动计算该维度的大小,以确保总元素数量不变。1,2,2
指定了新的形状,即1个样本,1个通道,2x2的空间维度。因此,这个操作将原始的2x2张量重塑为一个四维张量,用于后续的卷积转置操作。
- 这行代码改变了
print("输入值的大小:",input.shape)
- 打印出
input
张量的形状,预期输出是输入值的大小: torch.Size([1, 1, 2, 2])
,表示这是一个四维张量,其中包含一个样本,一个通道,以及2x2的空间维度。
- 打印出
upsample = nn.ConvTranspose2d(1,1,3,stride=1,padding=0)
- 这行代码创建了一个二维卷积转置(也称为转置卷积或反卷积)层。参数
1,1,3
分别指定输入通道数、输出通道数和卷积核大小。stride=1
表示卷积核移动的步长为1,padding=0
表示在输入张量周围不添加额外的零填充。卷积转置层通常用于上采样或学习输入数据的稀疏表示。
- 这行代码创建了一个二维卷积转置(也称为转置卷积或反卷积)层。参数
o = upsample(input)
- 使用前面定义的卷积转置层对
input
张量进行上采样操作。由于卷积核大小为3且步长为1,同时没有填充,输出张量的空间维度会比输入张量的大(具体大小取决于卷积核大小和步长,以及输入张量的边界处理方式)。
- 使用前面定义的卷积转置层对
print("输出值:",o)
- 打印出卷积转置操作后的输出张量
o
的值。由于这是一个上采样操作,输出张量将包含根据输入张量和卷积转置层参数计算得到的值。
- 打印出卷积转置操作后的输出张量
print("输出值的大小:",o.shape)
- 打印出输出张量
o
的形状。由于使用了3x3的卷积核和步长为1的卷积转置操作,且没有填充,输出张量的空间维度会比输入张量的2x2大
- 打印出输出张量
结果图: