import torch from torch import nn 这段代码导入了 PyTorch 的核心库以及神经网络模块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) 这里定义了一个二维的torch.Tensor
对象input
,它包含了一些数值数据。然后通过.shape
属性打印出该输入张量的形状,此时它是一个二维张量,形状应该是(4, 4)
,表示有 4 行 4 列的数据。 input = input.view(-1,1,4,4)
使用.view()
方法对输入张量进行形状调整。view()
方法用于改变张量的维度和大小,但要保证调整前后元素的总数不变。这里将输入张量调整为四维张量,其中:
-1
表示自动根据其他维度的值和元素总数来推断该维度的大小。在这里,由于后面明确指定了其他三个维度为1
、4
、4
,且原始输入张量元素总数为4 * 4 = 16
,所以经过计算-1
对应的维度大小就是16 / (1 * 4 * 4) = 1
。1
表示通道数为 1,将输入数据看作是单通道的数据,就好像是单通道的图像数据(例如灰度图像)。- 后面两个
4
分别表示图像的高度和宽度(这里类比为图像数据的处理方式)。
经过这一步,输入张量就被调整为适合后续卷积操作的四维张量格式。
downsample = nn.Conv2d(1,1,3,strade=1,padding=0)
- 定义卷积层:
nn.Conv2d
用于定义一个二维卷积层。这里创建了一个卷积层对象downsample
,它的参数含义如下:- 第一个参数
1
表示输入通道数,即前面调整后的输入张量的通道数为 1。 - 第二个参数
1
表示输出通道数,意味着经过这个卷积层后输出的数据仍然是单通道的。 - 第三个参数
3
表示卷积核的大小为3x3
。 stride=1
表示卷积的步长为 1,即每次卷积核在输入张量上移动一个单位。padding=0
表示在输入张量的边缘不进行填充,也就是卷积核在边缘位置可能会不完全覆盖输入数据。
- 第一个参数
o = downsample(input) print("输出值:",o) print("输出值的大小:",o.shape)
- 进行前向传播:
- 将调整好形状的输入张量
input
传入定义好的卷积层对象downsample
进行前向传播操作,得到输出张量o
。这一步相当于对输入数据进行了下采样操作,通过卷积核在输入数据上滑动进行卷积运算,提取特征并改变数据的维度和大小。
- 将调整好形状的输入张量
- 输出结果查看:
- 打印出输出张量
o
的值以及它的形状。输出张量的形状会根据卷积层的参数和输入张量的形状进行计算。一般来说,对于输入形状为(batch_size, in_channels, height, width)
的张量,经过卷积层nn.Conv2d(out_channels, kernel_size, stride, padding)
后的输出形状为(batch_size, out_channels, new_height, new_width)
,其中new_height
和new_width
可以根据卷积的计算公式得到(这里batch_size
就是前面推断出的1
)。在这种情况下,由于卷积核大小为3x3
,步长为1
,不填充,输入高度和宽度为4
,经过计算可得输出的高度和宽度为4 - 3 + 1 = 2
,所以输出张量o
的形状应该是(1, 1, 2, 2)
。
- 打印出输出张量
input = torch.tensor([[2.0,1.0],[4.0,4.0]]) input = intput.view(-1,1,2,2) print("输入值的大小:",input.shape)
这里重新定义了一个新的二维张量input
,它包含了不同的数值数据。然后同样使用.view()
方法将其调整为四维张量,以便适合后续的转置卷积层(用于上采样操作)的输入格式。调整后的形状为 (1, 1, 2, 2)
,其中含义与前面调整输入张量形状时类似,1
表示通道数为 1,后面两个 2
分别表示图像的高度和宽度(类比为处理图像数据的情况)。
upsample = nn. ConvTranspose2d(1,1,3,stride=1,padding=0) o = upsample(input) print("输出值:",o) print("输出值的大小:",o.shape)
- 定义转置卷积层:
nn.ConvTranspose2d
用于定义一个二维转置卷积层,也叫反卷积层,常用于上采样操作,以恢复数据的维度和大小。这里创建了一个转置卷积层对象upsample
,它的参数含义如下:- 第一个参数
1
表示输入通道数,即前面重新调整后的输入张量的通道数为 1。 - 第二个参数
1
表示输出通道数,意味着经过这个转置卷积层后输出的数据仍然是单通道的。 - 第三个参数
3
表示转置卷积核的大小为3x3
。 stride=1
表示转置卷积的步长为 1,即每次转置卷积核在输入张量上移动一个单位。padding=0
表示在输入张量的边缘不进行填充,也就是转置卷积核在边缘位置可能会不完全覆盖输入数据。
- 第一个参数
- 进行前向传播:
- 将调整好形状的输入张量
input
传入定义好的转置卷积层对象upsample
进行前向传播操作,得到输出张量o
。这一步相当于对输入数据进行了上采样操作,通过转置卷积核在输入数据上滑动进行转置卷积运算,以恢复数据的维度和大小,使其更接近原始数据的维度或者达到某种期望的上采样效果。
- 将调整好形状的输入张量
- 输出结果查看:
- 打印出输出张量
o
的值以及它的形状。输出张量的形状会根据转置卷积层的参数和输入张量的形状进行计算。一般来说,对于输入形状为(batch_size, in_channels, height, width)
的张量,经过转置卷积层nn.ConvTranspose2d(out_channels, kernel_size, stride, padding)
后的输出形状为(batch_size, out_channels, new_height, new_width)
,其中new_height
和new_width
可以根据转置卷积的计算公式得到(这里batch_size
就是前面推断出的1
)。在这种情况下,由于转置卷积核大小为3x3
,步长为1
,不填充,输入高度和宽度为2
,经过计算可得输出的高度和宽度为2 + 3 - 1 = 4
,所以输出张量o
的形状应该是(1, 1, 4, 4)
。
- 打印出输出张量
总体而言,这段代码主要演示了在 PyTorch 中如何使用二维卷积层进行下采样操作以及使用二维转置卷积层进行上采样操作,包括定义输入张量、调整张量形状、定义卷积层和转置卷积层以及查看操作后的输出结果及其形状。不过需要注意的是,代码中存在一个小错误,在重新定义输入张量进行上采样操作时,input = intput.view(-1, 1, 2, 2)
应该改为 input = input.view(-1, 1, 2, 2)
,可能是拼写错误导致的。