What I am trying to do right now is to write a multi layer conv2d encoder and freeze the weights from updating for the earlier layers. This hopefully would give me back a similar effect like progressively growing the layers. This way I can initialize the complete network first without worrying about how to mix and match and add new layers to the network. So before I start to write a complex model I thought I would experiment with freezing a small network for testing purpose. The result is already different from what I was expecting. I assumed setting grad to zero would stop the updating of the weights so the end weight would stay the same but I was wrong. Below is my testing code.
encoder = nn.Sequential( nn.Conv2d(1, 4, 1), nn.ReLU() ).cuda()

criterion = torch.nn.BCELoss()
optimizer = torch.optim.Adam(encoder.parameters(), lr=0.001)

for params in encoder.parameters():
    print('params:' params)
    prams.require_grad = False # Freeze all weights

params: [ [[[ 0.1500]]], [[[0.9332]]], [[[-0.1422]]], [[[-0.7685]] ] ....

epochs = 2
target = torch.randn(32, 1, 4, 4).cuda()
for e in range(epochs):
    random_input = torch.randn(32, 1, 4, 4).cuda()
    Y_pred = encoder(random_input)
    loss = critertion( Y_pred, Y )
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if epoch % 2 == 0:
        print('[Epoch:{} -- Loss:{:.4f}]'.format(epoch, loss.item()))


[Epoch:0 -- Loss: 0.8634] # loss getting updated
[Epoch:2 -- Loss: 0.8574]

for params in encoder.parameters(): #looping through the encoder to see if my weights are still the same
    print('params:' params)

params: [ [[[ 0.1433]]], [[[0.9233]]], [[[-0.1333]]], [[[-0.7586]] ] ... # weight value updates?

As you can see if I print out the new param after 2 epochs my weights still got updated. I would like to cancel those update and only use them as input conversion layers like toRGB or fromRGB layers in the progressive gan paper.