본문 바로가기

반응형

연구/pytorch

(24)
[model 저장] 훈련중인/훈련이 완료된 모델 저장하기 실험을 하다보면 훈련이 완료되거나 훈련중인 모델을 저장해야할 일이 생긴다. 아래는 모델을 저장하는 예시코드이다. res20 = ResNet(20) res20.to("cuda:0") train_net(res20,trainloader, testloader, n_iter=80 ,device="cuda:0", lr=0.1, train_err=res20.train_err, val_err=res20.test_err) # res20 저장 torch.save(res20,'./model_res20') 아래는 저장한 모델을 불러오는 코드이다. 모델을 불러오면 바로 그 상태에서 training을 계속할 수 도 있고 평가할 수 도 있으며, 모델에 구현되어 있는 기능을 자유롭게 사용할 수 도 있다. model = my_resn..
[Error] TypeError: conv2d(): argument 'input' (position 1) must be Tensor, not NoneType TypeError: conv2d(): argument 'input' (position 1) must be Tensor, not NoneType 원인 : nn.Conv2d()에 input type으로 Tensor type이 들어가야 하는데 NoneType이 들어가고 있다는 말이다. 왜 NoneType이 들어가고 있는지 코드에서 확인해보아야 한다. self.layer2의 정의를 살펴보니 ResidualBlock 클래스의 내부를 보아야 했다. ResidualBlock class의 forward이다. 문제를 확인할 수 있겠는가? forward()의 return 을 설정해두지 않아서 NoneType 에러가 발생한 것이다. 해결법 : forward()에 return을 달아두자...
[error] RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same RuntimeError: Input type(torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same 원인 : 에러명에서도 알 수 있듯이 하나는 input type과 weight type이 동시에 cuda이어야 하는데 그게 아니라서 그렇다. 다시 말해 input type(x,y)는 cuda를 먹였는데 weight type(신경망)은 cuda를 먹이지 않아서 생기는 에러. 즉 x = x.to("cuda:0") y = y.to("cuda:0") 를 했지만 net.to("cuda:0") 를 하지 않아서 그렇다. 해결책 : net.to("cuda:0") 를 넣으면 된다.
[tensor] tensor.size() 에 관하여 tensor.size()했을 때 나오는 각 숫자들의 의미에 대해서 알아보자. 이미지 데이터를 batch단위로 묶어서 학습한다고 생각해보자. net에 들어가기 전에 tensor의 형태를 출력하면 다음과 같이 나온다. torch.Size([128, 1, 28, 28]) 이 때 각각의 숫자가 의미하는게 무엇인지 살펴보자. 128 : mini-batch size(데이터 한 묶음당 들어있는 데이터쌍(x-y) 개수) 1 : channel size 28 : img size 28 : img size 이 데이터묶음을 net에 넣고 연산하여 Convolution layer를 모두 거치고 나오면 다음과 같은 형태로 바뀐다. torch.Size([128, 64, 4, 4]) 당연히 batch size 는 변하지 않는다. en..
[Error 기록] RuntimeError: Found 0 files in subfolders of: oxford-102/jpg/Supported extensions are: .jpg,.jpeg,.png,.ppm,.bmp,.pgm,.tif,.tiff,.webp RuntimeError: Found 0 files in subfolders of: oxford-102/jpg/ Supported extensions are: .jpg,.jpeg,.png,.ppm,.bmp,.pgm,.tif,.tiff,.webp 이 에러는 해당 subfolders안에 .jpg,.jpeg,.png,.ppm,.bmp,.pgm,.tif,.tiff,.webp 같은 형식의 파일이 없다는 의미인데, 쉽게 말해서 데이터를 처리하라는 명령어를 줘놓고서는 데이터를 주지 않았다는 에러이다. 이런 에러는 주로 데이터전처리 과정에서 에러가 난다. 아래는 해당 에러가 발생한 부분이다. 해결법 : 해당 subfolder에 데이터를 잘 갖다놔주면 된다.
[Error 기록] RuntimeError: CUDA out of memory. Tried to allocate 2.39 GiB (GPU 0; 10.92 GiB total capacity; 4.87 GiB already allocated; 2.05 GiB free; 7.54 GiB reserved in total by PyTorch) 원인 : GPU가 한번에 감당하는 연산이 너무 많아서? 인것같다 해결책(from stack overflow) : batch사이즈를 줄이면 해결이 된다고 한다. 특히 나는 eval_net에서 문제가 생긴다. eval에서 마지막에 한번에 ypreds를 다루는 부분에서 문제가 생기는데, 이 부분은 batch단위로 데이터를 다루는게 아니라 test데이터를 모두 한꺼번에 처리하는데 이 때 GPU가 감당할 수 있는 양을 넘은 것으로 보인다. 위 코드의 ypreds부분에 에러가 생긴다. ypreds.append(y_preds)로 데이터를 모아둔 후 torch.cat으로 한번에 처리하기엔 GPU가 감당할 수 있는 데이터용량을 넘긴것 같다.
[transfer learning] 전이학습할 때 신경 쓸 부분 전이학습할 때 신경쓸 부분은 파라미터 업데이트할 부분과 업데이트하지 않을 부분을 지정하는 것이다. 신경써줄 부분은 크게 두 부분이다. 1. Network 설계할 때 2. 학습할 때 1. network 설계할 때 : 아래는 ResNet에서 FC만 파라미터 업데이트를 원할 때의 소스코드이다. net = models.resnet18(pretrained=True) # 모든 파라미터를 미분대상에서 제외 for p in net.parameters(): p.requires_grad = False fc_input_dim = net.fc.in_features net.fc = nn.Linear(fc_input_dim,2) 2. 학습할 때 아래 코드에서는 fc만 업데이트를 원하기 때문에 아래처럼 optimizer를 통해서 ..
[Error 기록] RuntimeError: Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the same h = net(xx) 에서 에러가 났었다. 에러내용은 글의 제목과 같다. xx의 타입과 net의 weight타입이 다르다는건데 한참 헤매다가 코드실수라는걸 알았다. xx=xx.to(device) yy=yy.to(device) 처럼 써서 xx,yy를 GPU를 사용하게끔했어야 하는데 위의 사진처럼 써버려서 input은 cpu, network는 gpu를 쓰라고 명령했던 것이다.

반응형