You can iterate through the layers and replace them:
def replace_conv2D(net):
for key, layer in net._children.items():
if isinstance(layer, gluon.nn.Conv2D):
new_conv = gluon.nn.Conv2D(
channels=layer._channels // 2,
kernel_size=layer._kwargs['kernel'],
strides=layer._kwargs['stride'],
padding=layer._kwargs['pad'],
in_channels=layer._in_channels // 2)
with net.name_scope():
net.register_child(new_conv, key)
new_conv.initialize(mx.init.Xavier())
else:
replace_conv2D(layer)
net = gluon.model_zoo.vision.get_model("resnet18_v1", pretrained=True)
replace_conv2D(net)
You can check these threads for more details: Modifying pre-trained gluon model zoo and Modify structure of loaded network