失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 加油呀 小老弟

加油呀 小老弟

时间:2022-01-27 09:38:33

相关推荐

加油呀 小老弟

1.nn.ModuleList()

nn.ModuleList()is a container class容器类? in PyTorch that can be used to store a list ofnn.Moduleobjects. It is similar to the built-in Pythonlisttype, but has additional functionality specific to PyTorch modules.

One of the main advantages of usingnn.ModuleList()is that it allows you to register child modules in your PyTorch model. This means that when you call theparameters()method on the parent module, it will also return the parameters of all the child modules stored in thenn.ModuleList(). This makes it easier to manage and optimize complex models with multiple layers and sub-modules.子模块

Here is an example of how to usenn.ModuleList():

import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.layers = nn.ModuleList([nn.Linear(100, 200), nn.ReLU(), nn.Linear(200, 10)])def forward(self, x):for layer in self.layers:x = layer(x)return x

在这个例子中,我们创建了一个简单的 PyTorch 模型,

包含三个层:一个线性层、一个 ReLU 激活函数和另一个线性层。

我们将这些层存储在一个名为self.layersnn.ModuleList()中。在forward()方法中,我们循环遍历nn.ModuleList()中的层,并将它们依次应用于输入x

总的来说,nn.ModuleList()是管理具有多个子模块的 PyTorch 模型的有用工具,

可以简化注册和优化参数的过程。

2. x.shape[-1]

x.shape[-1]表示获取张量 x 的最后一个维度的大小,也就是x 的宽度。如果x是一个四维张量,形状为(n, c, h, w)x.shape[-1]的值为w

这个代码片段中,这个值被用来判断 x 的宽度是否与out_shape相同

如果不同,则通过上采样的方式(插值)将 x 的宽度调整为out_shape

3.in zip(fstudent. fteacher):

在遍历两个模型fstudentfteacher中的参数,并将它们打包成元组进行迭代

zip是 Python 内置的一个函数

它可以将多个可迭代对象对应位置的元素打包成元组,并返回一个迭代器。

例如,zip([1, 2, 3], ['a', 'b', 'c'])将返回一个迭代器,

它包含了三个元组(1, 'a')(2, 'b')(3, 'c')。在这个代码片段中,

zip(fstudent,fteacher)将会将fstudentfteacher中对应位置的参数打包成元组。

for循环中,使用param_studentparam_teacher两个变量

来分别存储fstudentfteacher中对应位置的参数。

这样,在遍历完所有参数之后,

param_studentparam_teacher就会分别对应fstudentfteacher中的所有参数。

4. n, c, h, w = fs.shape()

想要获取fs这个四维张量的尺寸信息,并将它们分别存储在nchw这四个变量中。

在 Python 中,可以通过调用张量的shape属性来获取它的尺寸信息。

例如,如果fs是一个四维张量,则可以使用fs.shape来获取它的形状,

它会返回一个四元组(n, c, h, w)

其中n表示批次大小(batch size),c表示通道数(channel number),h表示高度(height),w表示宽度(width)。

这也使用了 Python 的解构赋值语法,将四元组(n, c, h, w)中的四个元素依次赋值给变量nchw

这样,变量nchw就分别存储了fs张量的批次大小、通道数、高度和宽度信息

5.loss = F.mse_loss(fs, ft, reduction="mean")

PyTorch 中的均方误差损失函数F.mse_loss来计算fsft两个张量之间的均方误差损失

均方误差是用来衡量两个数值之间差异大小的一种常用指标,它表示预测值与真实值之差的平方的平均值。

具体地说,F.mse_loss函数的输入参数包括fsftreduction

其中,fsft分别是两个张量,它们的形状需要相同

reduction参数用于指定损失函数的降维方式,可以取值为"mean""sum"或者"none"

reduction="mean"时,F.mse_loss函数会计算所有损失值的平均值;

reduction="sum"时,F.mse_loss函数会计算所有损失值的总和;

reduction="none"时,F.mse_loss函数会返回所有损失值组成的张量,不进行降维。

最终,代码将计算得到的均方误差损失存储在变量loss中。

这个损失值可以用来优化模型参数,使模型能够更准确地预测目标变量。

6.tmpfs = F.adaptive_avg_pool2d(fs, (l, l))

tmpft = F.adaptive_avg_pool2d(ft, (l, l))

使用了 PyTorch 中的自适应平均池化函数F.adaptive_avg_pool2dfsft进行池化操作

具体来说,F.adaptive_avg_pool2d函数可以将输入张量按照指定的输出大小自适应地进行平均池化操作,可以避免因为输入大小不一致而导致的池化结果不一致的问题

在本代码中,使用F.adaptive_avg_pool2dfsft按照大小(l, l)进行自适应平均池化,得到池化后的结果tmpfstmpft

具体而言,F.adaptive_avg_pool2d函数的输入参数包括inputoutput_size

其中,input是一个四维张量,表示输入数据的大小为(batch_size, channel, height, width)

output_size则是一个元组,表示输出的大小为(output_height, output_width)

其中output_heightoutput_width分别表示输出的高度和宽度。

在本代码中,由于l表示池化后的大小,因此将(l, l)传入作为output_size,来指定输出大小。

最终,本代码通过自适应平均池化操作,将fsft的大小缩小到了(l, l),以方便后续计算损失。

7.

self.conv1 = nn.Sequential(

nn.Conv2d(in_channel, mid_channel, kernel_size=1, bias=False),

nn.BatchNorm2d(mid_channel),)

self.conv1是一个由两个层组成的序列,

包括一个1x1 卷积层nn.Conv2d和一个BNnn.BatchNorm2d

在卷积神经网络中,1x1 卷积层通常用于控制通道数,

即通过将输入数据进行通道间的线性组合,生成输出通道数为mid_channel的特征图。

具体来说,在这里nn.Conv2d的输入通道数为in_channel,输出通道数为mid_channel

卷积核大小为kernel_size=1,表示使用 1x1 的卷积核进行卷积操作

此外,由于这里的卷积层不需要偏置项,因此bias=False

8.bias 这个是干嘛的?

在神经网络的卷积层中,每个输出通道都对应一个偏置项,可以用来调整输出特征图中的偏移。

在 PyTorch 中,卷积层默认是带有偏置项的,因此在nn.Conv2d中不需要指定bias=True

如果需要禁用偏置项,则可以使用bias=False

9.禁用偏置项会怎么样

禁用偏置项会使得卷积层不再包含偏置项参数

这通常会使得模型更加简单,减少了参数量和计算量

但是也可能会降低模型的拟合能力

在一些应用场景中,禁用偏置项的效果可能会更好,例如对于某些低层次的卷积层,由于特征图的输入数据中已经包含了一定的偏置信息,因此可以省略偏置项的使用。

但在一些高层次的卷积层中,偏置项的作用可能更加明显,此时禁用偏置项可能会对模型的性能造成不良影响。

因此,是否使用偏置项需要根据具体情况进行选择。

BN层nn.BatchNorm2d用于对每个通道上的特征值进行均值和方差的归一化操作

从而能够加速训练、减小过拟合,并提升模型的泛化能力。

在这里,nn.BatchNorm2d的输入通道数为mid_channel

表示对mid_channel个通道上的特征值进行归一化。

10. 其实BN到底干了啥

self.conv2 = nn.Sequential(nn.Conv2d(mid_channel, out_channel, kernel_size=3, bias=False),nn.BatchNorm2d(out_channel),)

这段代码定义了一个包含一个卷积层和一个BN层的序列模块conv2

其中,nn.Conv2d创建了一个卷积层对象,

它接收三个参数:输入通道数mid_channel,输出通道数out_channel和卷积核的大小kernel_size,同时,在卷积层中使用bias=False参数表示不使用偏置项。

接下来,将卷积层的输出输入到nn.BatchNorm2d中进行BN操作。

nn.BatchNorm2d将对每个通道的特征图进行标准化处理,

使得其均值为 0,方差为 1。这样有助于提高模型的稳定性和泛化能力。

如果觉得《加油呀 小老弟》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
小老弟跟着我

小老弟跟着我

2019-10-30

“外国小绅士”——老弟

“外国小绅士”——老弟

2023-12-13

小老弟的随笔

小老弟的随笔

2024-04-09

Java三个小老弟

Java三个小老弟

2022-05-06