Keras 활용

박재형·2025년 2월 22일

저번 시간에는 조금 구시대적인 방법으로 손실 함수와 반복문을 작성해서 뉴럴 네트워크를 코딩했었다.

하지만 실제 딥러닝 과정에선 일일히 반복문과 손실 함수, 예측값 등을 코딩하지 않는다.

이번 시간에는 텐서플로우 내의 상위 API인 tf.keras를 활용하여 gre, gpa, 학교 랭킹에 따른 학생의 해당 대학원 합격률을 예측하는 모델을 코딩하겠다.

일단, 합격 여부인 admit, 해당 학생의 gre 성적, gpa 성적, 그리고 학생이 지원한 대학원의 랭킹을 임의로 csv 형태로 작성했다.

일단, 이번 모델은 4층 퍼셉트론 구조로 코딩하겠다. 이 과정에서 tf.keras.models.Sequential 클래스를 이용하겠다.

tf.keras.models.Sequential 클래스는 층을 순차적으로 쌓으며 선형적인 흐름을 가진 순차적 모델을 만들 때 사용된다.

클래스 안에는 tf.keras.layers.Dense 라는 클래스로 히든 레이어를 생성할 수 있다.

우리는 4층으로 히든 레이어를 쌓을 것이므로

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense
	tf.keras.layers.Dense
	tf.keras.layers.Dense
	tf.keras.layers.Dense
])

위 형태로 설정하겠다.

tf.keras.layer.Dense 클래스는 안에 뉴런 개수와 활성화 함수를 설정할 수 있는데, 뉴런 개수는 보통 2의 배수로 설정한다고 한다. 뉴런 개수는 임의로 64로 설정하겠다.

그리고 활성화 함수는 딥러닝에서 가장 많이 쓰이는 relu 함수로 설정하겠다.

근데 여기서 주의할 점이 있는데, 이번 모델은 대학원 합격 확률을 예측하는 모델이기에 마지막 층은 합격 / 불합격 의 이진 분류가 들어가야한다. 그러므로 뉴런은 1개만 써도 문제가 없고 결과값이 0과 1사이의 값으로 나와야하므로 sigmoid 함수를 사용해야 한다.

model = tf.keras.models.Sequential([  
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(64, activation='relu'), 
    tf.keras.layers.Dense(1, activation='sigmoid')

다음으로 옵티마이저, 손실 함수, 모델 평가 지표를 설정하겠다.

저번 시간에 코딩했던 것처럼 일일히 손실 함수를 코딩하는 등의 과정 없이, compile() 메소드를 사용하면 편하게 옵티마이저, 손실 함수, 모델 평가 지표를 설정 할 수 있다.

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

옵티마이저는 가장 많이 사용되는 adam, 그리고 결과값이 이진 분류여야하므로 이진 분류에 많이 사용되는 binary_crossentropy 손실 함수를 사용하고, 결과값이 정확한 확률을 보여주는 accuracy 모델 평가 지표를 사용한다.

다음으로, 저번 시간처럼 반복문을 작성하여 w값 등을 학습할 필요 없이 fit() 메소드를 사용하여 데이터를 학습하겠다.

fit() 메소드는 학습 데이터, 정답, 그리고 학습 반복 횟수 등을 지정할 수 있는데, 여기서 학습 데이터는 우리가 처음에 설정했던 gre, gpa, rank 데이터라고 할 수 있고, 정답은 admit 데이터라고 할 수 있다.

gre, gpa, rank와 admit이 하나의 값으로 대응되어야하므로
[ [ 380, 3.21, 3 ], [ 660, 3.67, 3 ], [ ] , [ ] ... ]
[ [ 0 ], [ 1 ], [ 1 ], [ 1 ], [ ] , [ ] ... ]
형태가 되어야 한다.

따라서 학습 데이터를 x, 정답을 y로 설정하겠다.

파이썬의 데이터 분석 라이브러리인 pandas를 활용하여, csv 형태로 작성된 데이터를 pandas로 들여오겠다.

import pandas as pd
data = pd.read_csv('gpascore.csv')
y = data['admit'].values
x = []

for i, rows in data.iterrows():
    x.append([rows['gre'], rows['gpa'], rows['rank']])

데이터 값을 data로 들여오고, data에서 admit열의 값들을 y값에 배정했고, x는 빈 리스트로 설정해둔 다음 반복문을 사용하여 해당 값들을 배정했다.

또한 epochs라는 학습 반복 횟수를 지정할 수 있는데, 임의대로 3000번으로 설정하겠다.

따라서 fit() 메소드를 완성하면,

model.fit( x, y, epochs=3000 )

여기서 문제가 있는데, fit() 메소드에서 학습 데이터와 정답은 텐서와 numpy 배열만 사용할 수 있다.

물론 파이썬 리스트를 사용해도 keras가 파이썬 리스트를 내부적으로 numpy 배열로 변환하려고 시도하지만, 변환이 실패할 가능성이 있어서 파이썬 리스트는 권고되지 않는다.

따라서 numpy를 import하고 x와 y를 numpy 배열로 바꿔주겠다.

model.fit( np.array(x), np.array(y), epochs=3000)

그리고 마지막으로, 임의의 학생 A와 B의 gre, gpa, rank 값으로 해당 대학원에 합격할 확률을 예측하게 만들어보겠다.

이 과정은 그냥 predict() 메소드를 사용하면 되는데,

예측값=model.predict( [ [ 750 , 3.70 , 3 ] , [ 400, 2.2, 1 ] ] ) 
print(예측값)

predict() 메소드 안에 임의의 x를 넣으면 y를 학습한 모델로 확률을 계산해준다.

위 코드를 돌려보면,

74%의 정확도로, A가 750의 GRE, 3,70의 GPA로 랭킹 3의 대학원에 합격할 확률은 약 60%, B가 400의 GRE, 2.2의 GPA로 랭킹 1의 대학원에 합격할 확률은 약 0.8% 임을 알 수 있다.

뉴런 수와 adam의 learning rate를 수정해주면서 학습 횟수를 비약적으로 증가시키면 더 높은 정확도를 가진 모델을 만들 수 있을 것이다.

0개의 댓글