본문 바로가기
ML & DL/Deep Learning with PyTorch

[PyTorch] 실제 데이터를 텐서로 표현해보기

by Glory_Choi 2023. 4. 24.
반응형

이미지 파일 로딩

이미지는 여러 파일 포맷으로 저장될 수 있지만 다행히도 파이썬에서는 다양한 방식으로 이미지를 로딩할 수 있다.

 

코드의 img는 너비와 높이에 해당하는 두 개의 공간 정보와 색 공간을 포함하는 3차원 배열 같은 넘퍼이 객체다. 현재 이미지는 H * W * C로 되어있지만 파이토치 모듈은 텐서가 C * H * W, 즉 채널, 높이, 너비 순으로 배치되어야 한다.

 

레이아웃 변경하기

차원을 변경하려면 텐서의 permute 메소드를 사용한다. 앞에서 얻은 H * W * C 입력 텐서에 대해 채널2와 채널0 그리고 채널1 순으로 나열되도록 변경하면 적절한 레이아웃이 된다.

이 연산은 텐서 복사본을 만들지 않는다는 점에 유의해야 한다. out은 img 저장 공간과 동일하며 단순히 텐서 레벨에서 크기와 스트라이드 정보만 변경됐다.

또한 딥러닝 프레임워크마다 레이아웃이 다르다. 예를 들면 텐서플로는 채널 차원을 마지막에 배치하는 H * W * C 레이아웃이었다.

지금까지는 하나의 이미지만 다뤘다. 앞서 사용했던 방식과 동일하게, 우리가 다룰 신경망의 입력으로 사용할 여러 장의 이미지 데이터셋을 만들어보자. 첫 번째 차원에 여러 이미지를 배치로 넣어 N * C * H * W 텐서로 저장하자.

텐서를 만드는 작업을 좀더 효율적으로 하기 위해 stack을 사용해 미리 적당한 공간을 할당하고 디렉토리에서 읽은 이미지로 채워 넣을 수 있다.

 

데이터 정규화

신경망은 일반적으로 부동소수점 텐서를 입력으로 사용한다. 신경망은 입력값이 대략 0에서 1 사이거나 -1에서 1 사이일 때 훈련 성능이 가장 좋은 특징을 띤다.

따라서 대부분의 경우 텐서를 부동소수점으로 캐스팅하고 픽셀값을 정규화한다. 부동소수점 캐스팅은 쉽지만 정규화는 조금 복잡하다. 정해놓은 입력 값의 범위를 통해 정규화된 값이 0과 1 (혹은 -1와 1) 사이에 놓여야 하기 때문이다. 단순하게는, 픽셀 값을 부호 없는 8비트 정수의 최대값인 255로 나눈다.

다른 방법으로 입력 데이터의 평균과 표준 편차를 구해서 평균이 0이고 각 채널값이 표준 편차를 넘지 않게 만들기도 한다.

반응형