**前置知识:
1、张量和通道
张量:多维数组,用来表示数据(图像、视频等)
通道:图像数据的一部分,表示不同的颜色或特征层
通道只是张量的其中一个维度
以一张RGB图像为例,
该图像数据可以用一个三维张量(shape等于(C,H,W))来表示
其中C表示通道数(对于RGB图像,C=3),H表示高度,W表示宽度
再以一批64张图像组成的数据对象来看,
它可以用一个四维张量(shape等于(N,C,H,W))来表示
其中N表示批次大小(一批次图像的数量)
关于通道的补充:
2、Reshape:输入数据和卷积核张量的重塑
input = torch.reshape(input, (1, 1, 5, 5))
- 1 :第一个
1
表示有 1 张图片(批量大小) - 1 :第二个
1
表示输入的通道数(这里是单通道,表示灰度图像) - 5 和 5:分别表示图像的高度和宽度
kernel = torch.reshape(kernel, (1, 1, 3, 3))
- 1 :第一个
1
表示有 1 个卷积核(输出通道数) - 1 :第二个
1
表示卷积核的输入通道数(与input的输入通道数匹配) - 3 和 3:分别表示卷积核的高度和宽度
通过重塑,增加的信息主要是关于批量大小和通道数,
这使得输入和卷积核符合 conv2d
函数的要求
(输入张量必须是四维的,形状为 (N, C, H, W),
卷积核(权重)必须是四维的,形状为 (out_channels, in_channels, kernel_height, kernel_width):)
补充:
一张2*2RGB图像与一个3*3卷积核的卷积:
reshape后:
input的形状是(1,3,2,2),1表示1张图片
卷积核的形状是(1,3,3,3),1表示1个输出通道
3、output=F.conv2d(input,kernel,stride=1,padding=1)
|---------|----------------------------|
| input | 输入张量(4维) |
| kernel | 卷积核(4维) |
| stride | 卷积核移动的步幅(可以是一个整数或元组,默认为 1) |
| padding | 在输入的边缘添加零填充(帮助保持输出的空间尺寸) |
**代码:
步骤:
import torch.nn.functional as F
定义input、kernel------>修改成四维形状reshape------>使用conv2d进行卷积
灰度图像的卷积:帮助识别图像中的特定特征,如边缘或纹理
python
import torch
import torch.nn.functional as F
input=torch.tensor([
[1,2,0,3,1],
[0,1,2,3,1],
[1,2,1,0,0],
[5,2,3,1,1],
[2,1,0,1,1]
])
#卷积核
kernel=torch.tensor([
[1,2,1],
[0,1,0],
[2,1,0]
])
print(input.shape)
print(kernel.shape)
input=torch.reshape(input,(1,1,5,5)) #图片数,图层数(通道数),宽,高
kernel=torch.reshape(kernel,(1,1,3,3))
print(input.shape)
print(kernel.shape)
output1=F.conv2d(input,kernel,stride=1)
print(output1)
output2=F.conv2d(input,kernel,stride=2)
print(output2)
output3=F.conv2d(input,kernel,stride=1,padding=1)
print(output3)