모델 평가 부분 질문드립니다. - 인프런
[사진]-, predicted = torch.max(outputs.data, 1)앞에 -, 이부분 코드가 무슨 의미인가요?빨간색 표시한 부분 혹시 자세하게 코드 해설 가능할까요? - 질문 & 답변 | 인프런
www.inflearn.com

outputs의 크기가 (배치 크기)x(클래스의 개수) 인데,
열이 하나의 이미지에 대응되는 벡터(하나의 Batch에 대응)를 나타낸다고 볼 수 있다.
따라서 행(0), 열(1) 중 열을 기준으로 최댓값을 뽑아 예측값을 하나 만드는 것이다.
dim=1 Parameter로 설정하면 각 Batch에 해당하는 Classification Task의 Class별 확률로 해석할 수 있다.
예를 들어서 배치 크기가 2이고 클래스가 3개인 outputs가 있다고 생각해보자.
outputs = [[0.1, 0.4, 0.5], [0.2, 0.6, 0,2]]
여기서 최댓값의 위치는 2번째(0.5)와 1번째(0.6) 이다.
즉, 첫번째 이미지는 2라고 예측하는 것이고 두번째 이미지는 1이라고 예측을 하게 됩니다.
이를 torch.max를 이용하여 나타낼 수 있다.

torch.max는 최댓값과 최댓값의 위치를 산출해주는데
여기서 우리는 최댓값은 필요가 없으므로 받지 않아도 된다.
따라서 _ (언더바)로 처리하여 해당 출력값은 저장하지 않는다.
즉, _, predicted는 최댓값의 위치만 predicted에 저장하겠다는 의미입니다.
- torch.max( ) 사용 예시
>>> a = torch.randn(4, 4)
>>> a
tensor([[-1.2360, -0.2942, -0.1222, 0.8475],
[ 1.1949, -1.1127, -2.2379, -0.6702],
[ 1.5717, -0.9207, 0.1297, -1.8768],
[-0.6172, 1.0036, -0.6060, -0.2432]])
>>> torch.max(a, 1)
torch.return_types.max(values=tensor([0.8475, 1.1949, 1.5717, 1.0036]), indices=tensor([3, 0, 0, 1]))
따라서 _, predicted = torch.max(outputs.data, 1)의 의미는
각 열(1)마다 최댓값의 위치를 예측값으로 사용하겠다는 의미이다.
마지막으로 .data는 예측값을 계산할 때는 역전파 계산이 필요없기 때문에 데이터만 사용한다는 의미에서 사용된 것인데
with torch.no_grad()를 사용했기 때문에 .data를 없애도 크게 문제는 되지 않는다.
# 훈련 및 검증 함수 정의
def train(model, train_loader, optimizer, criterion, alpha=1.0):
model.train()
train_loss = 0.0
correct = 0
total = 0
for images, labels in train_loader:
images, labels = images.to(device), labels.to(device)
images, labels_a, labels_b, lam = mixup_data(images, labels, alpha)
optimizer.zero_grad()
outputs = model(images)
loss = mixup_criterion(criterion, outputs, labels_a, labels_b, lam)
train_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
loss.backward()
optimizer.step()
train_loss /= total
train_accuracy = 100 * correct / total
return train_loss, train_accuracy
def validate(model, val_loader, criterion):
model.eval()
val_loss = 0.0
correct = 0
total = 0
with torch.no_grad():
for images, labels in val_loader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
loss = criterion(outputs, labels)
val_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
val_loss /= total
val_accuracy = 100 * correct / total
return val_loss, val_accuracy
def test(model, test_loader):
model.eval()
correct = 0
total = 0
with torch.no_grad():
for images, labels in test_loader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
return 100 * correct / total
모델 평가 부분 질문드립니다. - 인프런
[사진]-, predicted = torch.max(outputs.data, 1)앞에 -, 이부분 코드가 무슨 의미인가요?빨간색 표시한 부분 혹시 자세하게 코드 해설 가능할까요? - 질문 & 답변 | 인프런
www.inflearn.com

outputs의 크기가 (배치 크기)x(클래스의 개수) 인데,
열이 하나의 이미지에 대응되는 벡터(하나의 Batch에 대응)를 나타낸다고 볼 수 있다.
따라서 행(0), 열(1) 중 열을 기준으로 최댓값을 뽑아 예측값을 하나 만드는 것이다.
dim=1 Parameter로 설정하면 각 Batch에 해당하는 Classification Task의 Class별 확률로 해석할 수 있다.
예를 들어서 배치 크기가 2이고 클래스가 3개인 outputs가 있다고 생각해보자.
outputs = [[0.1, 0.4, 0.5], [0.2, 0.6, 0,2]]
여기서 최댓값의 위치는 2번째(0.5)와 1번째(0.6) 이다.
즉, 첫번째 이미지는 2라고 예측하는 것이고 두번째 이미지는 1이라고 예측을 하게 됩니다.
이를 torch.max를 이용하여 나타낼 수 있다.

torch.max는 최댓값과 최댓값의 위치를 산출해주는데
여기서 우리는 최댓값은 필요가 없으므로 받지 않아도 된다.
따라서 _ (언더바)로 처리하여 해당 출력값은 저장하지 않는다.
즉, _, predicted는 최댓값의 위치만 predicted에 저장하겠다는 의미입니다.
- torch.max( ) 사용 예시
>>> a = torch.randn(4, 4)
>>> a
tensor([[-1.2360, -0.2942, -0.1222, 0.8475],
[ 1.1949, -1.1127, -2.2379, -0.6702],
[ 1.5717, -0.9207, 0.1297, -1.8768],
[-0.6172, 1.0036, -0.6060, -0.2432]])
>>> torch.max(a, 1)
torch.return_types.max(values=tensor([0.8475, 1.1949, 1.5717, 1.0036]), indices=tensor([3, 0, 0, 1]))
따라서 _, predicted = torch.max(outputs.data, 1)의 의미는
각 열(1)마다 최댓값의 위치를 예측값으로 사용하겠다는 의미이다.
마지막으로 .data는 예측값을 계산할 때는 역전파 계산이 필요없기 때문에 데이터만 사용한다는 의미에서 사용된 것인데
with torch.no_grad()를 사용했기 때문에 .data를 없애도 크게 문제는 되지 않는다.
# 훈련 및 검증 함수 정의
def train(model, train_loader, optimizer, criterion, alpha=1.0):
model.train()
train_loss = 0.0
correct = 0
total = 0
for images, labels in train_loader:
images, labels = images.to(device), labels.to(device)
images, labels_a, labels_b, lam = mixup_data(images, labels, alpha)
optimizer.zero_grad()
outputs = model(images)
loss = mixup_criterion(criterion, outputs, labels_a, labels_b, lam)
train_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
loss.backward()
optimizer.step()
train_loss /= total
train_accuracy = 100 * correct / total
return train_loss, train_accuracy
def validate(model, val_loader, criterion):
model.eval()
val_loss = 0.0
correct = 0
total = 0
with torch.no_grad():
for images, labels in val_loader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
loss = criterion(outputs, labels)
val_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
val_loss /= total
val_accuracy = 100 * correct / total
return val_loss, val_accuracy
def test(model, test_loader):
model.eval()
correct = 0
total = 0
with torch.no_grad():
for images, labels in test_loader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
return 100 * correct / total