실제로 CNN 네트워크를 구현하다보면 3차원 데이터를 다루는 것이 아닌 4차원 데이터를 다루게 된다.

 

이론만 접한 사람들에게는 '응? 이게 무슨 의미야' 라고 생각될 수 있다.

 

하지만 실제로 네트워크는 효율적으로 계산하기 위해서 4차원 데이터를 기반으로 CNN 네트워크를 동작시킨다.

torch.size([batch size, channel, height, width])

 

배치 사이즈가 맨 앞단에 존재하고, 그 뒤에 채널의 깊이를 의미하는 텐서를 다루게 된다.

 

이렇게 복잡해 보이는 4차원 데이터를 im2col이라는 함수를 적용하여 단순하게 계산할 수 있도록 한다.

 

우선 아래와 같은 간단한 예제를 들어 설명하겠다.

 

3차원 입력데이터를 필터링하기 좋게 전개하게 되는데, 구체적으로는 입력 데이터에서 필터를 적용하는 영역을 한 줄로 늘어놓게 된다.

 

이 전개를 필터에 적용하는 모든 영역에서 수행하는게 im2col이다.

 

실제로는 필터의 영역이 겹치는 경우가 대부분이라 im2col로 전개하게 되면 원래의 원소 수보다 더 많아지게 되는 단점이 있지만, 컴퓨터는 큰 행렬을 묶어서 계산하는데 최적화 되어 있으므로 빠르게 계산할 수 있다는 장점을 갖게 된다.

 

추가적으로 im2col에 대해서 그래픽하게 잘 표현해놓은 사이트를 공유한다.

https://hackmd.io/@bouteille/blog-post-cnnumpy-fast#

앞으로 딥러닝 코드를 이해하기 위해서는 텐서를 자유롭게 다룰 수 있어야 한다.

 

텐서를 다루기 위해 Pytorch를 사용하게 될 텐데, 텐서를 다루는기 위한 Pytorch의 기초적인 문법에 대해서 작성해 보겠다.

 

1. dim()

2. shape()

3. size()

4. view()

5. squeeze()

6. unsqueeze()

7. cat()

8. ones_like()

9. zeros_like()

 

import torch
import numpy as np
numpy 선언 이후, Tensor로 변환한다. (Tensor로 변환함으로써 다양한 매소드를 지원할 수 있게 된다.)
t = torch.FloatTensor([0., 1., 2., 3., 4., 5., 6.])

print(t.dim())    # 1
print(t.shape()) # torch.Size([7])
print(t.size())    # torch.Size([7])
view()를 통해 원하는 텐서 크기로 변환할 수 있다. (-'1 은 알아서 맞춰라' 라는 의미를 갖고 있다.)
t = np.array([[[0, 1, 2],
               [3, 4, 5]],
              [[6, 7, 8],
               [9, 10, 11]]])

ft = torch.FloatTensor(t)

print(ft.shape)                  # torch.Size([2, 2, 3])
print(ft.view([-1,3]).shape)   # torch.Size([4, 3])
print(ft.view([-1,1,3]).shape) # torch.Size([4, 1, 3])
squeeze()는 1인 차원을 제거한다.
ft = torch.FloatTensor([[0],[1],[2]])

print(ft.shape)              # torch.Size([3, 1])
print(ft.squeeze().shape) # torch.Size([3])
 
unsqueeze()는 원하는 위치에 차원을 추가한다. (view()를 통해 동일한 차원을 만들 수도 있다.)
ft = torch.Tensor([0,1,2])

print(ft.shape)                    # torch.Size([3])

print(ft.unsqueeze(0).shape)  # torch.Size([1, 3])
print(ft.view(1,-1).shape)       # torch.Size([1, 3])

print(ft.unsqueeze(1).shape)  # torch.Size([3, 1])

print(ft.unsqueeze(-1).shape) # torch.Size([3, 1])
cat()을 통해 두 개의 텐서를 연결할 수 있다. (dim=0은 행으로 추가하고, dim=1은 열로 추가하라는 의미이다.)
x = torch.FloatTensor([[1,2],[3,4]])
y = torch.FloatTensor([[5,6],[7,8]])

print(torch.cat([x,y], dim=0).shape) # torch.Size([2, 4])
print(torch.cat([x,y], dim=1).shape) # torch.Size([4, 2])
ones_like()와 zeros_like()를 통해 매개변수와 동일한 shape을 갖는 텐서를 생성한다. (ones -> 1, zeros -> 0)
x = torch.FloatTensor([[0, 1, 2], [2, 1, 0]])

print(torch.ones_like(x)) 
print(torch.zeros_like(x))

'개인공부 > Python' 카테고리의 다른 글

[vscode] Github 연동 (git clone)  (0) 2022.01.20
im2col 함수  (0) 2022.01.18
RuntimeError (CUDA)  (0) 2022.01.13
Python, Pytorch, Torchvision 다운그레이드  (0) 2022.01.11
파라미터 저장을 위한 예제 (hdf5)  (0) 2021.12.20

완전히 동일한 에러는 아니지만, 아래와 같은 에러가 등장했다.

 

RuntimeError: Cannot initialize CUDA without ATen_cuda library. PyTorch splits its backend into two shared libraries: a CPU library and a CUDA library; this error has occurred because you are trying to use some CUDA functionality, but the CUDA library has not been loaded by the dynamic linker for some reason. The CUDA library MUST be loaded, EVEN IF you don't directly use any symbols from the CUDA library! One common culprit is a lack of -Wl,--no-as-needed in your link arguments; many dynamic linkers will delete dynamic library dependencies if you don't depend on any of their symbols. You can check if this has occurred by using ldd on your binary to see if there is a dependency on *_cuda.so library.

 

다행히도 Pytorch와 CUDA버전을 올려주니 에러없이 잘 동작하였다.

'개인공부 > Python' 카테고리의 다른 글

im2col 함수  (0) 2022.01.18
Pytorch - 텐서 조작하기  (0) 2022.01.18
Python, Pytorch, Torchvision 다운그레이드  (0) 2022.01.11
파라미터 저장을 위한 예제 (hdf5)  (0) 2021.12.20
(1) 변수와 리스트  (0) 2021.12.14

간혹 타인의 소스코드를 구현하면서 버전이 호환되지 않으면서 동작하지 않는 경우가 종종 발생한다.

 

되도록 구현한 사람과 동일한 환경을 먼저 설정한 뒤 소스코드를 분석하는 것이 시간낭비 하지않는 방법이라 생각한다.

 

한가지 주의할 점은 Python과 Pytorch 간 호환되는 버전인지도 확인한 뒤 설치하여야 한다.

 

Python 설치방법

conda install python="Python version"  → ex) conda install python=3.7

 

Pytorch 설치방법

<pip3>

pip3 install http://download.pytorch.org/whl

위의 링크를 먼저 적어준 뒤,

/cpu/torch-0.4.1-cp36-cp36m-win_amd64.whl

위의 예제처럼 원하는 링크를 추가해주며 된다.

ex) pip3 install http://download.pytorch.org/whl/cpu/torch-0.4.1-cp36-cp36m-win_amd64.whl

<Anaconda>

conda install pytorch='원하는버전' ex) conda install pytorch=0.4.1 -c pytorch

 

 

torchvision 설치방법

<Anaconda>

conda install torchvision -c pytorch

<pip>

pip install torchvision

 

 

Pytorch 버전별 설치방법 참고

https://pytorch.kr/get-started/previous-versions/

'개인공부 > Python' 카테고리의 다른 글

im2col 함수  (0) 2022.01.18
Pytorch - 텐서 조작하기  (0) 2022.01.18
RuntimeError (CUDA)  (0) 2022.01.13
파라미터 저장을 위한 예제 (hdf5)  (0) 2021.12.20
(1) 변수와 리스트  (0) 2021.12.14

+ Recent posts