인공지능

모두의 딥러닝 - 14장, 15장(베스트 모델 만들기, 선형 회귀 적용하기)

bluesunset 2025. 5. 13. 01:02

14,15장에서는 효율적인 학습을 위한 디테일적인 부분들을 다룬다.

먼저 14장에서는 와인 분류 데이터를 이용해 학습을 한다.

from keras.models import Sequential
from keras.layers import Dense
from sklearn.preprocessing import LabelEncoder

import pandas as pd
import numpy
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.utils import to_categorical

seed = 0
numpy.random.seed(seed)
tf.random.set_seed(seed)

df_pre = pd.read_csv('./wine.csv')
df = df_pre.sample(frac=1)
df['Wine'] = df['Wine']-1

dataset = df.values
X = dataset[:, 1:13].astype('float32')  # input features
Y = to_categorical(df['Wine']).astype('float32')

model = Sequential()
model.add(Dense(30,input_dim=12,activation='relu'))
model.add(Dense(12,activation='relu'))
model.add(Dense(8,activation='relu'))
model.add(Dense(3,activation='softmax'))

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

model.fit(X,Y,epochs=200,batch_size=200)

print("\n Accuracy: %.4f" %(model.evaluate(X,Y)[1]))

분류 모델이기 때문에 categorical을 loss로 사용하고, 은닉층들을 설계해서 학습을 시킨다.

import os

MODEL_DIR = './model/'
if not os.path.exists(MODEL_DIR):
  os.mkdir(MODEL_DIR)

modelpath = "./model/{epoch:02d}-{val_loss:.4f}.keras"

from keras.callbacks import ModelCheckpoint

checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss',
                               verbose=1,save_best_only=True)

model.fit(X, Y, validation_split=0.2, epochs=200, batch_size=200,
          verbose=0, callbacks=[checkpointer])

학습을 시킬 때 중간중간 모델을 저장하는 방법이다.

ModelCheckpoint라는 함수를 이용해서 저장할 수 있다.

from keras.callbacks import EarlyStopping


early_stopping_callback = EarlyStopping(monitor='val_loss',patience=100)
model.fit(X,Y,validation_split=0.33,epochs=1000,batch_size=500,
          callbacks=[early_stopping_callback])

EarlyStopping을 이용하면 학습에 발전이 없을 때 중간에 그만두게 설정할 수도 있다.

val_loss 값을 보면서 loss가 100으로 설정한 patience 만큼 학습을 해도 나아지지 않는다면 멈추게 하는 코드이다.

epoch를 1000으로 설정해서 143번 만에 earlystop이 진행된 결과이다.

 

15장은 선형 회귀 실습이다.

보스턴 집값 예측 데이터를 이용한다.

13열의 MEDV가 예측해야 할 집값이고 0~12열의 13가지 데이터를 이용한다.

 

from sklearn.model_selection import train_test_split
import numpy as np

seed = 0
numpy.random.seed(seed)
tf.random.set_seed(seed)

df = df.replace([np.inf, -np.inf], np.nan).dropna()

dataset = df.values
X = dataset[:,0:13]
Y = dataset[:,13]
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=seed)

model = Sequential()
model.add(Dense(30, input_dim=13, activation='relu'))
model.add(Dense(6, activation='relu'))
model.add(Dense(1))

model.compile(loss='mean_squared_error', optimizer='adam')

model.fit(X_train, Y_train, epochs=200, batch_size=10)

Y_prediction = model.predict(X_test).flatten()

for i in range(10):
  label = Y_test[i]
  prediction = Y_prediction[i]
  print("실제가격: {:.3f}, 예상가격: {:.3f}".format(label, prediction))

모델은 이렇게 구성했다.

하나의 값을 선형 회귀로 예측하는 것이기 때문에 출력층에 activation 함수는 없어도 된다.

loss가 확실히 줄어들고, 예측도 성공적으로 진행되었다.