[밑시딥1] [4] MNIST

2024. 7. 29. 01:35· DS Study/밑바닥부터 시작하는 딥러닝 1
목차
  1. 1.Introduce MNIST
  2. 2. MNIST 데이터 출력
  3. 2.1. MNIST 불러오기
  4. 2.2. PIL을 이용하여 MNIST출력
  5. 2.3. MNIST Data를 행렬로
  6. 2.4.Flatten
  7. 3. MNIST 신경망 구현
  8. 4. Mini Batch

1.Introduce MNIST

 

- MNIST 데이터 셋은 0부터 9까지의 손글씨 이미지로 구성

- 훈련 데이터 60,000장 / 테스트 데이터 10,000장

- 각 데이터는 이미지와 라벨로 이루어짐

- 각 이미지는 28 * 28 해상도의 흑백사진

- 각 픽셀은 0~255로 밝기표현이 되어있음 (0: 검정 / 255: 흰색)

 

2. MNIST 데이터 출력

- MNIST라는 데이터베이스에 대해서 알아봤다면, 한번 실제로 출력해보자.

https://github.com/WegraLee/deep-learning-from-scratch 

 

GitHub - WegraLee/deep-learning-from-scratch: 『밑바닥부터 시작하는 딥러닝』(한빛미디어, 2017)

『밑바닥부터 시작하는 딥러닝』(한빛미디어, 2017). Contribute to WegraLee/deep-learning-from-scratch development by creating an account on GitHub.

github.com

 - 해당 깃헙에서 데이터를 다운로드 할 수 있다. 

 

2.1. MNIST 불러오기

import pickle
from dataset.mnist import load_mnist

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

-------------------------------------------------------

Converting train-images-idx3-ubyte.gz to NumPy Array ...
Done
Converting train-labels-idx1-ubyte.gz to NumPy Array ...
Done
Converting t10k-images-idx3-ubyte.gz to NumPy Array ...
Done
Converting t10k-labels-idx1-ubyte.gz to NumPy Array ...
Done
Creating pickle file ...
Done!

- load_mnist() 라는 함수를 이용하여 MNIST DATA를 불러올 수 있다.

- flatten : Flatten할지 안할지의 여부 체크 (flatten은 뒤에 설명한다.)

- normalize : 0~255 였던 데이터를 0~1사이로 범위를 정해줄지 여부 체크 

 

2.2. PIL을 이용하여 MNIST출력

from PIL import Image
import numpy as np

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

img = x_train[0]
img = img.reshape(28,-1)

- PIL을 이용하여 출력하는 방식은 현재 많이 사용되는 방식은 아니라서 이런 방식이 있다는 것만 알고 넘어가자

 

2.3. MNIST Data를 행렬로

np.set_printoptions(linewidth=200,threshold=1000)
x_train[0]

cf) np.set_printoptions(??) : 출력하는 사이즈를 설정가능하게 해줌

- 만일 Flatten을 시키면 어떻게 될까?

2.4.Flatten

- 다음과 같이 행렬이 주어져있다고 생각해보자.

- 이 행렬을 한줄로 이어 붙여 벡터로 만들어주는 작업을 해보자.

- 이런 작업을 Flatten이라고 한다. 

- 마치 세절기로 종이를 찢어서 한줄로 이어놓는것과 같다.

- 즉, MNIST 데이터 하나를 Flatten해서 신경망의 입력벡터로 사용한다고 생각하면 편하다. 

3. MNIST 신경망 구현

- 밑시딥1에 있는  sample_weight를 이용해서 가볍게 MNIST 데이터를 구분하는 신경망을 구현해보자.

- 함수 정의

import pickle
from dataset.mnist import load_mnist
from common.functions import *
import numpy as np

def get_data():
    (x_train, t_train), (x_test, t_test) = \
        load_mnist(flatten=True, normalize=True,one_hot_label=False)
    return x_test,t_test

def init_network():
    with open("ch03/sample_weight.pkl","rb") as f:
        network = pickle.load(f)
    return network

def predict(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x,W1) +b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1,W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2,W3) + b3
    y = softmax(a3)

    return y

- 예제

x,t = get_data()
network = init_network()
accuracy_cnt = 0
for i in range(len(x)):
    y = predict(network,x[i])
    p = np.argmax(y) #확률이 가장 높은 인덱스
    if p == t[i]:
        accuracy_cnt +=1

print("Accuracy:" + str(float(accuracy_cnt) / len(x)))

----------------------------------------------------------------
Output
Accuracy:0.9352

 

4. Mini Batch

- 밑시딥1 에선 배치(Batch)라고 명칭되어 있지만 미니배치라고 알고 있는게 편하다.

- 미니배치(Mini Batch)란 쉽게 설명하면 묶음 이라고 생각하면된다.

- 지금까지 신경망을 돌릴 때, input data를 한개씩 집어넣었는데, 이를 10장, 50장 이렇게 묶어서 넣는걸 의미한다.

- 이렇게 될경우 I/O 병목현상을 줄여줄수 있음.

- 코드는 다음과 같다.

batch_size = 100
accuracy_cnt = 0

for i in range(0,len(x),batch_size):
    x_batch = x[i:i+batch_size]
    y_batch = predict(network,x_batch)
    p = np.argmax(y_batch, axis = 1)
    accuracy_cnt += np.sum(p==t[i:i+batch_size])

print("Accuracy:" + str(float(accuracy_cnt) / len(x)))
    

----------------------------------------------------
Accuracy:0.9352

'DS Study > 밑바닥부터 시작하는 딥러닝 1' 카테고리의 다른 글

[밑시딥1] [5] 손실함수(Loss Function)  (0) 2024.07.29
[밑시딥1] [3] 인공신경망(ANN)  (1) 2024.07.26
[밑시딥1] [2] 활성화함수 (Activation Function)  (0) 2024.07.26
[밑시딥1] [1] 퍼셉트론 (Perceptron)  (0) 2024.07.24
  1. 1.Introduce MNIST
  2. 2. MNIST 데이터 출력
  3. 2.1. MNIST 불러오기
  4. 2.2. PIL을 이용하여 MNIST출력
  5. 2.3. MNIST Data를 행렬로
  6. 2.4.Flatten
  7. 3. MNIST 신경망 구현
  8. 4. Mini Batch
'DS Study/밑바닥부터 시작하는 딥러닝 1' 카테고리의 다른 글
  • [밑시딥1] [5] 손실함수(Loss Function)
  • [밑시딥1] [3] 인공신경망(ANN)
  • [밑시딥1] [2] 활성화함수 (Activation Function)
  • [밑시딥1] [1] 퍼셉트론 (Perceptron)
23학번이수현
23학번이수현
23학번이수현
밑바닥부터 시작하는 AI보안전문가
23학번이수현
전체
오늘
어제
  • 분류 전체보기 (243)
    • Statistic Study (47)
      • Mathematical Statistics(수리통.. (47)
    • Mathematics Study (15)
      • Linear Algebra (선형대수학) (15)
    • CS Study (74)
      • CLRS (자료구조 | 알고리즘) (49)
      • Database(DB) (11)
      • C++ (11)
      • 컴퓨터 구조 (2)
      • MongoDB (1)
    • DS Study (56)
      • CS 229(Machine Learning) (19)
      • CS 224n(NLP) (5)
      • Web Scraping (7)
      • R4DS(R언어) (20)
      • 밑바닥부터 시작하는 딥러닝 1 (5)
    • Hacking Study (0)
      • Web Hacking (0)
    • 코딩테스트 (5)
      • 백준-Python (5)
    • Paper Review(논문 리뷰) (43)
      • Deep Learning (16)
      • TCGA 관련 논문 (4)
      • Computer Vision (18)
      • NLP (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 파이썬
  • Introduction to Algorithms
  • graph
  • LSTM
  • web scraping
  • db
  • 자료구조
  • 데이터분석
  • 수리통계학
  • introduction to algoritmhs
  • AI
  • cs229
  • R언어
  • deep learning
  • clrs
  • Machine Learning
  • 정렬
  • 알고리즘
  • cs 224n
  • Algorithms
  • 시간복잡도
  • NLP
  • 논문 리뷰
  • R4DS
  • 백준
  • 선형대수학
  • Data Structure
  • 딥러닝
  • C++
  • Linear Algebra

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
23학번이수현
[밑시딥1] [4] MNIST
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.