https://stackoverflow.com/questions/59013109/runtimeerror-input-type-torch-floattensor-and-weight-type-torch-cuda-floatte
input, label, model 중 일부를 cuda에 올리지 않았을 때, device가 달라서 생기는 문제
use_cuda = torch.cuda.is_available()
device = torch.device("cuda" if use_cuda else "cpu")
model.to(device)
for iter, (img, label) in enumerate(qd_train_dataloader):
optimizer.zero_grad()
img = img.to(device)
label = label.to(device)
...
로 해결
Returns an iterator over module parameters, yielding both the name of the parameter as well as the parameter itself.
--> 그 자체로 generator, 이름과 매개 변수 자체인 이름(name)과 파라미터(param)를 반환
출처: https://comlini8-8.tistory.com/50 [컴린이 탈출기 ver 2.0 ٩( ᐛ )و]
출처: https://pytorch.org/docs/stable/generated/torch.nn.Module.html
for name, layer in model_finetune.named_parameters():
print("=" * 40)
print("%-20s ==> Train : %s" % (name, layer.requires_grad))
# ========================================
# features.0.weight ==> Train : False
# ========================================
# features.0.bias ==> Train : False
# ========================================
# features.3.weight ==> Train : False
# ========================================
# features.3.bias ==> Train : False
# ========================================
# ...
iter
: 객체의 iter 메서드를 호출
next
: 객체의 next 메서드를 호출
>>> it = iter(range(3))
>>> next(it)
0
>>> next(it)
1
>>> next(it)
2
>>> next(it)
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
next(it)
StopIteration
반복 가능한 객체에서 __iter__를 호출하고 이터레이터에서 __next__ 메서드를 호출한 것과 같다
즉, iter는 반복 가능한 객체에서 이터레이터를 반환하고, next는 이터레이터에서 값을 차례대로 꺼낸다
이를 dataset에 적용하면 첫번째 data를 가져올 수 있음
img, label = next(iter(qd_train_dataset))
>>> img.shape
torch.Size([3, 224, 224])
>>> type(img)
torch.Tensor
cv2는 (height, width, channel) 순서로 이미지를 처리하지만, torch의 conv2d layer의 경우 (batch, channel, height, width) 순서의 tensor를 입력받는다
따라서, permute() 같은 함수를 통해 channel 순서를 바꿔주거나, torch.squeeze(), torch.unsqueeze(), np.newaxis()등을 dummy batch dimension을 생성/제거해주는 경우도 많이 존재
>>> type(img)
torch.Tensor
# channel을 마지막으로 보냄
visualized_img = img.permute(1, 2, 0)
# TO DO (2-1) ends here
plt.imshow(visualized_img)
plt.show()
the output value of the layer with input size and output
https://greeksharifa.github.io/references/2019/02/12/argparse-usage/
SystemExit: 2
/Users/username/lib/python3.6/site-packages/IPython/core/interactiveshell.py:2971: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
Jupyter notebook에서는 argparse 사용 불가 --> easydict를 사용!
출처: https://worthpreading.tistory.com/56 [Worth spreading]
혹시 ImportError: libGL.so.1: cannot open shared object file: No such file or directory
에러가 뜬다면 위의 링크에서 처럼
$ sudo apt-get install libgl1-mesa-glx
를 실행
Train Epoch: [39/40] Step: [400/844] G loss: 5.83592 D loss: 0.00269
Train Epoch: [39/40] Step: [500/844] G loss: 7.50872 D loss: 0.00075
Train Epoch: [39/40] Step: [600/844] G loss: 4.62987 D loss: 0.00537
Train Epoch: [39/40] Step: [700/844] G loss: 4.29126 D loss: 0.00728
Train Epoch: [39/40] Step: [800/844] G loss: 4.29845 D loss: 0.01423
D loss가 좀 줄긴 했는데 그래도 구분은 안됨
data[:, :, 0]
로 첫번째 채널만 input으로 넣어서 학습시킴module.named_parameters(), module.parameters()로 return된 parameter의 총 갯수는 parameter.numel()
로 확인 가능
for _, param in module.named_parameters():
param_size = param.numel()
print(param.size(), param_size)
# Number of parameters in customed-VGG11: 9229575