criterion = nn.BCEWithLogitsLoss()
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)
x = x.requires_grad_(True)
x = x.requires_grad_(True)
optimizer.zero_grad()
outputs = model(x)
#_, preds = torch.max(outputs, 1)
preds = torch.sigmoid(outputs)
preds = (preds>0.5).float()
loss = criterion(preds, y)
# 역전파를 통해 기울기(Gradient) 계산 및 학습 진행
loss.backward()
optimizer.step()
losses += loss.item()
corrects += torch.sum(preds == y).cpu().item()/x.size(0)
print(torch.sum(preds == y))
epoch_loss = losses / len(dataset)
epoch_acc = corrects / len(dataset)
print(f"Train Loss:{epoch_loss}, Accuracy: {epoch_acc}")
else:
model.eval()
with torch.no_grad():
for i, (x, y) in enumerate(dataloader):
x = x.to(device)
y = y.to(device)
outputs = model(x)
preds = torch.sigmoid(outputs)
preds = (preds>0.5).float()
loss = criterion(preds, y)
losses += loss.item()
corrects += torch.sum(preds == y).cpu().item()/x.size(0)
epoch_loss = losses / len(dataset)
epoch_acc = corrects / len(dataset) * 100
print(f"Validation Loss:{epoch_loss}, Accuracy: {epoch_acc}")
이거 계속해서 accuracy가 0만 찍히는데 뭐가 잘못된건지 모르겠음 loss도 이상하게 엄청 작은 값만 첨부터 출력되는데 어디가 잘못된 건지 알려주세요 ㅜㅜ
아 글이 짤렸네 우선 저 위 코드는 image segmentation 하는 코든데 어디부터 건드려야 될지 모르겠네요..
sigmoid 빼봐 bcewith logit 내부에서 sigmoid 적용됨 sigmoid(logit) = probability 임
뺏는데 똑같네요
segmentation 하는거면 한번 loss에 픽셀 개수 곱해보셈
Pred>0.5 저거 쓰레시홀딩아님? 논 디퍼런셔블할듯. 저 줄 백프롭 다음으로옮겨봐
x.requires_grad_(True) 이건 왜있냐?? 둘 다 빼셈
press > 0.5는 boolean 되잖아 [True False True] 이따구로 됨 거기다 float 씌워봤자 [1 0 1] 이런값으로 밖에 안됨... Train의 그줄은 지워라
어캐할지 몰라서 유튜브 참조해서 코딩 짰는데 순 돌팔이였구만... ㄳㄳ