加油呀 小老弟

加油呀 小老弟_第1张图片
1.nn.ModuleList() 

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

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

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

import torch.nn as nn

class 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。这样有助于提高模型的稳定性和泛化能力。

你可能感兴趣的:(深度学习,python,pytorch)