디버깅 버그에서 자신을 향상시켜 디버깅에 막막한 모든 친구들에게 선물한다
1.타입변환 필요:RuntimeError:Found dtype Long but expected Float
즉 dtype은 Long이지만 Float을 기대한다는 것
RuntimeError: Found dtype Long but expected Float
얻은 loss 값을 유형 변환합니다
해결 방법: loss = torch.tensor(loss, dtype=float)
또는 loss가 들어오기 전에 유형을 바꾸면 loss 값도 그에 따라 바뀌는 유형일 수 있습니다
loss = criterion(outputs.float(), labels.float())
2. requires_grad_() 설정 필요, RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
이것은 requires_grad_()를 true로 설정하지 않았기 때문이며, L=LOSS(out, label)의 L은 기본적으로 requires_grad_()를 false로 하고, 이 L 역시 텐서 Tensor 타입으로 requires_grad_()를 true로 변경한 후 backward 함수를 사용하여 requires_grad_()를 true로 하는 모든 파라미터의 기울기를 얻을 수 있습니다
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
해결 방법: loss = criterion(outputs, labels); loss.requires_grad_()
또는 loss = torch.tensor(loss, dtype=float, requires_grad=True)로 이 문제를 해결할 수 있다
주의:
loss.requires_grad(required_grad=True) 이렇게 하면 안 됩니다. loss.requires_grad는 부울 값이기 때문에 오류를 보고할 수 있습니다
loss.requires_grad(required_grad=True)
다음. 그다음.
loss.requires_grad=True 또한 잘못 보고될 수 있으며, 이는 잎 변수의 requires_grad 로고가 수정되지 않았음을 의미합니다
RuntimeError: you can only change requires_grad flags of leaf variables.
3. Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the same
torch를 실행하는 중에 이 오류가 발생했습니다.오류 내용은 대략 입력 유형이 CPU(torch.FloatTensor)이고 매개변수 유형이 GPU(torch.cuda.FloatTensor)임을 의미합니다.
우선 CUDA를 제대로 사용했는지 먼저 확인 부탁드립니다.
보통 우리는 이렇게 CUDA를 사용하도록 지정한다:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
inputs.to(device)
이렇게 하여 input이라는 텐서를 CUDA 유형으로 변환합니다.하지만 우리는 여전히 실수를 합니다.바로 본 블로그의 제목을 출력하는 것입니다.
올바른 방법은 다음과 같습니다
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
inputs = inputs.to(device)
원인:
tensor.to() 이 함수는 원래 데이터를 변경하지 않고 새로운 텐서를 생성합니다.
하지만, 눈치를 채고
Module.to()은 "in-place" 메서드이지만 tensor.to() 함수는 그렇지 않습니다.
우정 힌트:
파이토치에서는 'in-place'인지 아닌지를 주의한다.
4. AttributeError: 'list' object has no attribute 'mean' 문제 해결
np.mean(arrlist,axis=1)
5.Cannot cast ufunc subtract output from dtype(‘float64’) to dtype(‘int64’) with casting rule ‘same_kind’
Problem:
You are trying to do a simple arithmetic operation on a NumPy array but you see an error message like
TypeError: Cannot cast ufunc subtract output from dtype('float64') to dtype('int64') with casting rule 'same_kind'
Solution:
You are trying to substract a float from an int64 array. This does not work with operators like += or -=
Example
import numpy as np
data = np.asarray([1, 2, 3, 4], dtype=np.int64) # This is an int array!
print(data - 5) # This works
print(data - 5.0) # This works as well
# This raises: Cannot cast ufunc subtract output from dtype('float64') to dtype('int64') with casting rule 'same_kind'
data -= 5.0
Option 1 (preferred):
Use - instead of -=: Instead of data -= 5.0 use data = data - 5.0
Option 2:
Explicitly cast data to float (or the first dtype of your error message):
data = data.astype('float64')
# Now this works
data -= 5.0
This option is not preferred since doing it requires using the correct datatype. The first option works without regarding the actual datatype.
6.TypeError: can't convert np.ndarray of type numpy.uint16.
솔루션:
label = label/1.0
7.RuntimeError: CUDA error: out of memory
인터넷에도 다른 문제 해결방안이 있지만 내 문제는 해결하지 못했다
net.to(device=device)
내 문제의 원인은 내 신경망을 테스트할 때 위의 오류가 발생했는데, 그 이유는 신경망을 정의할 때 네트워크 매개변수를 로드하기 전에 신경망을 GPU에 배치해야 하기 때문에 네트워크를 정의한 후에는 GPU에 네트워크를 배치해야 하기 때문입니다.문제 해결!
8.TypeError: only integer scalar arrays can be converted to a scalar index
이 문제가 발생하는 원인은 어레이를 제대로 처리하지 못하기 때문이다
height = np_mask.size(0)
width = np_mask.size(1)
# 위의 코드를 아래 코드로 변환합니다.
height = np.shape(np_mask)[0]
width = np.shape(np_mask)[1]
9. 오류: UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 1022-1023: unexpected end of data
프로젝트안에 debug가 남겼던 .idea 와 __pycache__폴더가 들어있으니 이 두폴더를 삭제하고 다시 프로젝트로 가져오면 좋겠다.
10. 오류: RuntimeError: Error(s) in loading state_dict for MultiScale Guide: Missing key(s) in state_dict
checkpoint_file = os.path.join(args.checkpoint, args.test+'.pth.tar')
checkpoint = torch.load(checkpoint_file)
model.load_state_dict(checkpoint['state_dict'])
위에 에러가 난 코드인데 해결방법은 마지막 줄의 괄호 안에 False를 더하면 다음과 같습니다
checkpoint_file = os.path.join(args.checkpoint, args.test+'.pth.tar')
checkpoint = torch.load(checkpoint_file)
model.load_state_dict(checkpoint['state_dict'],False) #수정처
model.load_state_dict(state_dict, strict=True)
Copies parameters and buffers from :attr:state_dict into this module and its descendants. If :attr:strict is True, then the keys of :attr:state_dict must exactly match the keys returned by this module’s :meth:~torch.nn.Module.state_dict function
속성 state_dict에서 이 모듈과 그 자손으로 매개변수를 복사합니다.strict가 True이면 state_dict의 keys는 이 모듈의 메서드가 반환하는 keys와 완전히 일치해야 한다.False의 경우 매칭 보장이 필요하지 않습니다.
Arguments:
state_dict (dict): a dict containing parameters and persistent buffers.
strict (bool, optional): whether to strictly enforce that the keys in :attr:state_dict match the keys returned by this module’s:meth:~torch.nn.Module.state_dict function. Default: True
11.RuntimeError: DataLoader worker (pid 27597) is killed by signal: Terminated.
솔루션: num_workers를 작은 값으로 설정하면 됩니다
'개발 꿀팁 > PYTHON' 카테고리의 다른 글
파이썬 환경 구축 (0) | 2022.11.29 |
---|---|
파이썬 상대 경로 (0) | 2022.11.28 |
Python 파일 이름에서 숫자 읽기 (0) | 2022.11.28 |
Python에서 logging 기본 용법 (0) | 2022.11.28 |
Python 폴더 이동 (0) | 2022.11.28 |