Study/class note

딥러닝 / 배치처리

chanzae 2022. 4. 5. 12:17

14 배치처리 - p.102

mnist 필기체 데이터의 경우 훈련 데이터가 6만장이나 되므로 6만장을 한번에 신경망에 넣고 학습을 시키게 되면 컴퓨터 메모리가 초과해서 수행되지 않는다고 하면서 수행이 안됩니다.

 

ex. 사람도 책을 볼 때 한장씩 읽으면서 봐야하듯이 컴퓨터도 한권 책(6만장)을 한번에 볼 수 없습니다.

위와 같이 한장씩 학습 시키면 메모리 부족 오류는 나지 않는데 시간이 너무 오래 걸립니다.

컴퓨터의 능력을 충분히 활용하려면 다음과 같이 배치처리를 해야합니다.

배치단위는 주로 100개씩 처리하는데 100개씩 처리하면 신경망 학습할 때 600번을 반복하면 60000장을 다 학습할 수 있게 됩니다. 100개씩 600번 학습해서 6만장을 다 학습한 것을 1에폭(epoch)이라고 합니다.

 

코드 예 : model.fit(x_train, y_train, epochs = 30, batch_size = 100)

 

배치처리의 이점? - p.103

파이썬의 라이브러리 중 numpy가 다차원 배열의 계산을 빠르게 할 수 있도록 최적화 되어져 있어서 하나씩 처리하는것부터 여러개를 한번에 처리하는데 더 효율적

 

 

ㅇ 배치처리 코드의 예

1. 텐서 플로우 : model.fit(x_train, y_train, epochs = 30, batch_size = 100)

 

2. 파이썬 날코딩 - p.104

x, t = get_data()  #입력 데이터와 정답을 가져오는 코드
network = init_network()  #저자가 만든 가중치와 바이어스 가져오는 코드

batch_size = 100
accuracy_snt = 0

for i range(0, len(x), batch_size):
	x_batch = x[i:i+batch_size] # 입력이미지를 100개씩 불러옴
    y_batch = predict(network, x_batch)  #입력값 100개에 대한 정답 100개를 출력(100x10)
    p = np.argmax(y_batch, axis = 1)  #100x10행렬에서 가로로 가장 큰 원소의 인덱스 번호 출력(100개)
    accuracy_cnt += np.sum(p==t[i:i+batch_size])  #예측값 100개와 정답 100개를 비교해서 맞힌 개수를 센다
    
print(accuracy_cnt / len(x))

 

+) np.argmax() 설명

 

ㅇ배치처리를 텐서 플로우로 구현

# 1. 필요한 패키지 가져오는 코드 
import tensorflow as tf   # 텐써 플로우 2.0 
from tensorflow.keras.datasets.mnist import load_data  # 텐써플로우에 내장되어있는 
                                                                         # mnist 데이터를 가져온다.
from tensorflow.keras.models import Sequential  # 모델을 구성하기 위한 모듈
from tensorflow.keras.layers import Dense  # 완전 연결계층을 구성하기 위한 모듈
from tensorflow.keras.utils import to_categorical # one encoding 하는 모듈

#2. 입력데이터 로드
tf.random.set_seed(777)

(x_train, y_train), (x_test, y_test) = load_data(path='mnist.npz')  # mnist 데이터 로드
print(x_train.shape)  #(60000,28,28) 3차원 데이터


#3. 정규화 진행 
# 3차원 ---> 2차원으로 차원축소하고서 정규화 진행  ( 한 픽셀이 0~255 로 되어있는데)
# 0 ~ 1 사이로 변경 (픽셀값255로 나눠서 정규화를 진행하는 것)
x_train = (x_train.reshape((60000, 28 * 28))) / 255 # 2차원으로 변경 
x_test = (x_test.reshape((10000, 28 * 28))) / 255

print(x_train.shape)  #(60000, 784) 2차원으로 바뀐것 확인


#4. 정답 데이터를 준비한다. 
# 하나의 숫자를 one hot encoding 한다. (예:  4 ---> 0 0 0 0 1 0 0 0 0 0 ) 
# 뒤에서 오차함수에 정답과 예측값을 제공해줘야 하는데 정답을 one hot encoding해서 제공해줘야함
y_train = to_categorical(y_train)  # 훈련 데이터의 라벨(정답)을 원핫 인코딩
y_test = to_categorical(y_test)    # 테스트 데이터의 라벨(정답)을 원핫 인코딩 


#5. 모델을 구성합니다. 3층 신경망으로 구성
model = Sequential()
model.add(Dense(50, activation = 'relu', input_shape = (784, )))  # 1층 뉴런의 갯수 64
model.add(Dense(100, activation = 'relu'))  # 2층 뉴런의 갯수 32
model.add(Dense(10, activation = 'softmax'))  # 3층 출력층
# 만약 개와 고양이만 분류한다면 뉴런 2개지만, mnist데이터는 0~9까지 숫자10개를 분류한거라 뉴런 10개 줘여함


#6. 모델을 설정합니다. ( 경사하강법, 오차함수를 정의해줍니다. )
model.compile(optimizer='adam',  # 경사하강법 종류 중 adam 사용
              loss = 'categorical_crossentropy',   # 오차함수 크로스 엔트로피 사용
              metrics=['acc'])  # 학습과정에서 정확도를 보려고 


#7. 모델을 훈련시킵니다. 
history = model.fit(x_train, y_train, 
                    epochs = 30,  # 30에폭
                    batch_size = 100)


#8. 모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)


#9. 테스트 데이터의 예측값을 출력합니다. 
results = model.predict(x_test)


#10. 정확도를 확인합니다.
import numpy as np
y_hat = np.argmax(results, axis=1)
y_label = np.argmax(y_test,axis=1)  # 원핫인코딩했기 때문에 label데이터에 대해서도 np.argmax해줘야함
print ( np.sum( y_hat == y_label ) / len(y_test) )

 

저자는 위의 코드를 파이썬 날코딩으로 구현했고 필기체 데이터를 학습 시켜서 우리에게 가중치와 바이어스를 제공했음.

 

 

문제46. 3층 신경망으로 구성한 위의 신경망에서 가중치를 확인하시오.

model.get_weights()

############################
w = model.get_weights()

for i in range(len(w)):
    print(w[i].shape)

# (784, 50) W1
# (50,)  b1
# (50, 100)  W2
# (100,)  b2
# (100, 10)  W3
# (10,)  b3

 

문제47. 위에서 만든 3층 신경망의 모델을 내리시오.

#11. 모델을 생성한다.
model.save('c:\\deep\\my_model.h5')

 

문제48. 위에서 생성한 모델을 불러오시오.

from tensorflow.keras.models import load_model

new_model = load_model("c:\\deep\\my_model.h5")

new_model.evaluate(x_test,y_test)  #평가 가능

 

 

문제49. 지금 불러온 모델에 테스트 이미지 한 장을 입력하고 예측값을 출력하시오.

from tensorflow.keras.models import load_model

new_model = load_model("c:\\deep\\my_model.h5")

result = new_model.predict(x_test[0].reshape(1,784))
print(np.argmax(result))  # 7로 예측함

#정답 확인
print(np.argmax(y_test[0]))  #label 7

 

 

문제50, 문제51. 필기체 숫자2를 텐서플로우로 만든 모델에 넣고 숫자2로 잘 예측하는지 확인하시오.

import cv2
import matplotlib.pyplot as plt
from tensorflow.keras.models import load_model

#1. 데이터 임포트
j= 'c:\\deep\\number\\n2_1.png'

img = cv2.imread(j,0)  # cv2.imread에서 회색조로 불러오기
print('img.shape :',img.shape)  #img.shape : (28, 28)

plt.imshow(img, cmap = 'gray')  #이미지 확인
plt.show()

x = img.reshape(1, 784)


#2. 모델 로드
new_model = load_model("c:\\deep\\my_model.h5")


#3. 데이터 예측
result = new_model.predict(x)
print(np.argmax(result))  # 2로 예측함

 

반응형