(이번 ν”„λ‘œμ νŠΈ μ½”λ“œλŠ” 패캠 λ”₯λŸ¬λ‹ κ°•μ˜λ₯Ό μ°Έκ³ ν•œ μ½”λ“œμ΄λ‹€)


<이전 ν¬μŠ€νŒ…>
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 데이터셋 μ „μ²˜λ¦¬, μ—¬λŸ¬μž₯ μ‹œκ°ν™” ν•˜λŠ” 방법을 μ•Œμ•„λ³΄μ•˜λ‹€. λ‹€μŒμ—λŠ” 이미지에 λ…Έμ΄μ¦ˆ μΆ”κ°€ν•œ ν›„ λŒ€λ§μ˜ λͺ¨λΈλ§μ„ ν•˜μ—¬ 손글씨λ₯Ό λΆ„λ₯˜ν•΄λ³΄λŠ” μž‘μ—…κΉŒμ§€ λ§ˆμΉ˜λ„λ‘ ν•˜κ² λ‹€.

+ Recent posts