안녕하세요. 비버입니다!
오늘은 Pytorch(파이토치) 독학을 위해 MNIST 데이터를 실습해볼 예정이었어요. MNIST란 손글씨 이미지 분류를 실습해볼 수 있도록 제공되고 있는 공개 데이터셋을 말해요. Iris(아이리스), Titanic(타이타닉) 처럼 연습용으로 널리 쓰이는 유명한 데이터셋이랍니다.
어김없이 시작과 함께 오류를 만났는데, 한 번 자세히 뜯어보고 싶단 생각에 글로 정리하게 되었습니다! ㅎㅎ
UserWarning: The given NumPy array is not writeable, and PyTorch does not support non-writeable tensors. This means you can write to the underlying (supposedly non-writeable) NumPy array using the tensor. You may want to copy the array to protect its data or make it writeable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at /pytorch/torch/csrc/utils/tensor_numpy.cpp:141.) return torch.from_numpy(parsed.astype(m[2], copy=False)).view(*s) |
내가 예상하지 않은 출력이 뜨면 일단 살짝 당황스럽기 마련이죠. 다행히 해당 문구는 'UserWarning' 이라는 단어로 시작하고 있어요. 제가 앞서 오류를 만났다고 표현했는데 사실 오류는 아니고, 경고였던 거죠. 무시하고 넘어가도 코드 실행에는 문제가 되지 않겠으나, 사실 꺼림칙하잖아요. 뭘 경고하려고 하는 건지, 내가 혹시 코드에 실수한 거라도 있는 건지.
그래서 왜 이 경고문구가 뜨는지 알아보기로 했답니다.
참고로 위 경고문구는 아래 코드를 실행했을 때 발생했어요.
# MNIST 실습을 위해 파이토치로 데이터셋을 편리하게 다운로드 해오는 코드
mnist_train = dsets.MNIST(root='MNIST_data/',
train=True,
transform=transforms.ToTensor(),
download=True)
mnist_test = dsets.MNIST(root='MNIST_data/',
train=False,
transform=transforms.ToTensor(),
download=True)
자, 그럼 경고문구를 찬찬히 하나씩 뜯어볼까요?
우선 영어로 되어 있는 경고문구를 앞부분부터 일부 직역하면,
주어진 Numpy array(Numpy 배열)는 쓰기 불가 상태입니다. 그리고 Pytorch(파이토치)는 쓰기불가(non-writeable) 상태인 텐서들은 지원하지 않습니다. 즉, 당신은 텐서를 이용하여 underlying Numpy array에 쓰기가 가능합니다. 데이터를 보호하거나 그것을 쓰기 상태로 변경하고 싶다면 array를 텐서로 변환하기 전에 그 데이터를 복사해서 이용하세요.
아하, 감이 잡히네요. 그러니까 제가 다운로드 받은 MNIST 데이터는 현재 '쓰기 불가' 상태라는 거예요. 쓰기불가 상태가 뭔지 정확히는 모르겠지만 말 그대로 직접적인 수정이 불가한 어떤 상태라는 거겠죠. 그리고 이 쓰기불가 상태인 넘파이 배열은 파이토치가 지원하지 않는대요. (참고로 저는 파이토치 1.7.0 버전을 이용하고 있습니다.)
왜?라는 생각이 드는 순간 바로 설명이 이어지네요. '데이터를 보호하거나' 아- 그렇죠. 원본 데이터를 직접 수정하면 나중에 '앗 잘못 수정했네 다시 되돌리고 싶어 ㅠ' 하는 상황이 발생해도 원본 데이터로 쉽게 되돌릴 수 없겠죠. 그러니까 원본 데이터는 직접 수정이 불가한 상태로 해두고 원본 데이터를 하나 복사해서 복사한 데이터를 이용해 이것저것 하는 게 안전하다는 거예요.
아하 아하! 이제 왜 이런 경고문구를 띄웠는지 알 것 같네요. 경고문구의 내용이 영 신경 쓰인다면 데이터의 복사본을 만들어 사용하고, '귀찮다! 원본 데이터는 다시 다운받으면 된다!' 하면 그냥 사용하고 그렇게 하면 되겠네요.
경고문구는 오류가 아니기 때문에 무시하고 넘어가도 되지만 가끔 이렇게 얘네가 어떤 내용을 말하고자 하는지 유심히 살펴보는 것도 앞으로의 공부에 많은 도움이 될 것 같습니다!
그럼! 비버였습니다! :D
# 참고, 파이토치 버전을 확인하는 코드
import torch
print(torch.__version__)
'ML&DL > Pytorch' 카테고리의 다른 글
[파이토치] 머신러닝 Pytorch 모델의 성능을 극대화하는 7가지 팁! (3) | 2021.02.26 |
---|