Pytorch CIFAR10 download 후에 사용하면 왜 멈출까요?

질문을 하실 때에는 다음 내용들을 포함해주시면 함께 디버깅 하는 데 도움이 됩니다.

  • 어떻게 동작하도록 하고 싶은지에 대한 설명
  • 겪고 있는 문제에 대한 상세한 설명 (에러의 경우 에러 메시지 포함)
  • Python, PyTorch 및 기타 주요 라이브러리의 버전 등을 포함한 환경 설명

파이토치 튜토리얼을 공부 중인데, 환경은 spyder입니다.

import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

batch_size = 4
trainset = torchvision.datasets.CIFAR10(root=‘./data’, train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size,
shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root=‘./data’, train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size,
shuffle=False, num_workers=2)
classes = (‘plane’, ‘car’, ‘bird’, ‘cat’,
‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, ‘truck’)

def imshow(img):
img = img / 2 + 0.5 # unnormalize
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
plt.show()

dataiter = iter(trainloader)
images, labels = dataiter.next()
imshow(torchvision.utils.make_grid(images))
print(’ ‘.join(f’{classes[labels[j]]:5s}’ for j in range(batch_size)))

class Net(nn.Module):
def init(self):
super().init()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)

def forward(self, x):
    x = self.pool(F.relu(self.conv1(x)))
    x = self.pool(F.relu(self.conv2(x)))
    x = torch.flatten(x, 1) 
    x = F.relu(self.fc1(x))
    x = F.relu(self.fc2(x))
    x = self.fc3(x)
    return x

net = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
for epoch in range(2):
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 2000 == 1999: # print every 2000 mini-batches
print(f’[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')
running_loss = 0.0
print(‘Finished Training’)

파이토치 튜토리얼에 있는 “분류기 학습하기” 내용따리 여기까지 작성하고 그냥 실행했을 때는 잘 학습합니다. – 작성한 파일을 저장하지 않은 untitled 일 때입니다.
근데, 이 파일을 저장하고 실행해보면,
Files already downloaded and verified
Files already downloaded and verified
여기서 더 진행되지도 않고, 정지도 안되서 console 창을 새로 켜야 합니다…
이유와 해결책을 알 수 있을까요…?

안녕하세요! 문제를 이미 해결하셨나요?
혹시 다시 실행하실 때는 데이터셋을 다운로드 받는 download=True 옵션을 False로 설정해보시는건 어떨까요?

batch_size = 4
trainset = torchvision.datasets.CIFAR10(root=‘./data’, train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size,
shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root=‘./data’, train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size,
shuffle=False, num_workers=2)

실행시 나온다는 메세지대로라면 ./data 폴더에 이미 CIFAR10 데이터셋이 있는 것으로 보입니다.
멈추는 이유까지는 잘 모르겠으나, download 옵션 변경하여 실행해보시고 결과를 알려주시면 좋겠네요.

좋아요 1

앗… 질문 올려놓고 정신없었어서 깜빡하고 지금봤네요… ㅠㅠ
문제는 해결했습니다.
trainset = torchvision.datasets.CIFAR10(root=‘./data’, train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size,
shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root=‘./data’, train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size,
shuffle=False, num_workers=2)

여기에 num_workers=0으로 둘 다 바꿔주느 already downloaded 뜨고도 잘 진행되더라고요…ㅎㅎ
다른 코드에서도 파이토치 따라서 num_workers를 올리면 2나 4로 올리면 안되드라고요…? 왜지…
num_workers는 작업에 참여하는 cpu코어 수 아닌가요?-- 0이면 메인프로세스, 0이상이면 멀티 프로세스(여러 코어 참여로…)
아직도 왜 멀티프로세싱에서는 안되는지 모르겠어요… ㅠㅠ

좋아요 1