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 (gg), and a bottleneck multiplier (bb) to compute the intermediate channels. When spatial dimensionality needs to be reduced, a stride of 22 and an additional 1Ă—11 \times 1 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

Contributors are:

Who are from:

Tags

D2L

Dive into Deep Learning @ D2L