본문 바로가기

Deep Learning

[Deep Learning] 220810 학습일기

 

밑바닥부터 시작하는 딥러닝 - YES24

직접 구현하고 움직여보며 익히는 가장 쉬운 딥러닝 입문서 이 책은 라이브러리나 프레임워크에 의존하지 않고, 딥러닝의 핵심을 ‘밑바닥부터’ 직접 만들어보며 즐겁게 배울 수 있는 본격 딥

www.yes24.com

 

1.

sys.path.append()가 잘 이해가 안 되어 아래 링크를 참고했다.

https://sshkim.tistory.com/158

 

[퍼옴] [점프투파이썬] 환경변수 및 sys를 이용한 모듈 import

참조: https://wikidocs.net/29 [모듈을 불러오는 또 다른 방법] 우리는 지금껏 도스 창을 열고 모듈이 있는 디렉터리로 이동한 다음에나 모듈을 사용할 수 있었다. 이번에는 모듈을 저장한 디렉터리로

sshkim.tistory.com

 

 

2. 손글씨 숫자 인식

책의 깃허브 저장소에서 다운 받은 후 다음과 같이 파일을 만들었다.

import sys,os
sys.path.append(os.pardir) #부모 디렉터리의 파일을 가져올 수 있도록 설정
from dataset.mnist import load_mnist

(x_train, t_train),(x_test, t_test) =\
    load_mnist(flatten=True, normalize=False)

#각 데이터의 형상 출력
print(x_train.shape)
print(t_train.shape)
print(x_test.shape)
print(t_test.shape)

<출력값>

(60000, 784)
(60000,)
(10000, 784)
(10000,)

MNIST 데이셋을 내려받아 mnist.py의 load_mnist() 함수를 사용한 것이다.

 

위의 코드를 설명해보자면

먼저 부모 디렉터리의 파일을 가져올 수 있도록 설정하고 dataset/mnist.py의 load_mnist 함수를 임포트했다.

그 다음에 load_mnist 함수로 MNIST 데이터셋을 읽는다. 이때 load_mnist가 MNIST 데이터를 받아와야 하니 인터넷에 연결된 상태여야 한다. 두번째부터는 로컬에 저장된 파일(pickle 파일)을 읽기 때문에 순식간에 끝난다.

 

MNIST 데이터셋은 0부터 9까지의 숫자 이미지로 구성되어있고 훈련 이미지가 60,000장 , 시험 이미지가 10,000장 준비되어있기 때문에 출력값이 저렇게 나온다.

그리고 MNIST의 이미지 데이터는 28X28 크기의 회색조 이미지이기때문에 784가 출력되는 것이다.

 

 

load_mnist 함수는 읽은 MNIST 데이터를 "(훈련 이미지, 훈련 레이블), (시험 이미지, 시험 레이블)" 형식으로 반환한다. 인수로는 normalize, flatten, one_hot_label 세 가지를 설정할 수 있다.

세 인수는 모두 bool 값이다.

normalize는 입력 이미지의 픽셀값을 0.0~1.0 사이의 값으로 정규화(True)할지를 정한다. False를 설정하면 입력 이미지의 픽셀을 원래 값 그대로 0~255 사이의 값을 유지한다.

flatten은 입력이미지를 평탄하게, 즉 1차원 배열로 만들지(True)를 정한다. True로 설정하면 784개의 원소로 이루어진 1차원 배열로 저장한다. False로 설정하면 입력 이미지를 1x28x28의 3차원 배열로 저장한다.

one_hot_label은 레이블을 one-hot-encoding 형태로 저장할지를 정한다. One-hot-encoding이란 예를 들어 [0,0,1,0,0,0,0,0,0,0] 처럼 정답을 뜻하는 원소만 1이고(hot하고) 나머지는 모두 0인 배열이다. True일 때는 레이블을 one-hot-encoding하여 저장하고 False면 '7'이나 '2'와 같이 숫자 형태의 레이블을 저장한다.

 

 

 

파이썬에는 pickle이라는 기능이 있다 pickle은 프로그램 실행 중에 특정 객체를 파일로 저장하는 기능이다. 저장해둔 picle 파일을 load하면 실행 당시의 객체를 즉시 복원할 수 있다. 

MNIST 데이터셋을 읽는 load_mnist 함수에서도 2번째 이후 읽기 시에 pickle을 사용하여 데이터를 순식간에 준비한다.

 

 

3.

MNIST 이미지를 화면을 불러보기 위해 PIL(Python Image Library) 모듈을 사용한다.

import sys,os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
from PIL import Image

def img_show(img):
    pil_img = Image.fromarray(np.uint8(img))
    pil_img.show()

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

img = x_train[0]
label = t_train[0]
print(label) #5

print(img.shape) #(784,)
img = img.reshape(28,28) #원래 이미지의 모양으로 변형
print(img.shape) #(28, 28)

img_show(img)

<결과값>

5
(784,)
(28, 28)

 

 

 

이제 코드를 하나하나 살펴보자.

 

flatten = True로 설정해 읽어들인 이미지는 1차원 넘파이 배열로 저장되어 있다.

아래와 같이 확인해 볼 수 있다.

import sys,os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
from PIL import Image

def img_show(img):
    pil_img = Image.fromarray(np.uint8(img))
    pil_img.show()

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

img = x_train[0]
print(img)
print(len(img))

<출력값>

[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   3  18  18  18 126 136 175  26 166 255
 247 127   0   0   0   0   0   0   0   0   0   0   0   0  30  36  94 154
 170 253 253 253 253 253 225 172 253 242 195  64   0   0   0   0   0   0
   0   0   0   0   0  49 238 253 253 253 253 253 253 253 253 251  93  82
  82  56  39   0   0   0   0   0   0   0   0   0   0   0   0  18 219 253
 253 253 253 253 198 182 247 241   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0  80 156 107 253 253 205  11   0  43 154
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0  14   1 154 253  90   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0 139 253 190   2   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0  11 190 253  70   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  35 241
 225 160 108   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0  81 240 253 253 119  25   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0  45 186 253 253 150  27   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0  16  93 252 253 187
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0 249 253 249  64   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0  46 130 183 253
 253 207   2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0  39 148 229 253 253 253 250 182   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0  24 114 221 253 253 253
 253 201  78   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0  23  66 213 253 253 253 253 198  81   2   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0  18 171 219 253 253 253 253 195
  80   9   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  55 172 226 253 253 253 253 244 133  11   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0 136 253 253 253 212 135 132  16
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0]
784

그래서 이미지를 표시할 때는 원래 형상인 28x28 크기로 바꿔주어야 한다.

reshape() 메소드에 원하는 형상을 인수로 지정하면 넘파이 배열의 형상을 바꿀 수 있다.

여기서는 reshape(28,28)을 했는데 그러면 아래와 같이 바뀐다.

[[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   3  18  18  18 126 136
  175  26 166 255 247 127   0   0   0   0]
 [  0   0   0   0   0   0   0   0  30  36  94 154 170 253 253 253 253 253
  225 172 253 242 195  64   0   0   0   0]
 [  0   0   0   0   0   0   0  49 238 253 253 253 253 253 253 253 253 251
   93  82  82  56  39   0   0   0   0   0]
 [  0   0   0   0   0   0   0  18 219 253 253 253 253 253 198 182 247 241
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  80 156 107 253 253 205  11   0  43 154
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0  14   1 154 253  90   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0 139 253 190   2   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0  11 190 253  70   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0  35 241 225 160 108   1
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0  81 240 253 253 119
   25   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  45 186 253 253
  150  27   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  16  93 252
  253 187   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 249
  253 249  64   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  46 130 183 253
  253 207   2   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0  39 148 229 253 253 253
  250 182   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0  24 114 221 253 253 253 253 201
   78   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  23  66 213 253 253 253 253 198  81   2
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0  18 171 219 253 253 253 253 195  80   9   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0  55 172 226 253 253 253 253 244 133  11   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0 136 253 253 253 212 135 132  16   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]]

최종 img는 위와 같은 상태이다.

 

이제 img_show() 함수를 살펴보자.

인수로 img를 받는다.

 

Image.fromarray() 메소드는 넘파이로 저장된 이미지 데이터를 PIL용 데이터 객체로 변환한다.

https://supermemi.tistory.com/132

 

[ Python / PIL ] PIL 이미지, Numpy 배열 변환 및 저장 ( Image.fromarray(), np.array(), np.asarray() )

2021.12.29 - [Computer Language/Python] - [ Python / PIL ] Image (open, save) [ Python / PIL ] Image (open, save) Python Imaging Library (PIL) PIL은 파이썬에서 이미지 분석 및 처리를 쉽게 할 수 있는..

supermemi.tistory.com

 

아래와 같은 예시를 보면 쉽게 이해할 수 있다.

import numpy as np
from PIL import Image

img = Image.open("C:/Users/tina0/Desktop/prac.png")

x = np.array(img) # PIL image to NumPy array
print(x)

img_2 = Image.fromarray(x) # NumPy array to PIL image
img_2.show()

<결과값>

 

Image.fromarray의 인수로 np.uint8(img)를 받는 이유는 

https://kongdols-room.tistory.com/53

 

NumPy의 데이터 타입(자료형), 관련된 함수 - NumPy(2)

참고 자료 https://docs.scipy.org/doc/numpy/user/basics.types.html 파이썬 버전 3.7 기준 NumPy 버전 1.15 기준 본 포스팅에선 NumPy의 주요 자료형인 정수(int), 부호없는 정수(uint), 실수(float), 복소수(c..

kongdols-room.tistory.com

uint8이 양수만 표현이 가능하고 2^8개수 만큼 표현이 가능하며 0 ~ 255까지의 수를 표현할 수 있기 때문인 것 같다.

배열의 원소들은 모두 0~255의 수들이다.

MNIST의 이미지 데이터의 각 픽셀들이 0에서 255까지의 값을 취하기 때문이다.

 

np.uint8 메소드를 적용시키지 않고 img를 그대로 Image.fromarray에 넣어봤다.

mport sys,os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
from PIL import Image

def img_show(img):
    pil_img = Image.fromarray(img)
    pil_img.show()

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

img = x_train[0]
label = t_train[0]
print(label) #5

print(img.shape) #(784,)
img = img.reshape(28,28) #원래 이미지의 모양으로 변형
print(img.shape) #(28, 28)

img_show(img)

<결과값>

5
(784,)
(28, 28)

그래도 문제 없이 잘 되긴 한다.

그럼에도 불구하고 np.uint8(img)을 책에서 권한 이유는 혹시 모를 오류를 방지하기 위함인 것 같다.

 

 

label은 5로 되어있는 것을 볼 수 있다.

 

 

'Deep Learning' 카테고리의 다른 글

[Deep Learning] 220809 학습일기  (0) 2022.08.10
[Deep Learning] 220808 학습일기  (0) 2022.08.08
[Deep Learning] 220806 학습일기  (0) 2022.08.08
[Deep Learning] 220805 학습일기  (0) 2022.08.05
[Deep Learning] 220803 학습일기  (0) 2022.08.03