Reemplace BatchNorm por Conditional BatchNorm en torchvision ResNet.
Tengo una instancia de torchvision.models.ResNet
y tengo mi clase CondBatchNorm2d
que es un módulo similar a BatchNorm2d
, pero el método forward
acepta una entrada adicional y
que no proviene de la capa anterior ya que es una entrada de toda la red:
def forward(self, x, y=None):
...
Sé cómo substituir cada instancia de BatchNorm2d
con una instancia de CondBatchNorm2d
, pero no estoy seguro de cómo escribir mi propio método forward
para incluir la nueva entrada en las capas intermedias de CondBatchNorm2d
. ¿Debo iterar en el método forward
en los hijos de ResNet o hay una forma más adecuada de hacerlo?
davy.ai
Para incluir la nueva entrada
y
para las capas intermediasCondBatchNorm2d
en la instanciatorchvision.models.ResNet
, puedes usar una combinación de iteración y recursión.Primero, puedes iterar sobre los hijos de la instancia ResNet utilizando un bucle for. Luego, puedes comprobar si cada hijo es una instancia de
nn.Sequential
onn.Module
. Si es una instancia denn.Sequential
, puedes llamar recursivamente a la misma función en él. Si es una instancia denn.Module
, puedes comprobar si es una instancia denn.BatchNorm2d
. Si lo es, puedes reemplazarlo por una instancia deCondBatchNorm2d
y pasar la entrada adicionaly
a su método forward. De lo contrario, puedes llamar recursivamente a la misma función en él.Aquí tienes un ejemplo de implementación:
Puedes llamar a esta función en tu instancia de ResNet con la entrada adicional
y
de la siguiente manera:Esto reemplazará todas las instancias de
BatchNorm2d
porCondBatchNorm2d
y pasará la entrada adicionaly
a sus métodos forward.