7 Fri
๋ฅ๋ฌ๋ CNN ์๋ฒฝ ๊ฐ์ด๋ - Fundamental ํธ
Functional API ์ด์ฉํ์ฌ ๋ชจ๋ธ ๋ง๋ค๊ธฐ
Functional API๊ฐ ์ถฉ๋ถํ ์ฌ์ด๋ฐ Sequential์ด ๋๋ฌด ์ฝ๋ค๋ณด๋ Functional API๊ฐ ์ด๋ ต๋ค๋ ์ธ์์ด ์๊ธด๋ค.
์ฐ๋ฆฌ ๊ฐ์์์๋ Sequential์ ๊ฑฐ์ ์ฐ์ง ์์ ๊ฒ
Sequential vs Functional API
์ผ๋ฐ์ ์ผ๋ก Seq๋ฅผ ์ด์ฉํ๋ฉด ๋ชจ๋ธ์ ์ฝ๊ฒ ์์ฑํ ์ ์์
ํ์ง๋ง Keras ํ๋ ์์ํฌ์ ํต์ฌ์ Func์.
์ฒ์๋ถํฐ Func๋ก ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ฉ ๊ธฐ๋ฒ์ ์ ๋ค์ Seq๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํจ
Sequential
์ฒ์์๋ ์๋์ ๊ฐ์ด
model.add
๋ฅผ ์ฌ์ฉํ์ง๋ง ์์ฆ์Sequential
์์ ๋ฆฌ์คํธ ํํ๋ก ๋ด๋๋ค์ด ๋ Sequential์ ์ง๊ธ ์ ๋ ฅ์ด input layer์์ ์ค๋ ์ ๋ ฅ์ธ์ง other layer์์ ์ค๋ ์ ๋ ฅ์ธ์ง ์์ง ๋ชปํ๋ค.
๋ฐ๋ผ์ ์ด ๋ Flatten ๋ด๋ถ์
input_shape
๋ก ์ธ์๋ฅผ ๋ฐ์ผ๋ฉด์ input layer์์ ์ค๋ ์ธ์์ธ๊ฒ์ ํ์ธํ๋ค
Functional API
๋ฐ๋ฉด์ Functional API๋ ์ฝ๋ ํ ์ค์ ๋ ์ฐ๋ ๋์ Input layer์ ์กด์ฌ๋ฅผ ๋ช ์ํ๋ค.
Functional API ๊ตฌ์กฐ ์ดํดํ๊ธฐ - 01
Functional API์ ํ์์ฑ
์ ์ฒ๋ฆฌ ๋ก์ง์ ๊ฒฐ๊ณผ๊ณผ ์ด์ด์ง๋ ์ฒ๋ฆฌ ๋ก์ง์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ก ์ฃผ์ด์ง๋ Chain ํํ์ ํ๋ก๊ทธ๋๋ฐ ๊ตฌํ ๋ก์ง์ ์ ํฉ
conv_out_01=Conv2D(filter=32, kernel_size = 3
)(input_tensor
)
filter=32, kernel_size = 3
Functional API๋ฅผ ๊ตฌ์ฑํ๋ ์ฃผ์ ํ๋ผ๋ฏธํฐ
input tensor
Functional API์ ์ ๋ ฅ๋๋ ๋ฐ์ดํฐ๊ฐ
=> ํ์ดํผ ํ๋ฆฌ๋ฏธํฐ์ ์ธ์๋ฅผ ๋ฐ๋ก ๊ตฌ๋ถํด์ ๋ฐ๋ ๊ตฌ์กฐ์ธ ๋ฏ ์ถ๋ค
Sequential์ Functional API๋ฅผ ์ข ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํจ
Functional API ๊ตฌ์กฐ ์ดํดํ๊ธฐ - 02
Customํ Dense Layer ์์ฑ
outputs = CustomDense(10)(inputs)
10
์init
ํจ์๋ก ์ ๋ฌ๋์ดself.units == 10
์ด ๋๋ค.inputs
๋call
ํจ์๋ก ์ ๋ฌ๋๋ค์ด๊ฒ์ CustomDense๊ฐ
tf.keras.layers.layer
๋ฅผ ์์๋ฐ์์ ํ ์ ์๋ ๊ตฌ์กฐ__call__
๋๋ ๋ฉ์๋์ ๋์ผํ ๊ธฐ๋ฅ์ ํ๋ค
callable
์ธ์ ์ ๋ ฅ ๋ถ๋ถ์ ๋ณ๋๋ก ์ํํด๋ ๋ฌด๋ฐฉํ๋ค
Sequential Model์ ์๋ฆฌ
์์ ๊ฐ์ Seq๊ฐ ์๋ค๊ณ ํ์. ์ด๋ ์๋ ์ฝ๋์ฒ๋ผ ๊ตฌํ์ด ๋์ด์๋ค
์ฒซ ๋ ์ด์ด(
index == 0
)๋callable_input
์ ์๊ธฐ ์์ ์ผ๋ก ์ค์ ํ๋ฉฐ ๊ทธ ๋ค์ ๋ ์ด์ด๋ถํฐlayer(callable_inputs)
๋ก ์ค์ ํ๋ ๊ฒ์ ๋ณผ ์์๋ค.์ด ์ฝ๋๋ ๊ฐ๋จํ ๊ตฌ์กฐ์ด๊ณ ์ค์ ๋ก๋ ์กฐ๊ธ ๋ ๋ณต์กํ ์ฒ๋ฆฌ๋ค์ด ์๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ ์ Seq ์ญ์ Func API๋ก ๊ตฌ์ฑ๋์ด ์๋ค๋ ๊ฒ์ด๋ค.
Dense Layer๋ก Fashion MNIST ์์ธก ๋ชจ๋ธ Live Coding ์ผ๋ก ๊ตฌํ ์ ๋ฆฌ - 01
์ค์ต
Dense Layer๋ก Fashion MNIST ์์ธก ๋ชจ๋ธ Live Coding ์ผ๋ก ๊ตฌํ ์ ๋ฆฌ - 02
์ค์ต
Keras Callback ๊ฐ์
๋ํ์ ์ผ๋ก ํ์ต๋ฅ ์ ๋์ ์ผ๋ก ์กฐ์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
๊ทธ ์ด์ธ์๋ Epoch๊ฐ ๋์๊ฐ ๋ ๋์ ์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๊ฑด๋๋ฆฌ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค
๋ฑ๋ก๋ ์ ์๋ Callback ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค
ModelCheckpoint()
ReduceLROnPlateau()
LearningRateScheduler()
EarlyStopping()
TensorBoard()
Keras Callback ์ค์ต - ModelCheckpoint, ReduceLROnPlateau, EarlyStopping
ModelCheckpoint
์ฃผ๊ธฐ์ ์ผ๋ก ๋ชจ๋ธ์ ํ์ผ๋ก ์ ์ฅํ๋ ๊ฒ
๋ชจ๋ธ์ด ๋์๊ฐ๋๋ฐ 6์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๊ณ ํ๋ฉด ๋งค๋ฒ ๋ชจ๋ธ์ ๋๋ฆด ์ ์์ผ๋ ํ์ต๋ ๋ชจ๋ธ์ ํ์ผ๋ก ์ ์ฅํ๊ฒ ๋๋ค
์ด ๋ ํ์ต์ด ๋๋๊ณ ๋ชจ๋ธ์ ์ ์ฅํ ์๋ ์์ง๋ง ์ฃผ๊ธฐ์ ์ผ๋ก ํ๊ฒ ๋๋ค
์๋ํ๋ฉด, ๋ชจ๋ธ์ด ๋๋ค๊ฐ ๋ฆฌ์์ค ๋ถ์กฑ์ผ๋ก ์ข ๋ฃ๋ ์๋ ์๊ณ ํ์ต์ด ๋๋ ์์ ์ด ๋ชจ๋ธ์ด ์ต๊ณ ์ฑ๋ฅ์ ๋ด๋ ์ง์ ์ ์ง๋ฌ์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค
ํน์ ์กฐ๊ฑด์ ๋ง์ถฐ์ ๋ชจ๋ธ์ ํ์ผ๋ก ์ ์ฅ
filepath: filepath๋ (on_epoch_end์์ ์ ๋ฌ๋๋) epoch์ ๊ฐ๊ณผ logs์ ํค๋ก ์ฑ์์ง ์ด๋ฆ ํ์ ์ต์ ์ ๊ฐ์ง ์ ์์. ์๋ฅผ ๋ค์ด filepath๊ฐ weights.{epoch:02d}-{val_loss:.2f}.hdf5๋ผ๋ฉด, ํ์ผ ์ด๋ฆ์ ์ธ๋ ๋ฒํธ์ ๊ฒ์ฆ ์์ค์ ๋ฃ์ด ๋ชจ๋ธ์ ์ฒดํฌํฌ์ธํธ๊ฐ ์ ์ฅ
monitor: ๋ชจ๋ํฐํ ์งํ(loss ๋๋ ํ๊ฐ ์งํ)
save_best_only: ๊ฐ์ฅ ์ข์ ์ฑ๋ฅ์ ๋ํ๋ด๋ ๋ชจ๋ธ๋ง ์ ์ฅํ ์ฌ๋ถ
100๊ฐ๋ฅผ ๋ค ์ ์ฅํด๋๋ฉด ์ฉ๋์ด ๋๋ฌด ํฌ๋๊น ๊ฐ์ฅ ์ข์ ์ฑ๋ฅ์ ๋ชจ๋ธ๋ง ์ ์ฅํ ์ง์ ๋ํ ์ฌ๋ถ
save_weights_only: Weights๋ง ์ ์ฅํ ์ง ์ฌ๋ถ
๋ณดํต์ ๋ชจ๋ธ๋ณด๋ค weights๋ง์ ์ ์ฅํ๋ ๊ฒ์ด ์ข๋ค
True๋ก ์ค์ ํ๋ ๊ฒ์ด ์ข์
mode: {auto, min, max} ์ค ํ๋. monitor ์งํ๊ฐ ๊ฐ์ํด์ผ ์ข์ ๊ฒฝ์ฐ min, ์ฆ๊ฐํด์ผ ์ข์ ๊ฒฝ์ฐ max, auto๋ monitor ์ด๋ฆ์์ ์๋์ผ๋ก ์ ์ถ.
val-loss๋ val-accuracy์ ์ฑ๋ฅ ์งํ๋ loss๊ฐ์ ๊ฒฝ์ฐ๋ ์์ ์๋ก ์ข๊ณ accuracy๋ ํด์๋ก ์ข๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์งํ์ ๋ง์ถ์ด max, min, auto๋ก ์ค์
period : ๋ช epoch๋ง๋ค ์ ์ฅํ ์ง
ReduceLROnPlateau
Plateau๋
์์ ๊ธฐ์ ๋ฌํ๋ค ๋ผ๋ ๋ป
OnPlateau : ์์ ์ ์ด๊ฒ ๋ ๋๊น์ง
LR : ์๋ฌ๋ฅผ
Reduce : ๊ฐ์์์ผ๋ผ
๋ผ๋ ๋ป
ํน์ epochs ํ์๋์ ์ฑ๋ฅ์ด ๊ฐ์ ๋์ง ์์ ์ Learning rate๋ฅผ ๋์ ์ผ๋ก ๊ฐ์ ์ํด
monitor: ๋ชจ๋ํฐํ ์งํ(loss ๋๋ ํ๊ฐ ์งํ)
factor: ํ์ต ์๋๋ฅผ ์ค์ผ ์ธ์. new_lr = lr * factor
patience: Learing Rate๋ฅผ ์ค์ด๊ธฐ ์ ์ monitorํ epochs ํ์.
mode: {auto, min, max} ์ค ํ๋. monitor ์งํ๊ฐ ๊ฐ์ํด์ผ ์ข์ ๊ฒฝ์ฐ min, ์ฆ๊ฐํด์ผ ์ข์ ๊ฒฝ์ฐ max, auto๋ monitor ์ด๋ฆ์์ ์ ์ถ.
EarlyStopping
ํ๋ จ ๋ฐ์ดํฐ์ ์ค๋ฅ๋ ์ค์ง๋ง ๊ฒ์ฆ ๋ฐ์ดํฐ์ ์ค๋ฅ๋ ์ฆ๊ฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ์ ๋์ ํ์ต์ด ์งํ๋๋ฉด ๋ฉ์ถ๋ ํจ์
ํน์ epochs ๋์ ์ฑ๋ฅ์ด ๊ฐ์ ๋์ง ์์ ์ ํ์ต์ ์กฐ๊ธฐ์ ์ค๋จ
monitor: ๋ชจ๋ํฐํ ์งํ(loss ๋๋ ํ๊ฐ ์งํ)
patience: Early Stopping ์ ์ฉ ์ ์ monitorํ epochs ํ์.
mode: {auto, min, max} ์ค ํ๋. monitor ์งํ๊ฐ ๊ฐ์ํด์ผ ์ข์ ๊ฒฝ์ฐ min, ์ฆ๊ฐํด์ผ ์ข์ ๊ฒฝ์ฐ max, auto๋ monitor ์ด๋ฆ์์ ์ ์ถ.
๋ณดํต์ ํ๋์ฉ ์ฐ์ง ์๊ณ ๋ชจ๋ ํ๊บผ๋ฒ์ ๋ค ์ด๋ค.
model.fit(callbacks=[])
๋ก callback ํจ์๋ค์ ์ ์ฉ์์ผ์ค ๋ชจ์ต์ ๋ณผ ์ ์๋ค
Numpy array์ Tensor ์ฐจ์ด, ๊ทธ๋ฆฌ๊ณ fit() ๋ฉ์๋ ์์ธ ์ค๋ช
Numpy ํน์ง
SIMD, Single Instruction Multiple Data ๊ธฐ๋ฐ์ผ๋ก ์ํ์๋๋ฅผ ์ต์ ํ ํ ์ ์๊ณ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋๋ ๋ฐ์ดํฐ์ ์์น ์ฐ์ฐ์ ์ํํ ์ ์๋ค
simd๋ ๋ช ๋ น ํ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค๋ ๋ป
๋ํ์ด๊ฐ ์์๋ค๋ฉด ํ์ด์ฌ์ ๋จธ์ ๋ฌ๋ ์ด์ฉ์ ๋ถ๊ฐ๋ฅ
SIMD
๋ณ๋ ฌ ํ๋ก์ธ์์ ํ ์ข ๋ฅ๋ก, ํ๋์ ๋ช ๋ น์ด๋ก ์ฌ๋ฌ๊ฐ์ ๊ฐ์ ๋์์ ๊ณ์ฐํ๋ ๋ฐฉ์
๋น๋์ค ๊ฒ์, ์ปดํจํฐ ๊ทธ๋ํฝ์ค, HPC, High Performance Computing ๋ฑ์ ๋ค์ํ ๋ถ์ผ์์ ํ์ฉ
Numpy Array vs Tensor
Numpy
Numpy๋ GPU๋ฅผ ์ง์ํ์ง ์์
๋ณด๋ค ๋ฒ์ฉ์ ์ธ ์์ญ(์ด๋ฏธ์ง ์ฒ๋ฆฌ, ์์ฐ๊ณผํ/๊ณตํ)์์ ์ฒ๋ฆฌ
Tensor
Tensor๋ CPU์ GPU๋ฅผ ๋ชจ๋ ์ง์ํ๋ค
๋ฅ๋ฌ๋ ํ์ต์ CPU SIMD ๊ธฐ๋ฐ์ Numpy๋ก๋ ๊ฐ๋นํ ์ ์์ ์ ๋์ ๋ง์ ์ฐ์ฐ์ด ํ์
๋ฅ๋ฌ๋ ํ์ต์ ์ํด GPU๊ฐ ํ์
๋ฅ๋ฌ๋ ์ ์ฉ์ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์
Tensorflow/Keras, Pytorch ๋ฑ์ ๋ฅ๋ฌ๋ ํ๋ ์์ํฌ ๋ณ๋ก ๊ธฐ๋ฅ์ ์ธ ํน์ฑ์ ๋ฐ์ํ ์ถ๊ฐ ๊ธฐ๋ฅ๋ค์ด ์์
์ต๊ทผ ์ถ์ธ๋ Numpy์ ๋ฒ์ฉ์ ์ธ ์์ญ๊น์ง ์ฒ๋ฆฌ ์์ญ์ ํ์ถฉํ๊ณ ์์
๋ชจ๋ธ
๋ชจ๋ธ์ ์ ๋ ฅ๋๋ ์ธ์๋ np.array ์ด๋ค.
์ด ๋ ๋ชจ๋ธ์ Input layer์์ np -> tensor๋ก ๋ณํํ๋ค.
๋ฐ๋ผ์ Flatten layer์์์ ์ ๋ ฅ์ ์ด๋ฏธ tensor์ด๋ค.
Last updated
Was this helpful?