"Keras:모델 제작"의 두 판 사이의 차이
둘러보기로 가기
검색하러 가기
잔글 (→개요) |
(→모델 교육) |
||
85번째 줄: | 85번째 줄: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | === input === | ||
+ | 데이터별로 input의 형태가 달라진다. | ||
+ | {| class="wikitable" | ||
+ | !의도 | ||
+ | !설명 | ||
+ | !방법 | ||
+ | |- | ||
+ | |이미지 | ||
+ | |가로세로 200인 이미지는 다음과 같이 변형해 사용된다. | ||
+ | (samples, height, width, channels) 혹은 (samples, channels, height, width)로 입력한다. | ||
+ | |images.reshape((이미지갯수, 200 * 200)) | ||
+ | images.astype('float32')/255 # 값을 0~1 사이로 정규화 한다. float32와 64의 차이는 무엇일까? | ||
+ | |- | ||
+ | |동영상 | ||
+ | |이미지에 frame을 추가한다. | ||
+ | (samples, frame, height, width, channels) 형태. | ||
+ | | | ||
+ | |- | ||
+ | |시계열 | ||
+ | |(samples, timesteps, features) 형태로 입력한다. | ||
+ | | | ||
+ | |- | ||
+ | |텍스트 | ||
+ | |2만개의 단어를 가진 사전으로 만든 데이터셋으로 분석할 때, 500개 문서의 데이터셋은.. | ||
+ | (500, 20000) 형태이다. | ||
+ | | | ||
+ | |} | ||
+ | |||
+ | === 레이블 변형 === | ||
+ | {| class="wikitable" | ||
+ | !의도 | ||
+ | !설명 | ||
+ | !방법 | ||
+ | |- | ||
+ | |범주형 인코딩 | ||
+ | |레이블을 범주형으로 인코딩한다. | ||
+ | |<syntaxhighlight lang="python"> | ||
+ | from keras.utils import to_categorical | ||
+ | |||
+ | lable = to_categorical(lable) | ||
+ | </syntaxhighlight> | ||
+ | |} | ||
= 모델 교육 = | = 모델 교육 = | ||
+ | |||
+ | == 컴파일 == | ||
+ | 모델을 어떻게 교육할 것인가에 대한 설정.<syntaxhighlight lang="python"> | ||
+ | model.compile(optimizer= 'rmsprop', # 어떻게 교육할 것인가. | ||
+ | loss= 'categorical_crossentropy', # 손실함수. | ||
+ | metrics= ['accuracy']) # 모니터링 지표. | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == 교육 == | ||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
model.fit(x, y, | model.fit(x, y, |
2021년 12월 2일 (목) 13:07 판
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))
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)
|
3 모델 교육
3.1 컴파일
모델을 어떻게 교육할 것인가에 대한 설정.
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를 계산하는 데 쓰인다.