Deep learning 如何在一个模型中训练多个损耗,并在pytorch中选择性地冻结部分网络?

Deep learning 如何在一个模型中训练多个损耗,并在pytorch中选择性地冻结部分网络?,deep-learning,pytorch,Deep Learning,Pytorch,我是皮托克的新手。 我正在实现一个网络,它有两个分类器(黄色和紫色),如图所示。 问题是,我想在网络训练黄色分类器时冻结红色部分,在网络训练紫色分类器时解冻红色部分 下面是我想实现的一个简短代码 # x is input and y_yellow, y_purple are labels of yellow and purple classifiers respectively. criterion = CrossEntropyLoss() opt = SGD() model = my_mode

我是皮托克的新手。 我正在实现一个网络,它有两个分类器(黄色和紫色),如图所示。 问题是,我想在网络训练黄色分类器时冻结红色部分,在网络训练紫色分类器时解冻红色部分

下面是我想实现的一个简短代码

# x is input and y_yellow, y_purple are labels of yellow and purple classifiers respectively.
criterion = CrossEntropyLoss()
opt = SGD()
model = my_model()

opt.zero_grad()
yellow_out, purple_out = model(x)

# freeze red part requires_grad = False

yellow_loss = criterion(yellow_out, y_yellow)
yellow_loss.backward()
opt.step()

opt.zero_grad()
# unfreeze red part requires_grad = True

purple_loss = criterion(purple_out, y_purple)
purple_loss.backward()
opt.step

请让我知道实施这个想法的确切方法

  • 代码的顺序正确吗

  • 我是否正确使用了零刻度

  • 我错过什么了吗

  • 是否有我需要使用的可选参数


    • 最简单的策略是不将红色模块的参数传递给优化器
      opt
      。或者,您可以将红色模块参数的
      requires_grad
      设置为
      False

      它将看起来像:

      for param in red_module.parameters():
          param.requires_grad = False
      

      让我知道这是否适合您。

      最简单的策略是不将红色模块的参数传递给优化器
      opt
      。或者,您可以将红色模块参数的
      requires_grad
      设置为
      False

      它将看起来像:

      for param in red_module.parameters():
          param.requires_grad = False
      
      让我知道这是否适合你