Keras:모델 제작

Pywiki
Sam (토론 | 기여)님의 2021년 12월 2일 (목) 17:48 판 (→‎input)
둘러보기로 가기 검색하러 가기

1 개요

학습 모델을 설계하고 제작한다. 층을 쌓아서 제작하는 형태.

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()
모델 교육 모델을 교육한다.
# 어떤 방식으로 교육할지 지정.
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 Sequential 사용

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 사용

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 교육

model.fit(x, y,
    validation_data = (x_test, y_test),
    batch_size = 10,    # 한 번에 몇 개의 데이터를 묶어서 학습시킬 것인가.
    epochs = 20,        # 몇 번 학습시킬 것인가?
    )

4 모델 검증

validation_data를 넣어 loss 검사를 할 수도 있지만...

validation_split를 0~1 사이로 넣으면, 데이터를 처리하기 전에 해당 비율만큼 마지막에서 떼내어 epoch가 끝나면 loss를 계산하는 데 쓰인다.