(์ด๋ฒ ํ๋ก์ ํธ ์ฝ๋๋ ํจ์บ ๋ฅ๋ฌ๋ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ ์ฝ๋์ด๋ค)
<์ด์ ํฌ์คํ
>
https://silvercoding.tistory.com/3
[MNIST ํ๋ก์ ํธ] 1. MNIST ๋ฐ์ดํฐ ์์๋ณด๊ธฐ
(์ด๋ฒ ํ๋ก์ ํธ ์ฝ๋๋ ํจ์บ ๋ฅ๋ฌ๋ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ ์ฝ๋์ด๋ค) ์ค๋ ์์๋ณผ ๋ฐ์ดํฐ๋ ๋ฅ๋ฌ๋ ์ ๋ฌธ ๋ ๋ฌด์กฐ๊ฑด ๋ฐฐ์ฐ๋ ์ ๋ช ํ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ธ MNIST ๋ฐ์ดํฐ์ ์ด๋ค. ์ฌ์ง๊ณผ ๊ฐ์ด ์์ผ๋ก ์ง์ ์ด ์ซ์
silvercoding.tistory.com
์ด๋ฒ์๋ RNN๋ชจ๋ธ๋ง์ ์ํ MNIST ๋ฐ์ดํฐ์
์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋ชจ๋ธ๋ง๋ ์ค์ํ์ง๋ง ์ด๋ฏธ ํ๋ฅญํ์ ๋ถ๋ค์ด ๋ง๋ค์ด ๋์ ์ฑ๋ฅ ์ข์ ๋ชจ๋ธ๋ค์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ ์์ ๋ฅ๋ฌ๋์์๋ ์ ์ฒ๋ฆฌ ๋ํ ์ค์ํ ๋ถ๋ถ์ธ ๊ฒ ๊ฐ๋ค.
์ฐ์ ์ค๊ฐ์ค๊ฐ์ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ ํ์
, ๋ฒ์๋ฅผ ํ์ธํ๋ ๊ฒ์ด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ฐ์ ์ค์ํ ์ต๊ด์ด๋ผ๊ณ ํ๋ค. ๋์ค์ ๋ชจ๋ ๋ถ์์ ๋๋๋๋ฐ ๊ฐ์๊ธฐ ์์๋ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ ๊ฒ์ ์๊ฒ๋๋ ๊ฒฝ์ฐ๊ฐ ์ค์ ๋ก ์ผ์ด๋ ์ ์๊ณ , ๋ฐ๋ผ์ ์ด๋ฅผ ๋๋นํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์ฒ๋ฆฌ ์์
(1) ๋ฐ์ดํฐ์ ๋ฒ์ ํ์ธ
์ ๋ฒ์๊ฐ์ MNIST๋ฐ์ดํฐ๋ 0-255๋ก ์ด๋ฃจ์ด์ ธ ์๋ uint8 ๋ฐ์ดํฐ์์ ์์๋ค. ๋ฐ๋ผ์ ๋ง๋์ง ํ์ธํด ๋ณด๋๋ก ํ์.
- 0์ด ์๋ ์ซ์ ์ถ๋ ฅ
print(list(filter(lambda x: x != 0, train_images[0].reshape(-1)))[:50])
print(list(filter(lambda x: x != 0, test_images[0].reshape(-1)))[:50])
MNIST์ด๋ฏธ์ง์์ ๋ฐฐ๊ฒฝ๋ถ๋ถ์ ๋ชจ๋ 0์ด์๋ค. ๊ทธ๋ ๊ธฐ์ 0์ด ์๋ ์ซ์๋ค๋ง ์ถ๋ ฅํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ์ธํด๋ณด์. ๋๋ฌด ๋ง์ผ๋ 50๊ฐ๊น์ง๋ง ์ถ๋ ฅํ์ฌ ํ์ธํ๋ค.
- ์ต๋๊ฐ, ์ต์๊ฐ ์ถ๋ ฅ
print(max(train_images.reshape(-1)), min(train_images.reshape(-1)) )
print(max(test_images.reshape(-1)), min(test_images.reshape(-1)) )
์ด๋ฒ์ train๊ณผ test์ด๋ฏธ์ง ์ ์ฒด ์ซ์์ค์์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ถ๋ ฅํด๋ณด์๋ค. ๋๋ค 255 0 ์ด ๋์จ๋ค๋ฉด ์ด์์์!
(2) data type ๋ณ๊ฒฝํ๊ธฐ (์ ์ํ -> ์ค์ํ)
๋ฅ๋ฌ๋์ ๋๋ถ๋ถ 0๊ณผ 1์ฌ์ด์ ์ค์ํ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋๊ฒ ํจ์จ์ ์ด๋ฏ๋ก ์ ์ํ์ด์๋ MNIST๋ฐ์ดํฐ๋ฅผ ์ค์ํ์ผ๋ก ๋ฐ๊พธ์ด์ฃผ๋ ์ ์ฐจ๊ฐ ํ์ํ๋ค.
test_images = test_images.astype(np.float64)
train_images = train_images.astype(np.float64)
astype ํจ์๋ก ํ์
์ ๋ฐ๊พธ์ด์ค ์ ์๋ค. ์์๊ฐ์ด ์์ฑํ์ฌ uint8 -> float64 ๋ฐ์ดํฐ ํ๋ณํ์ ํด๋ณด์๋ค.
๋ค์ ์์์ ํด๋ณด์๋ dtype์ผ๋ก ์ฐ์ด๋ณด๋ฉด float64๋ก ๋ฐ๋ ๊ฒ์ ์ ์ ์๋ค.
(3) normalize (์ ๊ทํ) ํ๊ธฐ
normalize์์
์ ํ์ฌ 0~1 ์ ๊ฐ์ ๊ฐ์ง๋๋ก ๋ณํํด์ฃผ๋๋ก ํ์.
์์ ๋ค์๊ณผ ๊ฐ๋ค.
normalize(x) = x - ์ต์๊ฐ / ์ต๋๊ฐ - ์ต์๊ฐ
normalize(x) = x / ์ต๋๊ฐ (์ต์๊ฐ์ด 0์ผ ๋ : ์ง๊ธ ๋ฐ์ดํฐ์
์ ๊ฒฝ์ฐ)
ํ์ฌ MNIST ๋ 0-255 ์ ์ซ์์ด๋ฏ๋ก ๋ฐ์ ์์ ๋ฐ๋ฅด๋ฉด ๋๋ค.
train_images = train_images / 255
test_images = test_images / 255
๊ฐ๋จํ ์ต๋๊ฐ์ผ๋ก ๋๋์ด์ฃผ๋ฉด 0-1์ฌ์ด์ ๋ฐ์ดํฐ ๊ฐ์ผ๋ก ๋ณํ์ด ๋ ๊ฒ์ด๋ค.
์ด์ฏค์์ ์์์ ์์ฑํ๋ ์ฝ๋๋ค์ ๋ณต๋ถํ์ฌ ๋ฒ์, ๋ฐ์ดํฐํฌ๊ธฐ, ๋ฐ์ดํฐ ํ์
์ ๋ชจ๋ ํ์ธํ๊ณ ๋์ด๊ฐ์!
๋ฒ์ 0-1, ๋ฐ์ดํฐํฌ๊ธฐ ์๊ณผ ๋์ผ, ์ด๋ฏธ์ง ๋ฐ์ดํฐ ํ์
float64, ๋ผ๋ฒจ ๋ฐ์ดํฐ ํ์
uint8 ์ด๋ฉด ๋ชจ๋ ์ ์.
***์ด๋ฏธ์ง ์ฌ๋ฌ์ฅ ์๊ฐํ
์ ๋ฒ์๊ฐ์๋ ํ๋ฏ์ด ์ด๋ฏธ์ง ํ๋๋ฅผ ์๊ฐํ ํ๋ ๊ฒ์ ์ด๋ ต์ง ์์๋ค. ๊ทธ๋ฅ (28, 28) ์ด๋ฏธ์ง ํ ์ฅ์ด์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฐ๋ฐ ํ๋ฒ์ 5์ฅ์ ์๊ฐํ ํ๋ ค๊ณ ํ ๋๋ train_image[:5] ๋ฅผ ๋ฝ์์ ์๊ฐํํ๊ฒ ๋๋ฉด ์ค๋ฅ๊ฐ ๋๋ค.
plt.imshow(train_images[:5])
TypeError: Invalid shape (5, 28, 28) for image data
์ด๋ ๊ฒ ํ๋ฉด image data๋ก ์ธ์ ํ์ง ๋ชปํ๋ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ (28, 5 * 28) ํํ๋ก ๋ณํํด์ฃผ์ด์ผ ํ๋ค. (์ด ํํ ๋ณํ์ ๋ํด์๋ ๋์ค์ ์์ธํ ํฌ์คํ
ํด์ผ๊ฒ ๋ค.)
- numpy ์ hstack ์ฌ์ฉ
np.hstack(train_images[:5]).shape
- transpose ํจ์ ์ฌ์ฉ
train_images[:5].transpose( (1, 0, 2) ).reshape(28, -1)
hstack์ด ๋ ๊ฐ๊ฒฐํด ๋ณด์ด์ง๋ง numpy์ ํจ์์ด๋ฏ๋ก ํ์ ์ ์ด๋ค. tensorflow ์์ ์ ๊ณตํ๋ transpose๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์์ ์ ์ด๋ค. transpose๋ ์์น๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ํจ์์ด๋ค. transpose((1, 0, 2)) : (0, 1, 2) -> (1, 0, 2) : 1๋ฒ์งธ ์๋ฆฌ๋ฅผ 0๋ฒ์งธ ์๋ฆฌ๋ก, 0๋ฒ์งธ ์๋ฆฌ๋ฅผ 1๋ฒ์งธ ์๋ฆฌ๋ก, 2๋ฒ์งธ ์๋ฆฌ๋ 2๋ฒ์งธ ๊ทธ๋๋ก ๋๋ค๋ ์๋ฏธ
์ด์ ์ด๋ ๊ฒ ํด์ plt.imshow()์ ๋ฃ์ด์ฃผ๋ฉด
์ค๋ฅ์์ด ์๊ฐํ๊ฐ ์ ๋๋ค!
์ด๋ฒ์๋ MNIST ๋ฐ์ดํฐ์
์ ์ฒ๋ฆฌ, ์ฌ๋ฌ์ฅ ์๊ฐํ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์๋ค. ๋ค์์๋ ์ด๋ฏธ์ง์ ๋
ธ์ด์ฆ ์ถ๊ฐํ ํ ๋๋ง์ ๋ชจ๋ธ๋ง์ ํ์ฌ ์๊ธ์จ๋ฅผ ๋ถ๋ฅํด๋ณด๋ ์์
๊น์ง ๋ง์น๋๋ก ํ๊ฒ ๋ค.
'๋ฐ์ดํฐ ๋ถ์ ์ด๋ก > ๋ฅ๋ฌ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[celeba ํ๋ก์ ํธ] 2. celeba ๋ฐ์ดํฐ์ ์ ์ฒ๋ฆฌ, ์๊ฐํ (0) | 2021.06.07 |
---|---|
[celeba ํ๋ก์ ํธ] 1. celeba ๋ฐ์ดํฐ ์ดํด๋ณด๊ธฐ (0) | 2021.06.07 |
[MNIST ํ๋ก์ ํธ] 3. Noise ์ถ๊ฐ, RNN ๋ชจ๋ธ๋ง (0) | 2021.06.07 |
[MNIST ํ๋ก์ ํธ] 1. MNIST ๋ฐ์ดํฐ ์์๋ณด๊ธฐ (0) | 2021.06.07 |
๋ฅ๋ฌ๋์ ๋ํ์ฌ (0) | 2021.05.24 |