Learn Before
Code
ResNeXt Block Code Implementation
The ResNeXtBlock class can be implemented programmatically across deep learning frameworks as a sequence of three convolutional layers, utilizing grouped convolution in the middle layer. The constructor takes the number of output channels, the number of groups (), and a bottleneck multiplier () to compute the intermediate channels. When spatial dimensionality needs to be reduced, a stride of and an additional convolution on the residual connection are applied by setting use_1x1conv=True and strides=2.
PyTorch Implementation:
class ResNeXtBlock(nn.Module): def __init__(self, num_channels, groups, bot_mul, use_1x1conv=False, strides=1): super().__init__() bot_channels = int(round(num_channels * bot_mul)) self.conv1 = nn.LazyConv2d(bot_channels, kernel_size=1, stride=1) self.conv2 = nn.LazyConv2d(bot_channels, kernel_size=3, stride=strides, padding=1, groups=bot_channels//groups) self.conv3 = nn.LazyConv2d(num_channels, kernel_size=1, stride=1) self.bn1 = nn.LazyBatchNorm2d() self.bn2 = nn.LazyBatchNorm2d() self.bn3 = nn.LazyBatchNorm2d() if use_1x1conv: self.conv4 = nn.LazyConv2d(num_channels, kernel_size=1, stride=strides) self.bn4 = nn.LazyBatchNorm2d() else: self.conv4 = None def forward(self, X): Y = F.relu(self.bn1(self.conv1(X))) Y = F.relu(self.bn2(self.conv2(Y))) Y = self.bn3(self.conv3(Y)) if self.conv4: X = self.bn4(self.conv4(X)) return F.relu(Y + X)
MXNet Implementation:
class ResNeXtBlock(nn.Block): def __init__(self, num_channels, groups, bot_mul, use_1x1conv=False, strides=1, **kwargs): super().__init__(**kwargs) bot_channels = int(round(num_channels * bot_mul)) self.conv1 = nn.Conv2D(bot_channels, kernel_size=1, padding=0, strides=1) self.conv2 = nn.Conv2D(bot_channels, kernel_size=3, padding=1, strides=strides, groups=bot_channels//groups) self.conv3 = nn.Conv2D(num_channels, kernel_size=1, padding=0, strides=1) self.bn1 = nn.BatchNorm() self.bn2 = nn.BatchNorm() self.bn3 = nn.BatchNorm() if use_1x1conv: self.conv4 = nn.Conv2D(num_channels, kernel_size=1, strides=strides) self.bn4 = nn.BatchNorm() else: self.conv4 = None def forward(self, X): Y = npx.relu(self.bn1(self.conv1(X))) Y = npx.relu(self.bn2(self.conv2(Y))) Y = self.bn3(self.conv3(Y)) if self.conv4: X = self.bn4(self.conv4(X)) return npx.relu(Y + X)
JAX Implementation:
class ResNeXtBlock(nn.Module): num_channels: int groups: int bot_mul: int use_1x1conv: bool = False strides: tuple = (1, 1) training: bool = True def setup(self): bot_channels = int(round(self.num_channels * self.bot_mul)) self.conv1 = nn.Conv(bot_channels, kernel_size=(1, 1), strides=(1, 1)) self.conv2 = nn.Conv(bot_channels, kernel_size=(3, 3), strides=self.strides, padding='same', feature_group_count=bot_channels//self.groups) self.conv3 = nn.Conv(self.num_channels, kernel_size=(1, 1), strides=(1, 1)) self.bn1 = nn.BatchNorm(not self.training) self.bn2 = nn.BatchNorm(not self.training) self.bn3 = nn.BatchNorm(not self.training) if self.use_1x1conv: self.conv4 = nn.Conv(self.num_channels, kernel_size=(1, 1), strides=self.strides) self.bn4 = nn.BatchNorm(not self.training) else: self.conv4 = None def __call__(self, X): Y = nn.relu(self.bn1(self.conv1(X))) Y = nn.relu(self.bn2(self.conv2(Y))) Y = self.bn3(self.conv3(Y)) if self.conv4: X = self.bn4(self.conv4(X)) return nn.relu(Y + X)
TensorFlow Implementation:
class ResNeXtBlock(tf.keras.Model): def __init__(self, num_channels, groups, bot_mul, use_1x1conv=False, strides=1): super().__init__() bot_channels = int(round(num_channels * bot_mul)) self.conv1 = tf.keras.layers.Conv2D(bot_channels, 1, strides=1) self.conv2 = tf.keras.layers.Conv2D(bot_channels, 3, strides=strides, padding="same", groups=bot_channels//groups) self.conv3 = tf.keras.layers.Conv2D(num_channels, 1, strides=1) self.bn1 = tf.keras.layers.BatchNormalization() self.bn2 = tf.keras.layers.BatchNormalization() self.bn3 = tf.keras.layers.BatchNormalization() if use_1x1conv: self.conv4 = tf.keras.layers.Conv2D(num_channels, 1, strides=strides) self.bn4 = tf.keras.layers.BatchNormalization() else: self.conv4 = None def call(self, X): Y = tf.keras.activations.relu(self.bn1(self.conv1(X))) Y = tf.keras.activations.relu(self.bn2(self.conv2(Y))) Y = self.bn3(self.conv3(Y)) if self.conv4: X = self.bn4(self.conv4(X)) return tf.keras.activations.relu(Y + X)
0
1
Updated 2026-05-13
Tags
D2L
Dive into Deep Learning @ D2L