class TemporalBlock(nn.Module): """ Temporal block with the following layers: - 2x3x3, 1x3x3, spatio-temporal pyramid pooling - dropout - skip connection. """ def __init__(self, in_channels, out_channels=None, use_pyramid_pooling=False, pool_sizes=None): super().__init__() self.in_channels = in_channels self.half_channels = in_channels // 2 self.out_channels = out_channels or self.in_channels self.kernels = [(2, 3, 3), (1, 3, 3)] # Flag for spatio-temporal pyramid pooling self.use_pyramid_pooling = use_pyramid_pooling # 3 convolution paths: 2x3x3, 1x3x3, 1x1x1 self.convolution_paths = [] for kernel_size in self.kernels: self.convolution_paths.append( nn.Sequential( conv_1x1x1_norm_activated(self.in_channels, self.half_channels), CausalConv3d(self.half_channels, self.half_channels, kernel_size=kernel_size), ) ) self.convolution_paths.append(conv_1x1x1_norm_activated(self.in_channels, self.half_channels)) self.convolution_paths = nn.ModuleList(self.convolution_paths) agg_in_channels = len(self.convolution_paths) * self.half_channels if self.use_pyramid_pooling: assert pool_sizes is not None, "setting must contain the list of kernel_size, but is None." reduction_channels = self.in_channels // 3 self.pyramid_pooling = PyramidSpatioTemporalPooling(self.in_channels, reduction_channels, pool_sizes) agg_in_channels += len(pool_sizes) * reduction_channels # Feature aggregation self.aggregation = nn.Sequential( conv_1x1x1_norm_activated(agg_in_channels, self.out_channels),) if self.out_channels != self.in_channels: self.projection = nn.Sequential( nn.Conv3d(self.in_channels, self.out_channels, kernel_size=1, bias=False), nn.BatchNorm3d(self.out_channels), ) else: self.projection = None网络结构是什么?
时间: 2024-02-14 08:22:26 浏览: 270
Spatio-Temporal MLP-Graph 的 pre-trained models
这段代码实现了一个名为 TemporalBlock 的神经网络模块,该模块包括以下层:
- 3 个卷积路径: 2x3x3 卷积、1x3x3 卷积和 1x1x1 卷积
- dropout 层
- skip 连接
- 可选的 spatio-temporal pyramid pooling 层
- 最后是特征聚合和投影层(如果输入和输出通道数不同)
其中,卷积路径通过 nn.Sequential 和 nn.ModuleList 封装,方便调用和管理。
TemporalBlock 的输入通道数为 in_channels,输出通道数为 out_channels(如果未指定,则默认与输入通道数相同),通过 kernels 参数定义了 3 个卷积核的大小,其中前两个卷积路径使用 2x3x3 和 1x3x3 卷积核,第三个卷积路径使用 1x1x1 卷积核。
如果 use_pyramid_pooling 参数为 True,则会添加一个 spatio-temporal pyramid pooling 层,对输入进行空间和时间维度的金字塔池化,提取多尺度特征,其中 pool_sizes 参数指定了池化核的大小。
最后,特征聚合层将多个路径的特征拼接起来,通过 1x1x1 卷积将通道数调整为 out_channels,如果输入和输出通道数不同,则添加一个投影层进行通道数的调整。
阅读全文