有用就点个赞
怎么理解 nn.Conv2d 参数
conv_layer = nn.Conv2d(in_channels=3, out_channels= 64, kernel_size=3, stride=1, padding=0, bias=False)
in_channels
in_channels 可以设置成1,2,3,4等等都可以,一般来说做图像识别的时候,先使用图片解析工具把一个彩色图片变成三个通道的图片,所以一张图片对应有三张图,in_channels 一般来说等于3,当然你可以发明一个四通道图片,in_channels就等于4。又或者你直接使用原图,那么in_channels 的值就相当于有多少张不同的图片,怎么理解都可以。
先看参数对应什么,一般说卷积核都是二维的,但是这里指的是三维卷积核,一共有64个三维卷积核,如果变成二维的话,就有192个二维卷积核,可以理解为将三个通道的图片通过一个三维卷积核压缩成一个特征图,64个三维卷积核那就压缩成64个特征图
如果再不懂,举个简单的例子,input_tensor 的尺寸是 3*3 ,真实情况下肯定是100 * 100以上啦,图片一般都很大,这里不会滑动而已
import torch
import torch.nn as nn
# 定义输入张量,形状为 (batch_size, in_channels, height, width)
input_tensor = torch.tensor([[[[1, 1, 1],
[1, 1, 1],
[1, 1, 1]],
[[0, 1, 0],
[0, 1, 0],
[0, 1, 0]],
[[1, 0, 1],
[1, 0, 1],
[1, 0, 1]]]], dtype=torch.float32)
# 定义一个卷积层,输入通道数为3,输出通道数为6,卷积核大小为3x3
conv_layer = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, bias=False)
print(input_tensor.size())
# 修改第一个通道的权重,但其实这里有6个三维卷积核
with torch.no_grad():
conv_layer.weight[0] = torch.nn.Parameter(torch.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, 1, 1]]], dtype=torch.float32))
print(conv_layer.weight.size())
# 进行卷积操作
output = conv_layer(input_tensor)
# 输出结果
print("输入张量:")
print(input_tensor)
print("\n卷积核权重(仅第一个输出通道显示):")
print(conv_layer.weight[0])
print("\n输出结果(仅显示第一个输出通道的卷积结果):")
print(output[0][0]) # 只显示第一个输出通道的结果
再不懂,画个线
通道图和卷积核的计算方式,简单的例子
计算:
卷积核的数量,由 out_channels 决定,out_channels是多少,就生成多少个卷积核。
padding 参数解析
padding = 1,周围填充0
padding = 2,周围填充0