본문 바로가기
인공지능 개발하기/Machine Learning

[Tensorflow] 4. 모델 구조, batch_size 바꿔보기

by 선의공 2024. 1. 2.

 
저는 학원에서 tensorflow를
배우고 있습니다.
 
학습 내용을 기록하고 
학습하고
공유해보려고 합니다.
 
 
 
저번 포스팅에서는 초급 딥러닝 코드를
작성해 보았습니다만
아직 배울 개념들이 
엄청나게 쌓여있어여..
https://aigaeddo.tistory.com/3

 

2) Tensorflow를 사용해서 딥러닝 하기

저는 학원에서 기초적인 학습을 하고있고, 부끄럽지만 소통을 위해 복기를 위해 초심을 잃지 않기 위해 나름 다른 분들에게 도움이 될까 싶어(?) 학습하는 과정을 블로그에 작성하고 있습니다.

aigaeddo.tistory.com

 
 
이번 포스트에서는
저번에 생성한 모델에
모델 구조를 변경하며
batch_size는 무엇이며,
왜 사용하며,
어떻게 사용하는지에 대해서
설명하면서
코드에 살도 붙여보겠습니다.
 
 
 

1. 코드변경

 
아래는 저번에 구현해준
코드이구요.

from keras.models import Sequential
from keras.layers import Dense
import numpy as np

# 데이터
x = np.array([1,2,3])
y = np.array([1,2,3])

# 모델생성
model = Sequential()
model.add(Dense(1, input_dim = 1))

# 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x,y, epochs=100)

# 평가, 예측
loss = model.evaluate(x,y)
print("loss : ", loss)
result = model.predict([4])
print(“예측값: “,result)

 
 
 
데이터 부분을 변경해주었습니다.
입력 부
x: [1,2,3]
출력 부
y: [1,2,3]
데이터를
 
x: [1,2,3,4,5,6],
y: [1,2,3,5,4,6]  
으로 변경했어요.
(오타 아닙니다 5,4)
 
 
predict 를 7로 변경.
즉, 모델이 학습해서
예상하는 값이 7이 나오도록
설정 해주었습니다. 
 

from keras.models import Sequential
from keras.layers import Dense
import numpy as np

# 데이터
x = np.array([1,2,3,4,5,6])
y = np.array([1,2,3,5,4,6])

# 모델생성
model = Sequential()
model.add(Dense(1, input_dim = 1))

# 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x,y, epochs=100)

# 평가, 예측
loss = model.evaluate(x,y)
print("loss : ", loss)
result = model.predict([7])
print(“예측값: “,result)

 
 
이렇게 세팅한 이유는
데이터를 규칙적이지 못하게 변경해서
예상 값이 나오지 못하게 하며
 
모델 구조와 batch_size을 변경하며
최소 loss값을 최대한 구해보는 것에
적합해서겠죠.
(이게 강사님 생각 맞겠죠?) 
 
 
 


 
 

 1. 모델 구조 변경

 
모델 구조를 변경해 주는 방법은 많겠지만
위의 코드에서
 
1)레이어 추가,
2)노드 개수 조절
 
을 하면서 변경 해보려고 합니다.

 
 

앞의 포스팅에서 Dense와 Sequential에 대해서
학습했었죠?

https://aigaeddo.tistory.com/4

 

3) Tensorflow keras의 Sequential, Dense

이전 포스트에서 학원에서 처음 Tensorflow keras 를 활용해 딥러닝을 돌리는 코드를 분석해보았는데요, https://aigaeddo.tistory.com/3 2) Tensorflow를 사용해서 머신러닝 하기 저는 학원에서 기초적인 학습을

aigaeddo.tistory.com

 
 
 

Dense는 레이어를 지칭하며,
Sequential은 단순 순차 모델을 구현 가능하게
해주는 클래스였습니다.
 
 
이 모델에 레이어를 추가하고
레이어 마다의 노드 개수를 변경하면서
모델 구조를 변경할 수 있습니다.

 
 

아래 그림의 알고리즘으로
모델 구조를 변경 해보겠습니다.

이미지출처: https://ebbnflow.tistory.com/120
 
 
그림에서 동그란건 노드구요,
동그란 노드의 한 줄이 레이어가 됩니다.
 
가장 처음 입력 받는 레이어는
Input Layer
가장 마지막에 출력을 하는 레이어는
Output Layer
중간에 껴서 열심히 가중치를 계산하는 레이어는
Hidden Layer라고 합니다.

 
 
 
 

1) 레이어 추가
위 그림에서 레이어가 총 4개였죠?
 
레이어 추가는 간단합니다.
모델에 add()함수를 사용해서
Dense를 하나 하나 추가해주면 됩니다.
총 레이어가 4개이나 
Output Layer는 생략하고
3개의 Dense를 넣어줬습니다.

# 모델생성
model = Sequential()
model.add(Dense(1, input_dim = 1))
model.add(Dense(1, input_dim = 1))
model.add)(Dense(1, input_dim = 1))

 
위 코드는
Dense에 input_dim을 전부 1로 설정한
예시입니다.
모든 레이어의 노드가 1인 거죠.
 
이제 여기에 노드를 붙여보겠습니다.
 
 
 
2) 노드 추가

 

 
 
그림에서 Input Layer의 입력 개수가 1개이고,
그 다음 Hidden Layer 에서는 입력 개수가 5개, 출력 개수는 3개.
다음 Output Layer 에서는 입력받는 개수가 3개, 출력 개수가 1개네요.
 
이걸 Dense의 Input과 Output 파라미터의 값을 변경해줘서
설정할 수 있습니다.
Dense(출력개수, input_dim = 입력개수)
로 보시면 됩니다!
 
Dense에는 여러 파라미터가 있지만
오늘은 입출력 값만 만져보겠습니다!!

# 모델생성
model = Sequential()
model.add(Dense(5, input_dim = 1)) #Input Layer 입력1, 출력5
model.add(Dense(3, input_dim = 5)) #Hidden Layer 입력5, 출력3
model.add)(Dense(1, input_dim = 3)) #Output Layer 입력3, 출력1

 

 
추가로 두번째 레이어부터는
input_dim을 생략할 수 있습니다.

# 모델생성
model = Sequential()
model.add(Dense(5, input_dim = 1)) #Input Layer 입력1, 출력5
model.add(Dense(3)) #input_dim 생략
model.add)(Dense(1)) #input_dim 생략

 
 
그림과 같게 모델 구조를 변경한 최종 코드는
아래와 같습니다.

from keras.models import Sequential
from keras.layers import Dense
import numpy as np

# 데이터
x = np.array([1,2,3,4,5,6])
y = np.array([1,2,3,5,4,6])

# 모델생성
model = Sequential()
model.add(Dense(5, input_dim = 1))
model.add(Dense(3))
model.add(Dense(1))

# 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x,y, epochs=100)

# 평가, 예측
loss = model.evaluate(x,y)
print("loss : ", loss)
result = model.predict([7])
print(“예측값: “,result)

 
 
 
 


 

2. batch_size 변경

 
 

자자 일단 batch_size를 알고나서 
변경해야겠죠?
 
 
다시 포스팅에서 계속 살을 붙이고 있는
코드의 일부분을 가져올게요.

# 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x,y, epochs=100)

 

이 코드에서 model의 fit()함수로 
머신에 훈련을 시켜 모델을 생성해봤습니다.
 
이 함수의 파라미터 중 하나가 
batch_size입니다.
 
batch_size란
머신에 데이터를 입력할때
데이터 사이즈를 잘라서 훈련시킬 수 있도록
정해주는 값입니다.
 
예를들어
x = [1,2,3,4,5,6]
y = [1,2,3,5,4,6]
의 데이터를 머신에게 넣어주고,
batch_size를 1로 설정한다면
1개의 데이터씩 잘라서 훈련하게 됩니다.
x = [1]
y = [1] 
데이터를 잘라서 훈련을 하고
x = [2]
y= [2]
데이터를 잘라서 다음 훈련을 하고....
쭉 1개씩 나눠서 훈련을 하다가
x=[6]
y=[6]
까지 epoch 한번이 돌때
총 6번의 훈련을 해주게 되는거지요.
 
왜 이걸 잘라서 훈련해야하냐고요??
궁금증이 생기지 않으셨나요?
 
1. 램 용량을 줄여 학습할 수 있다.
2. 촘촘하게 훈련을 할 수 있다.
 
라는 장점이 있습니다.
다수의 데이터를 한꺼번에 처리하려면
모든 데이터가 램메모리에 들어가게 되고
 
만약 데이터가 엄청나게 커서
램메모리의 용량을 넘어가게 되면 
컴퓨터가 뻗어버릴 수 있다고 합니다.
 
또한, 세분화 해서 나눠주면
촘촘한 훈련으로 인해
최적의 가중치를 구하는 데에 도움을 
줄 수 있다고 하네요.

 

반대로 단점도 존재하는데요,

훈련 시간이 오래 걸리게 됩니다...
 
위의 코드처럼
batch_size 설정을 생략하면 어떻게 될까요?
 
=> 기본 default값 32로 자동으로 들어가게 됩니다.
설정을 안해주면 자동으로 데이터를 32개로
쪼개 훈련하게 되는거죠.
 
그래서 설정을 해준다면
아래와 같이 하이퍼 파라미터만 추가해주면 됩니다.

# 3. 컴파일, 훈련
model.compile(loss="mse", optimizer="adam")
model.fit( x, y, epochs=200, batch_size=1 )

 
batch_size를 적용해준 최종 코드는 아래와 같습니다.

from keras.models import Sequential
from keras.layers import Dense
import numpy as np

# 데이터
x = np.array([1,2,3,4,5,6])
y = np.array([1,2,3,5,4,6])

# 모델생성
model = Sequential()
model.add(Dense(5, input_dim = 1))
model.add(Dense(3))
model.add(Dense(1))

# 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x,y, epochs=100, batch_size = 1)

# 평가, 예측
loss = model.evaluate(x,y)
print("loss : ", loss)
result = model.predict([7])
print(“예측값: “,result)

 
 
이상으로 
모델 구조 변경과
batch_size를 변경해서
더 나은 최적의 가중치를 
구하기 위해
한발짝 더 다가섰습니다.
 
 
 
내용의 틀린점이 있다면
말씀해주시면 감사하겠습니다!