时间序列(Time-Series)Conv_Blocks.py代码解析

import torch
import torch.nn as nn

#构建神经网络的基础
class Inception_Block_V1(nn.Module):
    #in_channels: 输入特征图的通道数。
    #out_channels: 输出特征图的通道数。
    #num_kernels: 要使用的不同核大小的数量,默认为6。
    #init_weight: 是否要初始化权重,默认为True。
    def __init__(self, in_channels, out_channels, num_kernels=6, init_weight=True):
        super(Inception_Block_V1, self).__init__()
        self.in_channels = in_channels
        self.out_channels = out_channels
        self.num_kernels = num_kernels
        kernels = []
        #创建一个列表kernels并使用循环添加num_kernels个二维卷积层(nn.Conv2d),每个核的大小逐渐增加,从1x1开始,步长为2,每层使用适当的填充以保持特征图大小不变。
        for i in range(self.num_kernels):
            kernels.append(nn.Conv2d(in_channels, out_channels, kernel_size=2 * i + 1, padding=i))
        #这些卷积核被包装在nn.ModuleList中,这是PyTorch的一种特殊列表,能够正确注册模块中的所有子模块。
        self.kernels = nn.ModuleList(kernels)
        #如果init_weight为True,调用一个初始化权重的方法。
        if init_weight:
            self._initialize_weights()
    #在_initialize_weights方法中,遍历模块的所有组件,如果是二维卷积层(nn.Conv2d),则进行权重初始化。
    def _initialize_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                #使用Kaiming/He初始化方法来初始化权重,这在ReLU激活函数下效果很好。
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
                #如果卷积层有偏置项,则将其初始化为0。
                if m.bias is not None:
                    nn.init.constant_(m.bias, 0)
    
    #在forward方法中,输入x通过每个卷积层并将结果收集到列表res_list中。                
    def forward(self, x):
        res_list = []
        for i in range(self.num_kernels):
            res_list.append(self.kernels[i](x))
        #将列表中的结果沿着一个新的维度堆叠起来,然后计算这个新维度上的平均值,以获得最终的输出res。
        res = torch.stack(res_list, dim=-1).mean(-1)
        return res

#与V1类似,但构建卷积层的方式不同,它使用了不对称的卷积核代替了对称的卷积核,并在最后额外添加了一个1x1的卷积层。解释这个类的代码与上一个类似,只是在构建kernels列表时使用了不同的卷积核大小和填充值。
class Inception_Block_V2(nn.Module):
    def __init__(self, in_channels, out_channels, num_kernels=6, init_weight=True):
        super(Inception_Block_V2, self).__init__()
        self.in_channels = in_channels
        self.out_channels = out_channels
        self.num_kernels = num_kernels
        kernels = []
        #这里添加了对称和非对称的卷积核,例如[1, 5]和[5, 1],以捕获不同方向的特征。
        for i in range(self.num_kernels // 2):
            kernels.append(nn.Conv2d(in_channels, out_channels, kernel_size=[1, 2 * i + 3], padding=[0, i + 1]))
            kernels.append(nn.Conv2d(in_channels, out_channels, kernel_size=[2 * i + 3, 1], padding=[i + 1, 0]))
        #在列表的末尾添加了一个1x1的卷积层。
        kernels.append(nn.Conv2d(in_channels, out_channels, kernel_size=1))
        self.kernels = nn.ModuleList(kernels)
        if init_weight:
            self._initialize_weights()

    def _initialize_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
                if m.bias is not None:
                    nn.init.constant_(m.bias, 0)
    #forward方法与V1版本类似,只是在遍历卷积核时,考虑到额外添加的1x1卷积,迭代次数变为self.num_kernels + 1。
    def forward(self, x):
        res_list = []
        for i in range(self.num_kernels + 1):
            res_list.append(self.kernels[i](x))
        res = torch.stack(res_list, dim=-1).mean(-1)
        return res
 

你可能感兴趣的:(python,开发语言)