[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋] 17์ฅ(5) - DCGAN, ProGAN, StyleGAN
๐ ์ด์ ๊ธ # ์์ฑ์ ์ ๋ ์ ๊ฒฝ๋ง, GAN์ด๋?
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋] 17์ฅ(4) - GAN, ์์ฑ์ ์ ๋ ์ ๊ฒฝ๋ง
[AI/Hands-on ML] - [ํธ์ฆ์จ ๋จธ์ ๋ฌ๋] 17์ฅ(3) - ๋ณ์ดํ ์คํ ์ธ์ฝ๋, Variational AutoEncoder [ํธ์ฆ์จ ๋จธ์ ๋ฌ๋] 17์ฅ(3) - ๋ณ์ดํ ์คํ ์ธ์ฝ๋, Variational AutoEncoder [AI/Hands-on ML] - [ํธ์ฆ์จ ๋จธ์ ๋ฌ๋]..
kdeon.tistory.com
17. 9. 2 ์ฌ์ธต ํฉ์ฑ๊ณฑ GAN, DCGAN
2014๋ ์๋ณธ GAN ๋ ผ๋ฌธ์์๋, ํฉ์ฑ๊ณฑ ์ธต์ ํตํด ์์ ์ด๋ฏธ์ง๋ง ์์ฑํ์๋ค.
๊ทธ ํ, ํฐ ์ด๋ฏธ์ง๋ฅผ ์ํด ๊น์ ํฉ์ฑ๊ณฑ ์ธต ๊ธฐ๋ฐ์ GAN์ ๋ง๋ค๊ธฐ ์ํด ๋ ธ๋ ฅํ์๊ณ ,
-> 2015๋ , ์ฌ๋ฌ ๊ตฌ์กฐ์ ํ์ดํผํ๋ผ๋ฏธํฐ ์คํ ๋์ ์ฌ์ธต ํฉ์ฑ๊ณฑ GAN (DCGAN) ์ด ์ ์๋์๋ค.
๐ ์์ ์ ์ธ ํฉ์ฑ๊ณฑ GAN์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ์ด๋๋ผ์ธ
- ํ๋ณ์์ ํ๋ง ์ธต์ ์คํธ๋ผ์ด๋ ํฉ์ฑ๊ณฑ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
- ์์ฑ์์ ํ๋ง ์ธต์ ์ ์น ํฉ์ฑ๊ณฑ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
- ์์ฑ์์ ํ๋ณ์์ ๋ฐฐ์น ์ ๊ทํ๋ฅผ ์ฌ์ฉํ๋ค.
- ๊น์ ์ธต์ ์ํด ์์ ์ฐ๊ฒฐ ์๋์ธต์ ์ ๊ฑฐํ๋ค.
- ์์ฑ์์ ๋ชจ๋ ์ธต์ ReLU ํ์ฑํ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
- ํ๋ณ์์ ๋ชจ๋ ์ธต์ LeakyReLU ํ์ฑํ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
-> ํญ์ ๋ง๋ ๊ฒ์ ์๋๋ฏ๋ก, ์ฌ๋ฌ ์คํ์ด ํ์ํ๋ค.
๐ DCGAN Generator Model
๋ ผ๋ฌธ์์ LSUN ๋ฐ์ดํฐ์ ์ ๋ชจ๋ธ๋งํ ๋ ์ฌ์ฉํ Generator ๊ตฌ์กฐ์ด๋ค.
- 100 dimensional uniform distribution Z ๊ฐ CNN์ ๊ฑฐ์น๊ธฐ ์ํด image ํน์ฑ ๋งต ํํ๋ก ๋ณํ๋๋๋ก Project and reshape ๊ณผ์ ์ ๊ฑฐ์น๋ค.
- 4๊ฐ์ fractionally-stride convolution ์ ๊ฑฐ์ณ ๋ง๋ค์ด์ง high level ํํ์ด 64x64 ํฝ์ ์ด๋ฏธ์ง๋ก ๋ณ๊ฒฝ๋๋ค.
- fully-connected ์ธต๊ณผ pooling์ธต์ ์ฌ์ฉ๋์ง ์๋๋ค.
๐ fractionally-stride convolution
- input์ padding์ ํ๊ณ convolution์ ํจ์ผ๋ก์จ ๊ธฐ์กด stride convolution๊ณผ ๋ฐ๋๋ก ์ถ๋ ฅ์ ํฌ๊ธฐ๋ฅผ ํค์ฐ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์ ์นํฉ์ฑ๊ณฑ๊ณผ ๊ฐ์ ์๋ฏธ๋ก, keras์ Conv2DTranspose ์ธต์ ์ฌ์ฉํ๋ฉด ๋๋ค.
ํจ์ MNIST DCGAN ๋ชจ๋ธ
codings_size = 100
# ์์ฑ์
generator = keras.models.Sequential([
keras.layers.Dense(7 * 7 * 128, input_shape=[codings_size]),
keras.layers.Reshape([7, 7, 128]),
keras.layers.BatchNormalization(),
keras.layers.Conv2DTranspose(64, kernel_size=5, strides=2, padding="SAME",
activation="selu"),
keras.layers.BatchNormalization(),
keras.layers.Conv2DTranspose(1, kernel_size=5, strides=2, padding="SAME",
activation="tanh"),
])
# ํ๋ณ์
discriminator = keras.models.Sequential([
keras.layers.Conv2D(64, kernel_size=5, strides=2, padding="SAME",
activation=keras.layers.LeakyReLU(0.2),
input_shape=[28, 28, 1]),
keras.layers.Dropout(0.4),
keras.layers.Conv2D(128, kernel_size=5, strides=2, padding="SAME",
activation=keras.layers.LeakyReLU(0.2)),
keras.layers.Dropout(0.4),
keras.layers.Flatten(),
keras.layers.Dense(1, activation="sigmoid")
])
gan = keras.models.Sequential([generator, discriminator])
์์ฑ์
- ์์ฑ์๋ ํฌ๊ธฐ 100์ ์ฝ๋ฉ์ ๋ฐ์ 6272์ฐจ์์ผ๋ก ํฌ์ํ๊ณ , ์ด ๊ฒฐ๊ณผ๋ฅผ 7x7x128 ํฌ๊ธฐ์ ํ ์๋ก ๋ฐ๊พผ๋ค.
- ํ ์๋ ๋ฐฐ์น ์ ๊ทํ๋ฅผ ๊ฑฐ์ณ stride๊ฐ 2์ธ ์ ์น ํฉ์ฑ๊ณฑ ์ธต์ ์ฃผ์ ๋๋ค.
- 7x7 -> 14x14 ๋ก ์ ์ํ๋ง, 128 -> 64 ๊น์ด ๊ฐ์
- ๋ค์ ๋ฐฐ์น ์ ๊ทํ๋ฅผ ๊ฑฐ์ณ stride๊ฐ 2์ธ ์ ์น ํฉ์ฑ๊ณฑ ์ธต์ ์ฃผ์ ๋๋ค.
- 14x14 -> 28x28 ๋ก ์ ์ํ๋ง, 64 -> 1 ๊น์ด ๊ฐ์
- tanh์ ์ฌ์ฉํ๋ฏ๋ก, ์ถ๋ ฅ ๋ฒ์๊ฐ -1์์ 1 ์ฌ์ด -> GAN ํ๋ จ ์ ํ๋ จ ์ธํธ๋ฅผ ๋์ผ ๋ฒ์๋ก ์ค์ผ์ผ ์กฐ์ ํ์
X_train = X_train.reshape(-1, 28, 28, 1) * 2. - 1. # ํฌ๊ธฐ ๋ณ๊ฒฝ๊ณผ ์ค์ผ์ผ ์กฐ์
- ํ๋ จ ์ธํธ ์ค์ผ์ผ์ ์กฐ์ ํ๋ค.
- ํฌ๊ธฐ ๋ณ๊ฒฝ ๋ฐ ์ฑ๋ ์ฐจ์์ ์ถ๊ฐ
ํ๋ณ์
- ์ด์ง ๋ถ๋ฅ๋ฅผ ์ํ ์ผ๋ฐ์ ์ธ CNN๊ณผ ๋น์ทํ ๊ตฌ์กฐ์ด์ง๋ง, ์ด๋ฏธ์ง๋ฅผ ๋ค์ด ์ํ๋งํ ๋ MaxPooling์ด ์๋ stride ํฉ์ฑ๊ณฑ์ ์ฌ์ฉํ๋ค. (+ LeakyRelu ์ฌ์ฉ)
โ๏ธ DCGAN ๊ฐ์ด๋๋ผ์ธ์์ ๋ณ๊ฒฝ๋ ์
- ํ๋ณ์์ BatchNormalization ์ธต -> Dropout ์ธต์ผ๋ก ๋ณ๊ฒฝ (ํ๋ จ์ ์์ ์ฑ์ ์ํจ)
- ์์ฑ์์์ ReLu๊ฐ ์๋ SELU ์ฌ์ฉ
-> ๊ตฌ์กฐ๋ฅผ ๋ฐ๊ฟ๋ณด๋ฉด์, ํ์ดํผํ๋ผ๋ฏธํฐ์ ๋ํ ๋ฏผ๊ฐ์ฑ์ ํ์ธํด๋ณผ ์ ์๋ค.
ํ๋ จ ๊ฒฐ๊ณผ
๋ฐ์ดํฐ์ ์์ฑ, ๋ชจ๋ธ ์ปดํ์ผ, ํ๋ จ์ ์ํด ์์์ ์ฌ์ฉํ ๋์ผํ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค. (์ด์ ๊ธ ์ฐธ๊ณ )
- ํ๋ จ epoch 50๋ฒ ํ์ ์์ฑ์๊ฐ ์์ฑํ ์ด๋ฏธ์ง ๊ฒฐ๊ณผ์ด๋ค.
๐ DCGAN์ ์ ์ฌ ํํ ํ์ต
DCGAN์ ๊ฝค ์๋ฏธ ์๋ ์ ์ฌ ํํ์ ํ์ตํ ์ ์๋ค.
- DCGAN์ด ์์ฑํ ๋ง์ ์ด๋ฏธ์ง ์ค ์ผ๋ถ์ด๋ค.
- ์ธ ์นดํ ๊ณ ๋ฆฌ(์๊ฒฝ์ ์ด ๋จ์, ์๊ฒฝ์ ์ฐ์ง ์์ ๋จ์, ์๊ฒฝ์ ์ฐ์ง ์์ ์ฌ์)์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ฝ๋ฉ์ ํ๊ท ํ๊ณ , ์ด ํ๊ท ์ฝ๋ฉ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ค.
-> ์ฆ, ์ผ์ชฝ ์๋ 3๊ฐ ์ด๋ฏธ์ง๋, ๊ทธ ์ 3๊ฐ ์ด๋ฏธ์ง์ ํ๊ท ์ ๋ํ๋ธ๋ค.
* ์ด๋ ํ๊ท ์, ํฝ์ ์์ค์ ๋จ์ํ ํ๊ท ๊ณ์ฐ์ด ์๋, ์ ์ฌ ๊ณต๊ฐ์์ ๊ณ์ฐ๋ ํ๊ท ์ด๋ค.
-> ๋ฐ๋ผ์ ์ด๋ฏธ์ง๊ฐ ์์ฐ์ค๋ฌ์ด ์ผ๊ตด์ฒ๋ผ ๋ณด์ผ ์ ์๋ ๊ฒ!
- ์๊ฒฝ์ ์ด ๋จ์์์ ์๊ฒฝ์ ์ฐ์ง ์์ ๋จ์๋ฅผ ๋นผ๊ณ , ์๊ฒฝ์ ์ฐ์ง ์์ ์ฌ์๋ฅผ ๋ํ์ฌ ์ด ์ฝ๋ฉ์ ๋์ํ๋ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ฉด ์ค๋ฅธ์ชฝ ์ค์๊ณผ ๊ฐ์ '์๊ฒฝ์ ์ด ์ฌ์' ์ด๋ฏธ์ง๋ฅผ ์ป์ ์ ์๋ค.
* ๊ฐ์ด๋ฐ ์ด๋ฏธ์ง๋ฅผ ๋๋ฌ์ผ 8๊ฐ์ ์ด๋ฏธ์ง๋, DCGAN์ ์๋งจํฑ ๋ณด๊ฐ ๋ฅ๋ ฅ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋์ผํ ๋ฒกํฐ์ ์ฝ๊ฐ์ ์ก์์ ์ถ๊ฐํด ์์ฑํ ๊ฒ์ด๋ค.
๐ก ํ์ง๋ง DCGAN์ผ๋ก ๋งค์ฐ ํฐ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ฉด, ์ผ๊ด์ฑ ์๋ ์ด๋ฏธ์ง๋ฅผ ์ป์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
DCGAN ์ดํ, ๋ค์ํ GAN ๋ ผ๋ฌธ์ด ์๊ฐ๋์๋ค.
17. 9. 3 ProGAN (PGGAN)
2018๋ ์๋น๋์์ ๋ ผ๋ฌธ์์ ์ ์๋์๋ค.
ํ๋ จ ์ด๊ธฐ์ ์์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ณ ์ ์ง์ ์ผ๋ก ์์ฑ์์ ํ๋ณ์์ ํฉ์ฑ๊ณฑ ์ธต์ ์ถ๊ฐํด ๊ฐ์๋ก ํฐ ์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
-> ์ ์ธต ์คํ ์ธ์ฝ๋๋ฅผ ์ธต๋ณ๋ก ํ๋ จํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค.
์ด์ ์ ํ๋ จ ๋ ์ธต์ ๊ทธ๋๋ก ๋๊ณ , ์์ฑ์์ ๋๊ณผ ํ๋ณ์์ ์์ ๋ถ๋ถ์ ์ธต์ ์ถ๊ฐํ๋ฉฐ ์์๊ฐ๋ค.
๐ ProGAN ๊ตฌ์กฐ
ํ๋ฒ์ ์ ์ฒด ํฌ๊ธฐ์ ์ด๋ฏธ์ง ํน์ฑ๋ค์ ํ์ต ์ํค๊ธฐ๋ณด๋ค, 4x4 ์ ํด์๋๋ก large-scale structure๋ฅผ ์ฐพ์๋ด๋๋ก ํ๊ณ , ์ ์ฐจ finer-scale detail์ ์ฐพ์ ์ ์๋๋ก 1024x1024 ๊ณ ํด์๋๋ก ๋์์ง๋ ๊ฒ์ด ๋ซ๋ค๋ ์์ด๋์ด์ด๋ค.
- ์์ฑ์์ ์ถ๋ ฅ์ 4x4์์ 8x8๋ก ํฌ๊ฒ ํ๋ ค๋ฉด, ๊ธฐ์กด ํฉ์ฑ๊ณฑ ์ธต์ ์ ์ํ๋ง ์ธต์ ์ถ๊ฐํ์ฌ 8x8 ํฌ๊ธฐ ํน์ฑ ๋งต์ ์ถ๋ ฅํ๋ค.
- ์ด ํน์ฑ ๋งต์ด ์๋ก์ด ๋ค์ ํฉ์ฑ๊ณฑ ์ธต์ผ๋ก ์ฃผ์ ๋๊ณ , ๋ค์ ์๋ก์ด ์ถ๋ ฅ ํฉ์ฑ๊ณฑ ์ธต์ผ๋ก ์ฃผ์ ๋๋ค.
- ๋คํธ์ํฌ์ ์๋ก์ด ์ธต์ ์ถ๊ฐํ ๋, ๋ถ๋๋ฝ๊ฒ ์ถ๊ฐํ๊ธฐ ์ํด ์๋ก์ด ํฉ์ฑ๊ณฑ์ธต์ fade-inํ๊ณ , ์๋ ์ถ๋ ฅ์ธต์ fade-outํ๋ค.
-> ์ ํ๋ จ๋ ์ธต์ ๊ฐ์์ค๋ฌ์ด ์ถฉ๊ฒฉ์ ๋ฐฉ์งํ๋ ํจ๊ณผ๊ฐ ์๋ค
- ์๋ก์ด ์ถ๋ ฅ ๊ฐ์ค์น a ์ ์๋ ์ถ๋ ฅ ๊ฐ์ค์น 1-a ์ ๊ฐ์ค์น ํฉ์ผ๋ก ์ต์ข ์ถ๋ ฅ์ ๋ง๋ ๋ค.
- ๋ชจ๋ ํฉ์ฑ๊ณฑ ์ธต์ 'same' stride 1 ์ ์ฌ์ฉํ์ฌ, ์ ๋ ฅ์ ๋์ด์ ๋๋น๋ฅผ ๋ณด์กดํ๋ค.
- ์ ๋ ฅ๊ณผ ๊ฐ์ ํฌ๊ธฐ์ ์ถ๋ ฅ์ ๋ง๋ ๋ค.
- ์ถ๋ ฅ์ธต์ ์ปค๋ ํฌ๊ธฐ๋ 1 -> ์ด๋ฅผ ์ฌ์ฉํด ์ ๋ ฅ์ ํ์ํ ์ปฌ๋ฌ ์ฑ๋ ์ (ex. 3)๋ก ํฌ์ํ๋ค.
ํด๋น ๋ ผ๋ฌธ์์๋ (๋ชจ๋๋ถ๊ดด๋ฅผ ๋ง๊ธฐ ์ํด) ์ถ๋ ฅ์ ๋ค์์ฑ์ ์ฆ๊ฐ์ํค๊ณ ํ๋ จ์ ์์ ์ ์ผ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ๋ค๋ ์๊ฐ๋๋ค.
โ๏ธ ๋ฏธ๋๋ฐฐ์น ํ์คํธ์ฐจ ์ธต
์ด์ ์ ์ธ๊ธํ๋ GAN ํ๋ จ์ ์ด๋ ค์ ์ค์, ์์ฑ์๊ฐ ๋ณํ๋๊ฐ ์ ์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํด ๋ด๋ ๊ฒฝํฅ(๋ฐ๋ผ์ ์์ฑ๋ ์ด๋ฏธ์ง์ ๋ค์์ฑ์ด ๋ถ์กฑํด์ง๋ ํ์)์ด ์กด์ฌํ๋ค. ์ด๋ ๊ณ ํด์๋ ์ด๋ฏธ์ง๋ฅผ ์์ฑํด๋ด๊ธฐ ์ด๋ ต๋๋ก ํ๋๋ฐ, ๋ฏธ๋๋ฐฐ์น ํ์คํธ์ฐจ ์ธต์ ํตํด ์ด ํ์์ ์ค์ผ ์ ์๋ค.
- ํ๋ณ์์ ๋ง์ง๋ง ์ธต ๊ทผ์ฒ์ ์ถ๊ฐํ๋ค.
- ์ ๋ ฅ์ ์๋ ๋ชจ๋ ์์น์ ๋ํด ๋ชจ๋ ์ฑ๋๊ณผ ๋ฐฐ์น์ ๋ชจ๋ ์ํ์ ๊ฑธ์ณ ํ์คํธ์ฐจ๋ฅผ ๊ณ์ฐํ๋ค.
- S = tf.math.reduce_std(inputs, axis=[0, -1])
- ์ด ํ์คํธ์ฐจ๋ ๋ชจ๋ ํฝ์ ์ ๋ํด ํ๊ท ํ์ฌ, ํ๋์ ๊ฐ์ ์ป๋๋ค.
- v = tf.reduce_mean(S)
- ์ถ๊ฐ์ ์ธ ํน์ฑ ๋งต์ด ๋ฐฐ์น์ ๋ชจ๋ ์ํ์ ์ถ๊ฐ๋๊ณ , ๊ณ์ฐ๋ ์ด ๊ฐ์ผ๋ก ์ฑ์์ง๋ค.
- tf.concat([inputs, tf.fill([batch_size, height, width, 1], v)], axis=-1)
-> ์์ฑ์๊ฐ ๋ง๋ ์ด๋ฏธ์ง์ ๋ค์์ฑ์ด ๋ถ์กฑํ๋ฉด, ํ๋ณ์์ ํน์ฑ ๋งต ๊ฐ์ ํ์คํธ์ฐจ๊ฐ ์์ ๊ฒ
-> ํ๋ณ์๋ ์ด ํต๊ณ๋ฅผ ํตํด ๋ค์์ฑ์ด ์ ์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ์์ฑ์์๊ฒ ์์ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ ๋ค.
=> ์ฆ, ์์ฑ์๊ฐ ๋ค์ํ ์ถ๋ ฅ์ ๋ง๋ค๋๋ก ์ ๋ํด ๋ชจ๋ ๋ถ๊ดด์ ์ํ์ ์ค์ธ๋ค.
โ๏ธ ๋์ผํ ํ์ต ์๋
์์ฑ์์ ํ๋ณ์์ healthyํ ๊ฒฝ์์ ์ํด์๋ ๊ฐ ์ธต์ด ๋น์ทํ ์๋๋ก ํ์ต๋๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค.
- He ์ด๊ธฐํ ๋์ , ํ๊ท ์ด 0์ด๊ณ ํ์คํธ์ฐจ๊ฐ 1์ธ ๊ฐ์ฐ์์ ๋ถํฌ๋ฅผ ์ฌ์ฉํด ๋ชจ๋ ๊ฐ์ค์น๋ฅผ ์ด๊ธฐํํ๋ค.
- ํ์ง๋ง ๋ฐํ์์(์ธต์ด ์คํ๋ ๋๋ง๋ค) He ์ด๊ธฐํ๋ฅผ ํตํด (๊ฐ์ค์น๋ฅผ √(2/n inputs) ๋ก ๋๋๋ค) ๊ฐ์ค์น ์ค์ผ์ผ์ ๋ฎ์ถ๋ค.
- ninputs ์ ์ธต์ ์ ๋ ฅ ๊ฐ์
- RMSProp, Adam ๊ฐ์ ์ ์์ ๊ทธ๋๋์ธํธ ์ตํฐ๋ง์ด์ ๋ฅผ ์ฌ์ฉํ๋ฉด, ์ด ๊ธฐ๋ฒ์ด ๋ GAN์ ์ฑ๋ฅ์ ๋์ธ๋ค.
-> ์ด ์ตํฐ๋ง์ด์ ๋ค์ ๊ฐ์ ์ถ์ ํ ํ์คํธ์ฐจ๋ก ๊ทธ๋๋์ธํธ ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ทํํ๋ค. ๊ทธ ๊ฒฐ๊ณผ,
- dynamic range๊ฐ ํฐ ํ๋ผ๋ฏธํฐ๋ ํ๋ จํ๋ ๋ฐ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฐ๋ค.
- ๋ฐ๋๋ก dynamic range๊ฐ ์์ ํ๋ผ๋ฏธํฐ๋, ๋๋ฌด ๋น ๋ฅด๊ฒ ์ ๋ฐ์ดํธ๋์ด ๋ถ์์ ํด์ง ์ ์๋ค.
- ์ฆ, ๊ฐ์ค์น ์ด๊ธฐํ์์ ์ค์ผ์ผ์ ๋ง์ถ์ง ์๊ณ , ๋ชจ๋ธ์ ํ ๋ถ๋ถ์ผ๋ก ๊ฐ์ค์น๋ฅผ ์กฐ์ ํ์ฌ ํ๋ จ ๋ด๋ด ๋ชจ๋ ํ๋ผ๋ฏธํฐ์ dynamic range๋ฅผ ๋์ผํ๊ฒ ๋ง๋ ๋ค.
=> ๋ชจ๋ ๊ฐ์ค์น๊ฐ ๋์ผํ ์๋๋ก ํ์ต๋์ด, ํ๋ จ ์๋์ ์์ ์ฑ์ด ๋์์ง๋ค.
๐ dynamic range
- ๋ณ์๊ฐ ์์ฉํ ์ ์๋ ๊ฐ์ฅ ํฐ ๊ฐ๊ณผ ์์ ๊ฐ ์ฌ์ด์ ๋น์จ
โ๏ธ ํฝ์ ๋ณ ์ ๊ทํ ์ธต
- ์์ฑ์์ ํฉ์ฑ๊ณฑ ์ธต ๋ค์ ์ถ๊ฐํ๋ค.
- ๋ง ๊ทธ๋๋ก ํฝ์ ๋จ์ ๋ณ๋ก ์ ๊ทํํด์ฃผ๋ ๊ฒ์ผ๋ก, ๋์ผํ ์ด๋ฏธ์ง์ ๋์ผ ์์น์ ์๋ ๋ชจ๋ ํ์ฑํ๋ฅผ ์ฑ๋์ ๋ํด ์ ๊ทํํ๋ค.
- ํ์ฑํ์ ์ ๊ณฑ ํ๊ท ์ ์ ๊ณฑ๊ทผ์ผ๋ก ๋๋๋ค.
- inputs / tf.sqrt(tf.reduce_mean(tf.square(X), axis=-1, keepdims=True)+1e-8)
=> ์์ฑ์์ ํ๋ณ์ ์ฌ์ด์ ๊ณผ๋ํ ๊ฒฝ์์ผ๋ก ํ์ฑํ ๊ฐ์ด ํญ์ฃผ๋๋ ๊ฒ์ ๋ง๋๋ค.
* ์ผ๋ฐ์ ์ผ๋ก GAN์ ์์ฑ์์ ํ๋ณ์์ ๋ถํ์ํ ๊ฒฝ์์ผ๋ก ํ์ฑํ ๊ฐ์ด ํญ์ฃผ๋๋ ๊ฒ์ ์ต์ ํ๊ธฐ์ํด Batch Normalization์ ์ฌ์ฉํ๋ค. ํ์ง๋ง PGGAN์ ์ด ๋ฐฉ๋ฒ์ด ํจ๊ณผ๊ฐ ์๊ธฐ ๋๋ฌธ์ ํฝ์ ์ ๊ทํ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
์ด๋ฐ ๊ธฐ๋ฒ๋ค์ ํตํด ๊ณ ํ์ง์ ์ผ๊ตด ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ ์์๋ค.
ํ์ง๋ง GAN์ ํ๊ฐ ๋ ์ด๋ ค์ด ๊ณผ์ ์ค ํ๋์ด๋ค.
๐ค ์์ฑ๋ ์ด๋ฏธ์ง์ ํ์ง์ ์ด๋ป๊ฒ ํ๋จํด์ผ ํ ๊น? ์ฌ๋์ด ์ง์ ํ๊ฐํ ์ ๋ฐ์ ์์๊น?
๋ค์ ์๊ฐ๋๋ ๋ ผ๋ฌธ์์๋, ์์ฑ๋ ์ด๋ฏธ์ง์ ํ๋ จ ์ด๋ฏธ์ง์ ์ ์ฌ๋๋ฅผ ์ธก์ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
17. 9. 4 StyleGAN
2018๋ , ์๋น๋์ ํ์ด ๋ค์ ์ต๊ณ ์์ค์ ๊ณ ํด์๋ ์ด๋ฏธ์ง ์์ฑ์ ์ํ StyleGAN ๊ตฌ์กฐ๋ฅผ ์๊ฐํ๋ค.
์์ฑ์์ Style Transfer ๊ธฐ๋ฒ์ ์ฌ์ฉํด, ์์ฑ๋ ์ด๋ฏธ์ง๊ฐ ํ๋ จ๋ ์ด๋ฏธ์ง์ ๊ฐ์ ๋ค์ํ ํฌ๊ธฐ์ ๊ตญ๋ถ์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ก ๋ง๋ค์๋ค. (์ด๋ ์์ฑ๋ ์ด๋ฏธ์ง์ ํ์ง์ ํฌ๊ฒ ๋์ฌ์ค๋ค.)
๐ StyleGAN ๊ตฌ์กฐ
ํ๋ณ์์ ์์คํจ์๋ ๊ทธ๋๋ก์ด๋ฉฐ, ์์ฑ์๋ง ๋ณ๊ฒฝ๋์๋ค.
์ด ๋ชจ๋ธ์ ๋๊ฐ์ง ๋คํธ์ํฌ๋ก ๊ตฌ์ฑ๋๋ค.
โ๏ธ ๋งคํ ๋คํธ์ํฌ
StyleGAN์ ์ ์ฌ ํํ z (=์ฝ๋ฉ)์ผ๋ก๋ถํฐ ์ง์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ์ง ์๊ณ , ๋งคํ ๋คํธ์ํฌ๋ฅผ ๊ฑฐ์น๋ค.
- 8๊ฐ์ MLP๊ฐ z๋ฅผ ๋ฒกํฐ w๋ก ๋งคํํ๋ค.
- ๋ฒกํฐ w๋ ์ฌ๋ฌ ์ํ ๋ณํ(A ๋ฐ์ค, ํ์ฑํ ํจ์๊ฐ ์๋ Dense ์ธต) ์ผ๋ก ์ ๋ฌ๋์ด ๋ฒกํฐ ์ฌ๋ฌ ๊ฐ๋ฅผ ์์ฑํ๋ค.
- ์ด ๋ฒกํฐ๋ ๋ฏธ์ธํ ํ ์ค์ฒ(ex. ๋จธ๋ฆฌ ์)๋ถํฐ ๊ณ ์์ค ํน์ฑ(ex. ์ด๋ฅธ, ์ด๋ฆฐ์ด)๊น์ง ๊ฐ๊ธฐ ๋ค๋ฅธ ์์ค์์ ์์ฑ๋ ์ด๋ฏธ์ง์ ์คํ์ผ์ ์ ์ดํ๋ค.
=> ์ฆ, ๋งคํ ๋คํธ์ํฌ๋ ์ฝ๋ฉ์ ์ฌ๋ฌ ์คํ์ผ ๋ฒกํฐ๋ก ๋งคํํ๋ ๊ฒ
โ๏ธ ํฉ์ฑ ๋คํธ์ํฌ
์ด๋ฏธ์ง์ ์์ฑ์ ์ฑ ์์ง๋ค.
- ์ด ๋คํธ์ํฌ๋ ์ผ์ ํ๊ฒ ํ์ต๋ ์ ๋ ฅ์ ๋ฐ๋๋ค.
- ์ด ์ ๋ ฅ์ ํฉ์ฑ๊ณฑ ์ฌ๋ฌ ๊ฐ์ ์ ์ํ๋ง ์ธต์ ํต๊ณผ์ํจ๋ค.
-> ์ด ๊ณผ์ ์์
1. ์ ๋ ฅ๊ณผ ๋ชจ๋ ํฉ์ฑ๊ณฑ ์ธต์ ์ถ๋ ฅ์ ์ก์์ด ์์ธ๋ค.
2. ์ก์์ด ์์ธ ๋ค์์ Adaptive Instance Normalization (AdaIN) ์ธต์ด ๋ค๋ฐ๋ฅธ๋ค. (๋ถ์์ ํ ํ์ต์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ถ๊ฐ)
๐ ์ฝ๋ฉ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ก์์ ์ถ๊ฐํ๋ ์ด์
์ฃผ๊ทผ๊นจ๋ ๋จธ๋ฆฌ์ ์ธ์ธํ ์์น์ฒ๋ผ ์ด๋ฏธ์ง์ ๋๋คํ ์ด๋ค ๋ถ๋ถ, ์ฆ ๋ฌด์์์ฑ์ด ์ด๊ธฐ GAN์์๋ ์ฝ๋ฉ์ด๋ ์์ฑ์ ์์ฒด์์ ๋ง๋ ๋๋คํ ์ก์์์ ์๋ค.
- ์ก์์ด ์ฝ๋ฉ์์ ์จ๋ค๋ ๊ฒ์, ์์ฑ์๊ฐ ์ฝ๋ฉ์ ํํ ๋ฅ๋ ฅ์ ์ก์์ ์ ์ฅํ๋ ๋ฐ ํ ์ ํ๋ค๋ ์๋ฏธ์ด๋ค.
- ๋ํ ์ด ์ก์์ด ๋คํธ์ํฌ๋ฅผ ํ๋ฌ ์์ฑ์์ ๋ง์ง๋ง ์ธต์ ๋๋ฌํด์ผํ๋ค. -> ์ด๋ ํ๋ จ ์๋๋ฅผ ๋๋ฆฌ๊ฒ ๋ง๋๋ ์ ์ฝ ์ฌํญ์ด ๋ ์ ์๋ค.
- ๋ํ ๊ฐ๊ธฐ ๋ค๋ฅธ ์์ค์์ ๋์ผํ ์ก์์ด ์ฌ์ฉ๋๋ค. -> ๋ฐ๋ผ์ ์ผ๋ถ ์ธ๊ณต์ ์ธ ์์๊ฐ ๋ํ๋ ์ ์๋ค.
=> ๋ณ๋์ ์ก์์ ์ถ๊ฐํ๋ฉด ์ด๋ฐ ์ด์๋ค์ ํด๊ฒฐํ ์ ์๋ค.
=> ์ฆ, ์ถ๊ฐ๋ ์ก์์ ์ฌ์ฉํด ์ด๋ฏธ์ง์ ๊ฐ ๋ถ๋ถ์ ์ ํํ ์์ ๋ฌด์์์ฑ์ ์ถ๊ฐํ ์ ์๋ค.
* ์ก์ ์ ๋ ฅ์ ํ๋์ ํน์ฑ ๋งต์ ํด๋นํ๋ ๊ฐ์ฐ์์ ์ก์์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๋ชจ๋ ํน์ฑ ๋งต์ผ๋ก ๋ธ๋ก๋์บ์คํ ๋๋ค. ๊ทธ ํ, ์ถ๊ฐ๋๊ธฐ ์ ์ ํ์ต๋ ํน์ฑ๋ณ ์ค์ผ์ผ๋ง ์ธ์๋ก ์กฐ์ ๋๋ค. ('B' ๋ฐ์ค)
โ๏ธ ๋ฏน์ฑ ๊ท์ (์คํ์ผ ๋ฏน์ฑ)
StyleGAN์์ ๋์ผํ ์ฝ๋ฉ z๊ฐ ๋งคํ ๋คํธ์ํฌ f๋ฅผ ํตํด์ ๋์จ W ํ๋๋ก ๊ณ์ ๋คํธ์ํฌ๋ฅผ ํ์ตํ๋ค๋ณด๋ฉด, ์๊ด๊ด๊ณ๊ฐ ๋ฐ์ํ ์ ์๋ค.
* ์๋ฅผ ๋ค์ด, ํ์ต ๋ฐ์ดํฐ์ ์์ ๋๋ฌผ๊ฒ ๋๋จธ๋ฆฌ์ธ ์ฌ๋์ด ํญ์ ์ ๊ธ๋ผ์ค๋ฅผ ์ฐฉ์ฉํ๊ณ ์๋ ๋ฐ์ดํฐ๊ฐ ์์๋,
GAN์ ํ์ต ๋ฐ์ดํฐ์ ๋ถํฌ์ ๋น์ทํ ๋ถํฌ๋ฅผ ํ์ตํ๋ค ๋ณด๋ ์์ฑ์๊ฐ "์ ๊ธ๋ผ์ค๋ฅผ ๋ ์ฌ๋ -> ๋๋จธ๋ฆฌ" ๋ผ๊ณ ์๊ด๊ด๊ณ๋ฅผ ๊ฐ๊ฒ ํ์ต์ด ๋์ด, ๋ฌด์กฐ๊ฑด ์ ๊ธ๋ผ์ค ๋ ์ฌ๋์ ๋๋จธ๋ฆฌ๋ก ์์ฑํ๋ ๊ณผ๋ ์ ํฉ์ด ๋ฐ์ํ ์ ์๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ผ์ ๋น์จ์ ์ด๋ฏธ์ง๋ฅผ ๋ ๊ฐ์ ๋ค๋ฅธ ์ฝ๋ฉ์ผ๋ก ์์ฑํ๋ ๊ธฐ๋ฒ์ ์ด์ฉํ๋ค.
- ์ฝ๋ฉ c1๊ณผ c2๊ฐ ๋งคํ ๋คํธ์ํฌ๋ฅผ ํต๊ณผํด ๋ ์คํ์ผ ๋ฒกํฐ w1, w2๋ฅผ ์์ฑํ๋ค.
- ๊ทธ ํ, ํฉ์ฑ ๋คํธ์ํฌ๊ฐ ์ด๋ฐ์๋ ์คํ์ผ w1์ผ๋ก, ํน์ layer ์ดํ๋ถํฐ๋ ์คํ์ผ w2์ ๋ฐํ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ค.
* ์ด๋, ์คํ์ผ์ด ๊ต์ฒด๋๋ layer๋ ๋งค๋ฒ ๋๋คํ๊ฒ ๊ฒฐ์ ๋๋ค
=> ์ด๋ ๋คํธ์ํฌ๊ฐ ์ฐ์๋ ๋ layer๊ฐ์ ์คํ์ผ์ด ์๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค๊ณ ๊ฐ์ ํ๋ ํ์์ ๋ฐฉ์งํ ์ ์๋ค.
- ๋ latent code A, B๋ก ๋ถํฐ ์์ฑ๋ ์ ์๋ ๋ ์ด๋ฏธ์ง ์ธํธ์
- ๋๋จธ์ง ์ด๋ฏธ์ง๋ค์ B๋ก ๋ถํฐ ํน์ ๋ ์คํ์ผ์ ๋ณต์ฌํ๊ณ , ๊ทธ ์ธ๋ A๋ก ๋ถํฐ ๋ณต์ฌ๋์ด ์์ฑ๋ ์ด๋ฏธ์ง๋ค
- B๋ก๋ถํฐ์ Coarse style ์ ๋ณต์ฌํ๋ฉด, B์ ํฌ์ฆ, ๋จธ๋ฆฌ ์คํ์ผ, ์ผ๊ตด ๋ชจ์, ์๊ฒฝ ๋ฑ high-level์ ์ธก๋ฉด์ด ๋ํ๋๋ ๋ฐ๋ฉด, finer ํน์ง์ ํด๋นํ๋ ๋ชจ๋ ์์(๋, ๋จธ๋ฆฌ์, ๋ฐ๊ธฐ) ๋ฑ์ A์ ์ ์ฌํ๋ค.
- ๋ฐ๋ฉด์ B๋ก๋ถํฐ Middle style์ ๋ณต์ฌํ๋ฉด, ์ผ๊ตด์ ์ธ๋ถ ํน์ง, ๋จธ๋ฆฌ ์, ๋(๊ฐ๊ฑฐ๋ ๋ฌ) ๋ฑ์ด B๋ก ๋ถํฐ, ํฌ์ฆ๋ ์ผ๊ตด ๋ชจ์, ์๊ฒฝ๋ฑ์ A๋ก๋ถํฐ ๋ณด์กด๋๋ค.
- ๋ง์ง๋ง์ผ๋ก B์ Fine style์ ๋ณต์ฌํ๋ฉด B๋ก๋ถํฐ ์ ๊ตฌ์ฑ๊ณผ ์ธ๋ถ ํน์ง๋ค์ ๊ฐ์ ธ์จ ๊ฒ์ ๋ณผ ์ ์๋ค.
๐ก ์ฑ ์์ ์๊ฐํ ๋ชจ๋ธ ์ธ์๋, GAN์๋ ์ด๋ฏธ ์์ฃผ ๋ง์ ๋ณ์ข ์ด ์๊ฐ๋์๋ค.
์ด๋ฒ ์ฅ์์๋ GAN์ ์ฃผ์ ์์ด๋์ด๋ฅผ ์ดํดํ๋๋ฐ ์ง์คํ๊ณ ,
์ถ๊ฐ๋ก GAN์ ์ง์ ๊ตฌํํด๋ณด๋ฉด ์ป์ ์ ์๋ ๊ฒ์ด ๋ง์ ๊ฒ์ด๋ค.
์ฐธ๊ณ
StyleGAN
https://blog.promedius.ai/stylegan_1/
https://blog.promedius.ai/stylegan_2/
PGGAN