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
nn.celoss는 이미 안에 softmax내장되있으니 그냥 모델 아웃풋 그대로넣어.document 꼭 읽어보고 그리고 로스텀이 두개인거같은데 모델에 softmax가 빠지니까 diceloss엔 softmax가있는지도 체크하고 - dc App
너말대로 모델 아웃풋 그냥 넣어봤는데 로스값이 음수가 튀어나오는데 괜찮은거임?
prediction값 아웃풋 채널이 3이고 타겟 mask 이미지도 3채널로 줬는데 이렇게 하는게 맞는거임?
batch 1로 넣고 celoss랑 diceloss 직접 뿌려봐 모델 forward쪽에 쓸데없는거 있는지 다시확인하고 - dc App
아 줄내림 안되네 diceloss에서 softmax 차원을 어디로 맞춰줘야됨? 채널로 맞춰줘야되나?
softmax는 당연히 아웃풋 차원만큼. - dc App
너말대로 다 해봤는데 loss가 음수 나오는건 똑같네 ㅅㅍ... Train Loss:-6.21119325615167, Accuracy: 9.896091044037604e-05 Validation Loss:-6.478252474188805, Accuracy: 0.0 추론값은 정확도가 아예 안찍힘
https://www.kaggle.com/code/sungjunghwan/loss-function-of-image-segmentation
위코드로
해봐