def _forward_modules_json()

in iep/models/module_net.py [0:0]


  def _forward_modules_json(self, feats, program):
    def gen_hook(i, j):
      def hook(grad):
        self.all_module_grad_outputs[i][j] = grad.data.cpu().clone()
      return hook

    self.all_module_outputs = []
    self.all_module_grad_outputs = []
    # We can't easily handle minibatching of modules, so just do a loop
    N = feats.size(0)
    final_module_outputs = []
    for i in range(N):
      if self.save_module_outputs:
        self.all_module_outputs.append([])
        self.all_module_grad_outputs.append([None] * len(program[i]))
      module_outputs = []
      for j, f in enumerate(program[i]):
        f_str = iep.programs.function_to_str(f)
        module = self.function_modules[f_str]
        if f_str == 'scene':
          module_inputs = [feats[i:i+1]]
        else:
          module_inputs = [module_outputs[j] for j in f['inputs']]
        module_outputs.append(module(*module_inputs))
        if self.save_module_outputs:
          self.all_module_outputs[-1].append(module_outputs[-1].data.cpu().clone())
          module_outputs[-1].register_hook(gen_hook(i, j))
      final_module_outputs.append(module_outputs[-1])
    final_module_outputs = torch.cat(final_module_outputs, 0)
    return final_module_outputs