For Beginners

[딥러닝] 실험일지3 본문

2021 이전 자료들/AI

[딥러닝] 실험일지3

.log 2020. 1. 30. 14:47
728x90

Total training examples: 24127
Total validation examples: 0
Traceback (most recent call last):
  File "train_int.py", line 110, in 
    train(config)
  File "train_int.py", line 35, in train
    val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=config.val_batch_size, shuffle=True, num_workers=config.num_workers, pin_memory=True)
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/utils/data/dataloader.py", line 213, in __init__
    sampler = RandomSampler(dataset)
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/utils/data/sampler.py", line 94, in __init__
    "value, but got num_samples={}".format(self.num_samples))
ValueError: num_samples should be a positive integer value, but got num_samples=0

 

이런 에러를 발견했는데,

이게 내가 바꾼 데이터의 차원이 달라져서 그런것인지 아니면 인자의 개수가 안맞아서 validation 과정이 아예 진행이 안된건지를 모르겠어서 일단 데이터 인자 개수부터 체크했다

데이터 인자 개수가 크랙때문에 조금 다르게 저장된 것 같아서 일단은 수정을 해서 다시 돌려보아야겠다.

 

아 알고보니까 dataloader 에서 내가 일부 수정했던 코드가 있다는 것을 잊어버리고 그 코드 그대로 돌리다보니까 key 값이 잘못 넘어가서 그렇게 validation 이 아예 안되는 현상이 발생했던 것이다.

(저번에 아예 데이터 바꿔서 트레이닝 해보려다가 데이터 자체에 문제 있는거 발견하고 나중으로 미뤘던 것)

 

(aod) yejin@yejin:~/Desktop/PyTorch-Image-Dehazing-master$ python train_int.py
Total training examples: 24534
Total validation examples: 2722
Traceback (most recent call last):
  File "train_int.py", line 110, in 
    train(config)
  File "train_int.py", line 43, in train
    for iteration, (img_orig, img_haze) in enumerate(train_loader):
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/utils/data/dataloader.py", line 819, in __next__
    return self._process_data(data)
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/utils/data/dataloader.py", line 846, in _process_data
    data.reraise()
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/_utils.py", line 385, in reraise
    raise self.exc_type(msg)
RuntimeError: Caught RuntimeError in DataLoader worker process 0.
Original Traceback (most recent call last):
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/utils/data/_utils/worker.py", line 178, in _worker_loop
    data = fetcher.fetch(index)
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/utils/data/_utils/fetch.py", line 44, in fetch
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/utils/data/_utils/fetch.py", line 44, in 
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "/home/yejin/Desktop/PyTorch-Image-Dehazing-master/dataloader.py", line 101, in __getitem__
    return data_orig.permute(2,0,1), data_hazy.permute(2,0,1)
RuntimeError: number of dims don't match in permute

아 이제 드디어 우려했던 일이 벌어졌다.

디멘션 에러.

이제 validation set은 잘 들어가는데, 기존에 넣어주었던 데이터와 차이가 생겨서 벌어진 일이다.

 

이거는 어쩔 수 없었는데, 이거 코드 바꿔야한다.

아 바꾸는거를 두려워하면 안되는데 조금 겁나긴 하네..^^

일단은 permute 연산에 대해서 알아보자.

 

알아보니 pytorch에서 축을 바꿔주는 연산이라고 한다.

그래서 축을 바꿔주는데, 내가 아는 바로는 이게 차원에 의해서 생긴 에러니까

내가 차원을 하나 줄여서 이거를 바꿔주어야 한다.

(aod) yejin@yejin:~/Desktop/PyTorch-Image-Dehazing-master$ python train_int.py
Total training examples: 24549
Total validation examples: 2707
Traceback (most recent call last):
  File "train_int.py", line 110, in 
    train(config)
  File "train_int.py", line 43, in train
    for iteration, (img_orig, img_haze) in enumerate(train_loader):
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/utils/data/dataloader.py", line 819, in __next__
    return self._process_data(data)
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/utils/data/dataloader.py", line 846, in _process_data
    data.reraise()
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/_utils.py", line 385, in reraise
    raise self.exc_type(msg)
IndexError: Caught IndexError in DataLoader worker process 0.
Original Traceback (most recent call last):
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/utils/data/_utils/worker.py", line 178, in _worker_loop
    data = fetcher.fetch(index)
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/utils/data/_utils/fetch.py", line 44, in fetch
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/utils/data/_utils/fetch.py", line 44, in 
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "/home/yejin/Desktop/PyTorch-Image-Dehazing-master/dataloader.py", line 101, in __getitem__
    return data_orig.permute(2,1), data_hazy.permute(2,1)
IndexError: Dimension out of range (expected to be in range of [-2, 1], but got 2)

 

내가 permute에 대한 함수 이해를 잘 못해서 생긴 에러였다. 이게 2 0 1 이라는 것은 결국 b g r 뭐 이런식으로 텐서가 있으면 g r b이런식으로 바꾸어준다는 것을 말하는 것 같다.

그래서 나는 지금 가지고 잇는 텐서가 사실상 바꿔줄 필요가 없는 차원의 텐서이기 때문에 그냥 빼주어도 된다.

 

근데 빼니까 이제 이런 에러가 생겼다.

Total training examples: 24573
Total validation examples: 2683
Traceback (most recent call last):
  File "train_int.py", line 110, in 
    train(config)
  File "train_int.py", line 48, in train
    clean_image = dehaze_net(img_haze)
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/nn/modules/module.py", line 541, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/yejin/Desktop/PyTorch-Image-Dehazing-master/net.py", line 22, in forward
    x1 = self.relu(self.e_conv1(x))
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/nn/modules/module.py", line 541, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/nn/modules/conv.py", line 345, in forward
    return self.conv2d_forward(input, self.weight)
  File "/home/yejin/.local/lib/python3.5/site-packages/torch/nn/modules/conv.py", line 342, in conv2d_forward
    self.padding, self.dilation, self.groups)
RuntimeError: Expected 4-dimensional input for 4-dimensional weight 3 3 1 1, but got 3-dimensional input of size [8, 640, 480] instead

 

이거는 결국 네트워크 상에서 생기는 에러이다.

근데 이거를 어떻게 바꾸어야 제대로 바꿀 수 있을지를 조금 걱정해보아야할 상황인데 내가 보기에는 일단 차원을 바꾸어야 한다고 생각해서...

해결

torch 상에서 RGB 채널로 학습되는 형태를 grayscale로 바꾸어서 하는 사람들의 사례를 보아,

더보기

data_orig = (np.asarray(data_orig)/255.0) 
data_hazy = (np.asarray(data_hazy)/255.0) 

data_orig_img = np.stack((data_orig,)*3, axis=-1)
data_hazy_img = np.stack((data_hazy,)*3, axis=-1)

data_orig_img = torch.from_numpy(data_orig_img).float()
data_hazy_img = torch.from_numpy(data_hazy_img).float()

#return data_orig.permute(2,0,1), data_hazy.permute(2,0,1)
#return data_orig.permute(2,1), data_hazy.permute(2,1)
return data_orig_img.permute(2,0,1), data_hazy_img.permute(2,0,1)

뭐 이렇게 바꾸었다.

 

https://www.researchgate.net/post/How_To_use_gray_level_images_Ultrasound_in_CNN_as_they_have_1_channel_and_CNN_use_3_channels_RGB

 

https://stackoverflow.com/questions/40119743/convert-a-grayscale-image-to-a-3-channel-image

 

convert a grayscale image to a 3-channel image

I want to convert a gray-scale image with shape (height,width) to a 3 channels image with shape (height,width,nchannels). The work is done with a for-loop, but there must be a neat way. Here is a p...

stackoverflow.com

 

참고한 링크들은 다음과 같다.

 

뿌듯^^

이제 이거 끝나면 할거는 test 이미지들도 분리해서 두고 다시 합치면 어떤 결과 나오는지 확인하는 일이 남았다.

 

 

(aod) yejin@yejin:~/Desktop/PyTorch-Image-Dehazing-master$ python dehaze_int.py
(450, 600)
(450, 600, 3)
torch.Size([1, 3, 450, 600])
Traceback (most recent call last):
  File "dehaze_int.py", line 259, in 
    S = GetSaturation(path+image, I)
  File "dehaze_int.py", line 192, in GetSaturation
    min_rgb = cv2.min(cv2.min( fi[:, :, 0], fi[:, :, 1]), fi[:, :, 2])
IndexError: too many indices for array

 

reshaping 문제 때문에 머릿속에서 3차 4차 그리느라 머리가 터질것같다...

진짜 컴퓨터 업으로 하는 사람들 다 존경..

일단 기억 할려고 여기에 정리해둔다.

맨날 정리 귀찮아서 안하면 또 기억 하는데 한나절 걸려서 이렇게 적어놔야 좀 맘이 편하다.

Comments