神经网络入门实战:卷积层搭建
创作时间:
2025-03-20 03:35:50
作者:
@小白创作中心
神经网络入门实战:卷积层搭建
引用
CSDN
1.
https://m.blog.csdn.net/qq_51409113/article/details/144188442
卷积层的功能与计算
1. 卷积层的功能与作用
卷积层通过卷积运算对输入数据进行特征提取。卷积运算是一种特殊的线性运算,使用卷积核(也称为滤波器)在输入数据(通常是图像)上滑动,计算每个局部区域的加权和,从而生成特征图(Feature Map)。这些特征图反映了输入数据中不同局部区域的特征,如边缘、线条、纹理和形状等。
通过不断的训练,会形成一个卷积核,此卷积核对应于图像的一个特征,测试的时候通过用此卷积核扫描图片,就能找到具有此特征的图片。类比为:有三张图片“笔”、“水杯”、“纸”,此时脑海里有一支笔的样子,眼睛扫过这三个图片,有笔的图片因为相似度最大,所以选择那一张。
2. 卷积的计算
卷积核不能超出原始图片的边界。即使经过填充层,使周围填充了一圈之后,形成新图形,卷积核依然不能超出新图片的边界。
3. 卷积的结果
①输出单通道矩阵
对于多通道(n)的输入,会配有一个同样通道数(n)的卷积核,并且最后将所有通道的卷积结果相加,形成一个新的单通道输出矩阵。
②输出多通道(m通道)矩阵
想输出m通道矩阵,那么就要配备m个卷积核,每个卷积核都和输入拥有相同通道数(n),最后将这m个单通道结果组合成一个m通道输出。这也是后面的卷积核Weights的形状要定为m × n × H × W的原因。
卷积层搭建(Convolution Layers库)
卷积层可以改变通道数
- nn.Conv1d:一维卷积层
- nn.Conv2d:二维卷积层(最常用)
- nn.Conv3d:三维卷积层
有两种库函数可以调用。
1. 第一种:torch.nn.Conv2d(主要,比较简洁)
参数介绍:
Tips:
- 上述计算公式中的padding[0]和padding[1]表示padding元组的元素值,设置padding=1时,可以看成padding[0]=1,padding[1]=1;stride、kernel_size类似。(具体看下面的参数详解)
- 而dilation表示空洞卷积的参数,一般按照默认值,有兴趣可以去了解一下。在pytorch中默认为1,表示卷积核矩阵的元素是紧密排列的。
- padding和stride往往是先决定一个的值,再去按照公式计算另一个的值。
①函数调用
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1,
groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)
- in_channels:输入通道数(彩色图像的RGB三个通道对应3)(灰度图像通道数为1)。
- out_channels:输出通道数。一般 out_channels = 卷积核的数量。
- kernel_size:卷积核的大小。设置kernel_size=3,即高和宽为3×3;kernel_size=(3,5),即高和宽为3×5。不用手动设置卷积核的内容 weight ,函数第一次会对一些分布函数进行采样,从而初始化 weight 的值,后续这些值都是要通过训练学习的!!多通道的图片,在运算过程中,每个通道都会有有一个对应的卷积核
- stride:卷积核的步长。可以是单个数字或元组(sH, sW)。默认值:1。
- padding:输入图像四周的隐式填充。可以是字符串{'valid', 'same'}、单个数字或元组(padH, padW)。默认值:0 ('valid'表示无填充)。
①想要输出图像的尺寸和输入图像的尺寸相同,那么就要根据上面图片中的Hout和Wout计算公式来反推出padding的值,此时一般默认 stride =1。
②padding = 单个数字时,表示填充几圈0。
③画画图就能知道为什么尺寸不变时,padding该设置成这个数字。 - padding_mode:填充方式。可以是'zeros' , 'reflect' , 'replicate'或者 'circular' . 默认是: 'zeros'。
- bias(很少用到):可选的偏置张量。默认为True。
- groups(很少用到):默认是1.
②函数示例
import torchvision
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter
from torch import nn
from torch.utils.data import DataLoader
dataclass_transform = transforms.Compose([
transforms.ToTensor(),
])
test_dataset = torchvision.datasets.CIFAR10(root='E:\\4_Data_sets\\species recognition', train=False,transform=dataclass_transform, download=True)
test_dataloader = DataLoader(dataset=test_dataset,batch_size=64)
class testNet(nn.Module):
def __init__(self):
super(testNet, self).__init__()
self.conv1 = nn.Conv2d(3, 3 , 3,1,0)
def forward(self, input):
output = self.conv1(input)
return output
testNet_Instance = testNet()
writer = SummaryWriter('logs')
step = 0
for data in test_dataloader:
imgs, labels = data
writer.add_images("test_conv2d_input", imgs, step)
outputs = testNet_Instance(imgs)
writer.add_images("test-conv2d_output", outputs, step)
step += 1
writer.close()
2. 第二种:torch.nn.functional.conv2d(基本不用,但是参数的形状和维度可以看看)
①函数参数
- input:输入的数据。其形状由四个维度组成:
- minibatch:批次大小,即一次处理的样本数量。
- in_channels:输入通道数(彩色图像的RGB三个通道对应3)(灰度图像通道数为1)。
- iH:输入图像的高度。
- iW:输入图像的宽度。
- weight: 卷积核的参数。其形状由四个维度组成:
多通道的图片,在运算过程中,每个通道都会有有一个对应的卷积核 - out_channels:输出通道数,即卷积操作后生成的特征图数量。
- in_channels/groups:每个组内的输入通道数,当groups参数大于1时,用于分组卷积。
- kH:卷积核的高度。
- kW:卷积核的宽度。
- bias:可选的偏置张量。形状为(out_channels)。默认值:None。
- stride:卷积核的步长。可以是单个数字或元组(sH, sW)。默认值:1。
stride 定义了卷积核在输入数据上移动的步长。步长越大,输出特征图的空间尺寸越小。 - sH:卷积核在高度方向上的步长。
- sW:卷积核在宽度方向上的步长。
- padding:输入图像四周的隐式填充。可以是字符串{'valid', 'same'}、单个数字或元组(padH, padW)。默认值:0 ('valid'表示无填充)。
padding 用于在输入数据的边界周围添加零填充,以控制输出特征图的空间尺寸。
这里的padding只能在四周填充0。 - ‘valid’:表示无填充,输出特征图的空间尺寸会比输入小。
- ‘same’:填充输入,使得输出特征图的空间尺寸与输入相同。但此模式不支持除1以外的任何步长值。
- padH:在高度方向上添加的填充量。
- padW:在宽度方向上添加的填充量。
②函数示例
import torch
import torch.nn.functional as F
input = torch.tensor([[1, 2, 3, 4, 2],
[4, 5, 6, 2, 1],
[7, 8, 9, 7, 2],
[3, 4, 2, 0, 2],
[0, 3, 2, 4, 1]])
kernel = torch.tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
input_new = torch.reshape(input, (1, 1, 5, 5)) # conv2d的输入和输出都得是四维的,第一维对应的数值 1 表示batch_size=1
kernel_new = torch.reshape(kernel, (1, 1, 3, 3))
print(input_new.shape)
print(kernel_new.shape)
output = F.conv2d(input_new, kernel_new, stride=1, padding=1)
print(output)
运行结果:
torch.Size([1, 1, 5, 5])
torch.Size([1, 1, 3, 3])
tensor([[[[ 94, 154, 148, 111, 48],
[186, 285, 273, 194, 86],
[166, 225, 186, 128, 58],
[104, 136, 146, 104, 57],
[ 36, 44, 54, 42, 25]]]])
热门推荐
冬季养生必备:松子的神奇功效
麦角硫因:认知改善与癌症预防的新希望
英语学习者热议:quiet的比较级竟然是quieter!
赖荣茂独创莲雾高醣栽培法:告别农药黑网,实现环保高产
狂犬病病毒警告:被狗咬死的鸡还能吃吗?
倍他乐克:心脏病治疗的重要药物,但并非万能药
家常土豆脆哨
与98岁妈妈“搭档”养老!63岁儿子:别人很羡慕,我很幸福!
探秘西藏必访圣地:大昭寺的历史与文化
昆山下周迎16度大幅降温,最低零下3度!市气象局提醒市民做好保暖
银屑病治疗指南:别滥用复方克霉唑,这些方法才有效
合同法定金制度全解析:三大作用与四大法律规定
米其林女主厨Chef Pam:通过美食捕捉记忆
重庆市鲁能巴蜀中学:从民办到公办的逆袭之路
陕西返乡创业政策创新多,汉中石泉成效显著
互联网医院教你缓解更年期疼痛
唐太宗李世民的爱情考验与吃醋传说,为何吃醋成为爱情中的必修课
别具一格的书法:李叔同(弘一法师)书法风格
AI系统错误处理的新姿势,你GET了吗?
阳江至恩施旅游攻略:5天4夜玩转土家文化与自然奇观
汽车玻璃清洗攻略:用对方法,视野清晰又安全
毛鸡蛋真有毒?专家揭秘真相
雷帕霉素:从免疫抑制剂到抗衰老新星
镇痛药又没长眼睛 为什么能精准找到痛点并止痛?
血红蛋白低警惕缺铁性贫血,补充铁剂和改善饮食是关键
泡发海参保存秘籍,让你的海参鲜美如初
冬季扦插育苗全攻略:4种常见植物从选枝到养护
信阳市第五人民医院发布胃镜检查新指南,助力胃部健康管理
角磨机致伤事故频发,专家详解安全操作与防护要点
幸福从何而来?专家解析:建立持久满足感的科学方法