Thank you @albanD . Yes, your suggestion makes sense. I moved self.center_freq into the forward function but this too doesn’t help in any updates on self.mu. Only the fc_1 params are updating.  To give a better picture of the code, I am putting below my training block.
# train the CNN for num_epochs
train_loss = []
val_loss = []
mu_updates = []
start_time = time.time()
retain_graph = True

for epoch in range(num_epochs):
    loss_accum = []
    for dataIns in dataloader:
        # read one sample
        inputRef, outputRef = dataIns
        inputRef = inputRef.reshape(inputRef.shape[0],h_in,w_in)
        outputRef = outputRef.reshape(outputRef.shape[0], h_out)
        inputRef, outputRef = inputRef.to(device), outputRef.to(device)
        # forward pass
        output = model(inputRef.float())
        # compute loss
        loss = custom_loss(output.float(), outputRef.float())
        loss_accum.append(loss)
        # backward pass
        optimizer.zero_grad()
        loss.backward(retain_graph=True)
        optimizer.step()

    # store mu
    mu_updates.append(model.mu.data.detach().cpu().numpy()[:,0])
    # compute val loss
    output = model(valData.float())
    vloss = custom_loss(output.float(), valOutput.float())

    # ===================store loss==================
    train_loss.append(sum(loss_accum).data.cpu().numpy()/len(loss_accum))
    val_loss.append(vloss.cpu().data.numpy())
    if epoch % 50 == 0:
        print('epoch [{}/{}], loss:{:.4f}, validation_loss:{:.4f}, time_elapsed:{:.4f}'
              .format(epoch + 1, num_epochs, train_loss[epoch], val_loss[epoch], time.time() - start_time))
    if vloss.data <= 0.0001:
        print(vlosses[-1])
        break