[딥러닝 Express] Chapter 07. MLP와 케라스 라이브러리 - (2)

배규리·2024년 1월 22일

AI 기초

목록 보기
14/32
post-thumbnail

4. 케라스(Keras) 시작하기

텐서플로우(TensorFlow): 딥러닝 프레임워크의 일종

  • 내부적으로 C/C++로 구현되어 있다.
  • 파이썬을 비롯하여 여러 가지 언어에서 접근할 수 있도록 인터페이스를 제공
  • 텐서(Tensor, 물리학에서 다차원 배열을 나타내는 용어)와 플로우(Flow, 데이터 플로우)를 합친 용어

케라스(Keras): 파이썬으로 작성된 고수준 딥러닝 API

  • 주로 텐서플로우를 백엔드로 사용한다.
  • 쉽고 빠른 프로토타이핑이 가능하다.
  • Convolution 신경망, 순환 신경망, 피드포워드 신경망 등 여러 가지의 조합을 지원
  • CPU 및 GPU에서 원활하게 실행

케라스로 신경망을 작성하는 절차

케라스의 핵심 데이터 구조는 모델(model)이며, 이것은 레이어를 구성하는 방법을 나타낸다.
가장 간단한 모델 유형은 Sequential 선형 스택 모델이다.
해당 모델은 레이어를 선형으로 쌓을 수 있는 신경망 모델이다!
뒤에 예제를 통해 무슨 말인지 이해될 것이다!
우리가 앞에서 복잡하게 구현하고 함수를 계속해서 호출했어야했던 과정을 줄여줄 것이다.👍👍

XOR을 학습하는 MLP를 작성

1) 라이브러리 포함시키기

import numpy as np
import tensorflow as tf

2) 순방향으로만 전파되는 신경망만들기! Sequential() 호출

model = tf.keras.models.Sequential()

3) 모델에 레이어쌓기! add()호출

model.add(tf.keras.layers.Dense(units=2, input_shape=(2,), activation = 'sigmoid'))
model.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))

4) 모델이 완성되었으므로 학습 과정 구성
손실함수로 평균 제곱 오차(MSE)를 지정하였고, 최적화 방법으로 확률적 경사 하강법을 사용한다는 것을 의미한다.
또한 확률적 경사 하강법에서 사용되는 수치인 학습률을 0.3으로 지정해주었다.

model.compile(loss='mean_squared_error', optimizer = tf.keras.optimizers.SGD(learning_rate=0.3))

5) 이제까지 구축한 모델을 볼 수 있다~~😯

model.summary()

그럼 이제 학습을 시켜보자! XOR을 구현하는 모델을 만들어내야 하므로 다음과 같이 훈련 데이터를 추가해주자.

6) fit()으로 학습 진행
이전에도 배웠 듯이 훈련 데이터2차원 행렬로!
그리고 model.fit()을 호출하여 학습을 진행한다.
여기서 epochs는 반복하는 세대의 개수
batch_size는 배치 크기이다.
즉 여기서는 1이므로 한 샘플마다 가중치를 변경한다는 의미이다.

x = np.array([[0,0],[0,1],[1,0],[1,1]])
y = np.array([[0],[1],[1],[0]])

model.fit(x, y, batch_size=1, epochs=10000)

해당 과정을 진행하면 아래와 같이 10000번의 학습이 반복되며 손실함수값을 출력하고 내부에서 가중치 변경이 일어난다.

7) predict()로 예측값 출력하기

print(model.predict(x))

근데 10000번을 반복했는데도
불구하고 결과값이 안좋아서 1000번으로 다시 시도해보았다.

그랬더니 괜찮은 결과값이 나왔당~!😊

5. 케라스를 사용하는 3가지 방법

1) Sequential 모델을 만들고 레이어 추가하는 방법 -> ~13장까지⭐

방금 위에서 사용한 방법이다.
add()로 모델에 점진적으로 레이어를 추가한다.

model = Sequential()

model.add(Dense(units = 2, input_shape = (2, ), activation = 'sigmoid'))
model.add(Dense(units = 1, activation = 'sigmoid'))

2) 함수형 API 사용하는 방법 -> 14장⭐

레이어와 레이어를 변수로 연결하는 방법이다.
우리 마음대로 변수를 연결할 수 있는 장점이 있다.
중간에서 은닉층의 값을 추출할 수도 있다.
동일한 신경망을 함수형 API를 이용하여 모델을 작성해보면 아래와 같다.

inputs = Input(shape(2,)) # 입력층
x = Dense(2, activation = 'sigmoid')(inputs) # 은닉층
prediction = Dense(1, activation = 'sigmoid')(x) # 출력층

model = Model(inputs = inputs, outputs = prediction)

나중에 14장에서 더 구체적으로 다루어보는 것으로 하자!

3) Model 클래스 상속 -> 사용 X

Model 클래스를 상속받아 우리 나름대로 클래스를 정의하는 방법이다.
매우 복잡한 모델까지 구현가능하지만, 나중...나중에 내가 정말 복잡한 모델을 구현할 때! Sequential 모델이랑 Functional API를 다 정복했을 때 다시 돌아와서 보자!😊

class SimpleMLP(Model):
	def __init__(self, num_classes): # 생성자 작성
    	super(SimpleMLP, self).__init__(name='mlp')
        self.num_classes = num_classes
        
        self.dense1 = Dense(32, activation = 'sigmoid')
        self.dense2 = Dense(num_classes, activation = 'sigmoid')
        
    def call(self, inputs): # 순방향 호출 구현
    	x = self.dense1(inputs)
        return self.dense2(x)
        
model = SimpleMLP()
model.compile(...)
model.fit(...)
장점단점
Sequential API단순하게 층을 쌓는 방식으로 쉽고 사용하기 간단하다.다수의 입력, 다수의 출력을 가진 모델 또는 층 간의 연결이나 덧셈과 같은 연산을 하는 모델을 구현하기에는 적합하지 않다.
Functional API복잡한 모델을 구현할 수 있다.입력의 크기(shape)를 명시한 입력층(Input Layer)을 모델의 앞단에 정의해주어야 한다.
Subclassing APIFunctional API로도 구현할 수 없는 모델들조차 구현 가능하다.객체 지향 프로그래밍에 익숙해야 하므로 코드 사용이 가장 까다롭다.


내가 이전에 TABA 1기를 수료하면서 구현했던 모델이 Sequential API 모델이었던 것을 오늘 알았다!

정말 간단한걸 구현한 것이었다니~

케라스라는 개념도 확실하게 정의할 수 없었는데 오늘 정확히 깨달았다!
케라스는 텐서플로우 프레임워크 위에서 동작하는 파이썬 기반의 라이브러리 !
오케이 굿굿-!👍👍
이제 Keras를 이용해서 본격적으로 모델 구현도 해볼 것이다!
이전에 했던 게 기억이 나는데 MNIST 숫자 인식을 구현할 것이다~!

참고 자료
https://wikidocs.net/106897

profile
백엔드 개발은 취미인 AI 개발자🥹

0개의 댓글