criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)
iteration=100

def model_training(model, dataloader, dataset, epoch, device, train=False):
losses = 0
corrects = 0

if train:
model.train()
for i, (x, y) in enumerate(dataloader):
x = x.to(device)
y = y.to(device)

optimizer.zero_grad()
preds = model(x)

loss = criterion(preds, y)
loss += diceloss(preds, y)

# 역전파를 통해 기울기(Gradient) 계산 및 학습 진행
loss.backward()
optimizer.step()
losses += loss.item()
corrects += torch.sum(preds == y).cpu().item()/x.size(0)


epoch_loss = losses / len(dataset)
epoch_acc = corrects / len(dataset)
print(f"Train Loss:{epoch_loss}, Accuracy: {epoch_acc}")

Image segmentation 모델 만드는 중인데 저기 y값은 cross_entropy니까 무조건 0 or 1만 받아야됨?

y가 지금 mask 이미지인데 one_hot 벡터로 변경해야되는거?


저대로 학습 시키니까 loss값이 계속 음수만 처나오고 정확도도 ㅈㄴ 이상하게 찍혀서 물어봄



class DiceLoss(nn.Module):

  def __init__(self, weight=None, size_average=True):
      super(DiceLoss, self).__init__()

  def forward(self, inputs, targets, smooth=1):
      inputs = F.softmax(inputs)      
     
      #flatten label and prediction tensors
      inputs = inputs.view(-1)
      targets = targets.view(-1)
     
      intersection = (inputs * targets).sum()                            
      dice = (2.*intersection + smooth)/(inputs.sum() + targets.sum() + smooth)  
     

      return 1 - dice