d2l卷积神经网络学习笔记(1)

本文深入探讨卷积神经网络(CNN)的特征学习机制,阐述卷积核如何降低输入图像的复杂性,并分析奇数卷积核在保持输出尺寸和中心点对齐上的优势。此外,讨论了步幅和填充对输出尺度的影响,以及偏置在反向传播中的作用。同时提醒读者在阅读代码时要留意尺寸调整的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.由于输入数据为图像,1024*1024*3水平的特征数量难以处理,通过引入卷积核进行对输入图像像素的批量卷积(或者按照d2l的说法,互相关运算,我觉得这个描述更能体现卷积核在其感受野内对图像小范围整体学习的特性)进行整体层面的特征学习。

2.通过调节卷积核,可以方便的降低特征数量。单通道stride为1且不考虑填充情况下,对a*b尺寸的图像通过一个c*d尺寸的卷积核,能够将a*b像素代表的信息压缩到(a-c+1)*(b-d+1),而更加重要的是,我们将需要反向传播优化的特征信息从全连接方法的a*b降低到了可以自由调节的c*d。

3.关于卷积核大小,d2l里提出:

卷积神经网络中卷积核的高度和宽度通常为奇数,例如1、3、5或7。 选择奇数的好处是,保持空间维度的同时,我们可以在顶部和底部填充相同数量的行,在左侧和右侧填充相同数量的列。

这句话可以这样理解,对2中例子a-c+1,当c为奇数时,显然为保证输出a-c+1与输入a有相同维度只需要增补偶数行即可。另外注意,对行列进行了增补代表卷积核运算的中心点(这也是奇数卷积核的优势,使用偶数卷积核由于找不到卷积的中心点会使得偶数卷积核不对称,导致在填充的时候像素特征不断偏移)和对应输出的值位置是不变的,即输出Y[i, j]是通过以输入X[i, j]为中心,与卷积核进行互相关计算得到的。

4.当存在步幅stride时,设垂直步幅e水平步幅f,则2中例子的输出尺度将变为(a-c+e+p)/e(向下取整),p为增加的行数。另外,可以将stride操作理解为采样,通过设置不同的stride对输入信号进行周期不同的采样

速记:(n-k+2p+s)/s,n为输入尺度,k为karnel,p为padding,s为stride

5.当对卷积核引入偏置bias时,为何反向传播对卷积核中不同位置参数分别进行调整,而这些不同参数却共用同一个偏置?我认为这是因为卷积核进行运算虽然是综合感受野内所有像素,但本质还是对单一像素点(中心点)进行调整的,所以这一偏置在反向传播中分别调整和给出一个统一值是没有区别的。

6.虽然和主题关系不大,补充一下大家一定要认真看代码啊...看VGG看到设定好输入输出尺寸直接在for循环反复添加新卷积层还以为有什么能够自动匹配两层间尺寸的特性,找了半天发现中间塞了一行尺寸调节的代码...

在PyTorch中实现双分支神经网络,可以通过定义两个独立的分支,并将它们合并在一起来实现。以下是一个示例代码,展示了如何修改VGG网络实现双分支输入。 ```python import torch from torch import nn from d2l import torch as d2l # 定义VGG网络的一个卷积块 def vgg_block(num_convs, in_channels, out_channels): layers = [] for _ in range(num_convs): layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)) layers.append(nn.ReLU()) in_channels = out_channels layers.append(nn.MaxPool2d(kernel_size=2, stride=2)) return nn.Sequential(*layers) # 定义双分支神经网络 class TwoBranchNet(nn.Module): def __init__(self, num_classes): super(TwoBranchNet, self).__init__() self.branch_a = vgg_block(2, 3, 64) # 第一个分支 self.branch_b = vgg_block(3, 3, 64) # 第二个分支 self.fc = nn.Linear(64 * 8 * 8, num_classes) # 全连接层 def forward(self, x_a, x_b): out_a = self.branch_a(x_a) out_b = self.branch_b(x_b) out = torch.cat((out_a, out_b), dim=1) # 将两个分支的输出拼接在一起 out = out.view(out.size(0), -1) out = self.fc(out) return out # 创建模型实例 model = TwoBranchNet(num_classes=10) ``` 在这个示例中,我们定义了两个独立的分支`branch_a`和`branch_b`,然后将它们的输出使用`torch.cat`函数在维度1上进行拼接,即将它们的通道数相加。最后,我们通过全连接层将拼接后的输出映射到所需的类别数。 请注意,这只是一个简单的示例,具体的架构和超参数应根据任务和数据的特点进行调整和优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [深度学习笔记其六:现代卷积神经网络和PYTORCH](https://blog.youkuaiyun.com/qq_28087491/article/details/126628880)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [pytorch+VGG16 双分支输入 图像分类](https://blog.youkuaiyun.com/qq_41638200/article/details/115725586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值