My Network looks like this:
class Network(nn.Module):
     def  _init_(self):
               super.__init__()
               self.encoder=vgg16()
               l7 = [('fc7', nn.Conv2d(num_classes*512, num_classes, 1))]
               l8=[('fc8',nn.Conv2d(num_classes,num_classes,1))]
               self.conv1=nn.Sequential(OrderedDict(l7))
               self.conv2=nn.Sequential(OrderedDict(l8))


      def(self,input,warmup=True):
              x=self.encoder(input)
              x=conv1(x)
              if warmup==True:
                    return x

             x=conv2(x)
             return x

I want to only train a certain part of the network in the “warm up” time and this is how I update the weights:
NetworkTrg=Network().cuda()
learned_params = filter(lambda p: p.requires_grad, NetworkTrg.parameters())
opt= optim.SGD(learned_params, lr=1e-3)

for inputs, target in data:
     predict=NetworkTrg(Variable(inputs).cuda(),SupportPrototypes)
     loss=LossFn(predict,target)
     loss.backward() 
     opt.step()
     opt.zero_grad()

I want to know if it is valid to train a part of the network as I do. If not how do I modify the current setup to allow the training part wise.