순차적인 층으로 구성돼 있고 하나의 입력츠응로 시작해 하나의 출력층으로 끝나는 모델
tf.keras.layers.Dense(units=52, activaton='relu', input_shape=(13,))
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras import Input
model = Sequential()
model.add(Input(shape=(28, 28)))
model.add(Dense(32, activation='relu'))
model.add(Dense(16, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.summary()
다중 입력층과 다중 출력층이 가능한 모델, 프로그래밍의 함수와 같이 모델의 입출력을 함수의 형태로 구별해 다양한 구조의 모델을 쉽고 빠르게 구현할 수 있음
from tensorflow.keras import Model
from tensorflow.keras.layers import concatenate
from tensorflow.keras.utils import plot_model
input_image = Input(shape=(784,), name='input_image')
input_csv = Input(shape=(13,), name='input_csv')
x1 = Dense(units=32, activation='relu', name='layer10')(input_image)
x1 = Dense(units=16, activation='relu', name='layer11')(x1)
output_image = Dense(units=10, activation='softmax', name='output_image')(x1)
x2 = Dense(units=16, activation='relu', name='layer20')(input_csv)
x2 = Dense(units=8, activation='relu', name='layer21')(x2)
output_csv = Dense(units=1, activation='sigmoid', name='output_csv')(x2)
x3 = concatenate([output_image, output_csv], name='layer30')
output = Dense(8, activation='sigmoid', name='output')(x3)
model=Model([input_image, input_csv], output, name='MODEL:Multiple Inputs')
model.summary()
plot_model(model, "mnist-model.png", show_shapes=True)
다중 입력을 해서 하나의 출력을 할 수도 있고, 한 입력에서 다중 출력을 할 수도 있습니다.
케라스의 모델 클래스를 상속받은 후 사용자가 세부적인 동작을 수정해 구현할 수 있는 방법
from tensorflow.keras import Model
class MnistModel(tf.keras.model):
def __init__(self):
super(MnistModel, self).__init__()
self.layers1 = Dense(32, activation='relu')
self.layers2 = Dense(16, activation='relu')
self.layers3 = Dense(10, activation='softmax')
def call(self, x):
x = self.layers1(x)
x = self.layers2(x)
x = self.layers3(x)
return x
model = MnistModel()
model(Input(shape=(784,)))
model.summary()
모델을 구성한 후에 학습하기 위해서는 컴파일을 진행해야합니다. 모델 컴파일이란 학습에 필요한 옵티마이저, 손실함수, 평가 지표를 설정하는 과정을 말합니다.
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
optimizer
: 경사하강법을 어떤 방법으로 사용할지 정함loss
: 모델이 훈련되는 동안 최소화될 값으로 주어진 문제에 대한 성공 지표
metrics
: 모니터링할 지표
from tensorflow.keras import datasets
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
mnist = datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255, x_test/255
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(32, activation='relu'),
Dense(16, activation='relu'),
Dense(10, activation='softmax'),
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x=x_train, y=y_train, epochs=1)
모델의 학습 과정 중에 모델의 시작과 끝, epochs의 시작과 끝, 배치의 시작과 끝에 호출할 수 있는 함수
EarlyStopping
: 과대적합을 방지하기 위해 사용from tensorflow.keras.callbacks import EarlyStopping
callback_EarlyStopping = EarlyStopping(monitor='val_loss', patience=5, verbose=1)
history = model.fit(x_train, y_train, validation_split=0.2, epochs=20, batch_size=1, callbacks=callback_EarlyStopping, verbose=1)
ModelCheckpoint
: 학습 시 모델 정보 및 가중치를 저장하는 콜백from tensorflow.keras.callbacks import EarlyStopping
callback_ModelCheckpoint = ModelCheckpoint(filepath='./ModelCheckpoint', monitor='val_loss', save_weights_only=True, save_best_only=True, verbose=1)
history = model.fit(x_train, y_train, validation_split=0.2, epochs=20, batch_size=1, callbacks=[callback_ModelCheckpoint], verbose=1)
TensorBoard
: 텐서보드를 사용한 손실 및 정확도를 추적, 시각화 할 수 있음from tensorflow.keras.callbacks import EarlyStopping
callback_TensorBoard = TensorBoard(log_dir='./logs', profile_batch=5)
history = model.fit(x_train, y_train, validation_split=0.2, epochs=20, batch_size=1, callbacks=[callback_TensorBoard], verbose=1)