1 개요
학습 모델을 설계하고 제작한다. 층을 쌓아서 제작하는 형태.
모델을 만드는 방법은 클래스를 사용하느냐 안하느냐, 연쇄형이냐 분산형이냐에 따라 4가지 방법이 있다.
1.1 예시와 사용
이미지 분류에 대한 모델은 다음과 같이 만들어진다.
의도 | 설명 | 방법 |
---|---|---|
모델 제작 | from tensorflow.keras import layers
# 입력 데이터 처리.
inputs = keras.Input(shape=(None, None, 3)) # 3개의 채널, 크기제한 없음.
x = CenterCrop(height=150, width=150)(inputs) # 이미지 크롭.
x = Rescaling(scale=1.0 / 255)(x) # 0~1 사이의 값으로 스케일링.
# 층 만들기.
x = layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(x) # 합성곱 레이어.
x = layers.MaxPooling2D(pool_size=(3, 3))(x) # 풀링층
x = layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(x)
x = layers.MaxPooling2D(pool_size=(3, 3))(x)
x = layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(x)
x = layers.GlobalAveragePooling2D()(x) # 평균풀링.
num_classes = 10
outputs = layers.Dense(num_classes, activation="softmax")(x) # 분류 갯수(num_classes)에 따라 분류한다.
# 모델 제작
model = keras.Model(inputs=inputs, outputs=outputs)
| |
모델 정보 보기 | 모델에 대한 요악정보를 볼 수 있다. | model.summary()
|
모델 교육 | 모델을 교육한다.
fit_generato 함수로 교육해야 한다. |
# 어떤 방식으로 교육할지 지정.
model.compile(optimizer=keras.optimizers.RMSprop(learning_rate=1e-3),
loss=keras.losses.CategoricalCrossentropy())
batch_size = 32 # 검증데이터의 배치사이즈에서도 공유해야 하기 때문에 변수로 지정.
callbacks = [ # 각 에포크마다 교육데이터를 저장한다.
keras.callbacks.ModelCheckpoint(
filepath='path/to/my/model_{epoch}',
save_freq='epoch')
]
# 사용할 데이터 지정.
dataset = tf.data.Dataset.from_tensor_slices((numpy_array_of_samples, numpy_array_of_labels)).batch(batch_size)
# 검증 데이터 설정.
val_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(batch_size)
# 모델 교육 및 검증. dataset 안에 배치사이즈를 지정해 담았다.
history = model.fit(dataset, epochs=1, callbacks=callbacks,
validation_data=val_dataset)
print(history.history) # 로스, 정확도 등의 데이터를 보여준다.
|
2 모델 제작
2.1 연쇄방식
keras.models.Sequential() 순차적으로 쌓일 모델 객체를 생성한다.
from keras.models import Sequential
from keras import layers # 층을 불러온다.
model = Sequential()
# 필요한 층을 더한다.
model.add(layers.LSTM(50, return_sequences=True, input_shape=(50,1))) # 50개 유닛을 갖는 LSTM층 생성.
# 50개 OUT.
model.add(layers.Dense(1, activation='linear')) # 일반 뉴런층 1개. 결과가 1개가 나온다.
# 1개 OUT.
model.compile(loss='mse', optimizer='rmsprop') # 손실함수 따위를 결정한다.
2.1.1 input
데이터별로 input의 형태가 달라진다.
의도 | 설명 | 방법 |
---|---|---|
이미지 | 가로세로 200인 이미지는 다음과 같이 변형해 사용된다.
(samples, height, width, channels) 혹은 (samples, channels, height, width)로 입력한다. |
images.reshape((이미지갯수, 200 * 200)) # 이미지를 1줄로 늘어놓겠다는 것.
images.astype('float32')/255 # 값을 0~1 사이로 정규화 한다. float32와 64의 차이는 무엇일까? |
동영상 | 이미지에 frame을 추가한다.
(samples, frame, height, width, channels) 형태. |
|
시계열 | (samples, timesteps, features) 형태로 입력한다. | |
텍스트 | 2만개의 단어를 가진 사전으로 만든 데이터셋으로 분석할 때, 500개 문서의 데이터셋은..
(500, 20000) 형태이다. |
2.1.2 레이블 변형
의도 | 설명 | 방법 |
---|---|---|
범주형 인코딩 | 레이블을 범주형으로 인코딩한다. | from keras.utils import to_categorical
lable = to_categorical(lable)
|
2.2 함수형 API 사용
함수형 API를 사용하면 다중 입력, 다중 출력을 갖는 모델을 만들 수 있다. 혹은 하나의 층을 여러 출력에서 공유할 수도 있고.
from keras import layers, models
input = layers.Input(shape(50,200,200))
x = layers.Dense(32, activation='relu')(Input)
output = layers.Dense(10, activation='softmax')(x)
model = models.Model(inputs=input, outputs=output) # 모델생성.
3 모델 교육
3.1 컴파일
모델을 어떻게 교육할 것인가에 대한 설정.
from keras import optimizers
model.compile(optimizer= 'rmsprop', # 어떻게 교육할 것인가.
loss= 'categorical_crossentropy', # 손실함수.
metrics= ['accuracy']) # 모니터링 지표.
3.2 교육
history = model.fit(x, y,
validation_data = (x_test, y_test),
batch_size = 10, # 한 번에 몇 개의 데이터를 묶어서 학습시킬 것인가.
epochs = 20, # 몇 번 학습시킬 것인가?
)
history.history 안의 loss, val_loss 등의 속성에 접근하여 교육 결과를 살펴볼 수 있다.
3.3 저장
4 모델평가
4.1 모델 검증
validation_data를 넣어 loss 검사를 할 수도 있지만...
validation_split를 0~1 사이로 넣으면, 데이터를 처리하기 전에 해당 비율만큼 마지막에서 떼내어 epoch가 끝나면 loss를 계산하는 데 쓰인다.
4.2 최종평가
모델을 훈련한 후 최종적으로 모델을 평가할 땐 evaluate를 사용한다.
test_loss, test_add = models.evaluate(test, lables)
4.3 시각화
다음과 같은 코드로 훈련의 결과를 시각화 할 수 있다.(각 에포크마다 loss가 어떻게 변하는지...)
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(loss) + 1)
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()
5 모델 저장과 불러우기
5.1 모델 저장
디렉터리 형태로 저장된다.
model.save('\경로\디렉토리명')
5.2 모델 불러오기
from keras.models import load_model
model = load_model('모델경로')
model.summary() # 불러온 모델 확인.