Hello everyone. I am trying to extra data during training Resnet18. In my case it is gender information expressed as gender=Tensor([g]), where g =[-1|0|1] for [female|unknown|male]
, and some shape descriptor obtained in previous steps, which is of the form desc=Tensor([...]), desc.shape = ([64,])
.
I tried to follow the example at this thread but my loss value becomes NaN in the first epoch. Changing the learning rate does not help
Here is the modified resnet18 function that i use. in the comments i put the shape and magnitudes of tensors. As you can see the data that i want to add is already normalized:
def forward(self, x,descdata,genderdata):
#x.shape = #torch.Size([4, 3, 224, 224])
# descdata.shape = torch.Size([ 4,64])
# genderdata.shape = torch.Size([1,4])x = self.conv1(x) #torch.Size([4, 64, 112, 112]) x = self.bn1(x) #torch.Size([4, 64, 112, 112]) x = self.relu(x) # torch.Size([4, 64, 112, 112]) x = self.maxpool(x) #torch.Size([4, 64, 56, 56]) x = self.layer1(x) #torch.Size([4, 64, 56, 56]) x = self.layer2(x) #torch.Size([4, 128, 28, 28]) x = self.layer3(x) #torch.Size([4, 256, 14, 14]) x = self.layer4(x) #torch.Size([4, 512, 7, 7]) x = self.avgpool(x) #torch.Size([4, 512, 1, 1]) x = torch.flatten(x, 1) #torch.Size([4, 512]) x = self.fc(x) #torch.Size([4, 35]); torch.norm(x,dim=1) == tensor([4.4604, 1.9574, 2.0123, 1.9583]) y = genderdata.transpose(1,0) #torch.Size([4, 1]); torch.norm(y,dim=1) == tensor([1., 1., 1., 1.]) z1 = torch.cat([x,y,descdata.type(torch.float32)],dim=1) #torch.Size([4, 100]); torch.norm(z1,dim=1) == tensor([3.6243, 2.5945, 3.1520, 3.0312]) z1 = self.relu2(self.fc2(z1)) # self.relu2 = nn.ReLU(); self.fc2 = nn.Linear(num_classes+1+64, (num_classes+1+64)*2) defined in __init__ z1 = self.fc3(z1) # self.fc3 = nn.Linear((num_classes+1+64)*2, num_classes) defined in __init__ return z1
Would you know how to properly add the extra data to the layer?
Best
Chris