Я пытаюсь получить дополнительные данные во время обучения Resnet18. В моем случае это гендерная информация, выраженная как gender=Tensor([g]), where g =[-1|0|1] for [female|unknown|male]
, и некоторый дескриптор формы, полученный на предыдущих шагах, который имеет форму desc=Tensor([...]), desc.shape = ([64,])
. Я следовал подсказкам, обнаруженным в этом потоке переполнения стека , и успешно добавил информацию о поле, однако после добавления тензора des c потеря становится равной NaN. Я попытался нормализовать полученный слой, но безрезультатно. Вот модифицированная функция переадресации Resnet18, которую я использую:
def forward(self, xy):
x = xy[0] #torch.Size([4, 3, 224, 224])
desc = xy[1] #torch.Size([4, 64])
genders = xy[2] #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 = genders.transpose(1,0) #torch.Size([4, 1]); torch.norm(y,dim=1) == tensor([1., 1., 1., 1.])
desc = desc.type(torch.float32) #torch.Size([4, 64]); torch.norm(desc,dim=1) == tensor([1., 1., 1., 1.]
z1 = torch.cat([x,y,desc],dim=1) #torch.Size([4, 100]); torch.norm(z1,dim=1) == tensor([3.6243, 2.5945, 3.1520, 3.0312])
#z2 = self.bn2(z1)
z1 = self.fc2(z1) #torch.Size([4, 35]); torch.norm(z1,dim=1) == tensor([1.2954, 0.9399, 1.0137, 1.1230]
return z1
Не могли бы вы знать, как правильно добавить дополнительные данные в слой?
Лучший
Крис