Hi, I am trying to implement a trainable parameter in an existing codebase, which is overwhelmingly large for me at the moment.
The original codebase can be found at https://github.com/TRI-ML/packnet-sfm
My main contribution should be trainable intrinsic parameters (which is basically a 3x3 matrix).
My best attempt is the following: a new Parameter is added to the SelfSupModel class which is set to zero in __init__
and the initial value is set at the first call of forward()
:
class SelfSupModel(SfmModel):
def __init__(self, **kwargs):
...
self.intrinsic = torch.nn.Parameter(torch.zeros((3, 3)))
self.intrinsic.requires_grad = True
...
def forward(self, batch, return_logs = False, progress = 0.0):
...
if self.intrinsic.sum() == 0:
self.intrinsic = torch.nn.Parameter(batch['intrinsics'][0])
stored_intrinsic = torch.stack(batch['intrinsics'].shape[0] * [self.intrinsic], 0)
self_sup_output = self.self_supervised_loss(
batch['rgb_original'], batch['rgb_context_original'],
output['inv_depths'], output['poses'], stored_intrinsic,
return_logs = return_logs, progress = progress)
I set requires_grad = True
and the intrinsic
can be found in SelfSupModel.named_parameters()
with requires_grad = True
.
Upon printing out this Parameter, it is not updated after each epoch.
What can be the reason for not being updated?
I assume that this is not the best possible way to initialize this Parameter and this might not be optimized for GPU.
Thanks, Fabian