(์ด๋ฒˆ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” ํŒจ์บ  ๋”ฅ๋Ÿฌ๋‹ ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ•œ ์ฝ”๋“œ์ด๋‹ค)


<์ด์ „ ํฌ์ŠคํŒ…>
https://silvercoding.tistory.com/4

 

[MNIST ํ”„๋กœ์ ํŠธ] 2. MNIST ๋ฐ์ดํ„ฐ์…‹ ์ „์ฒ˜๋ฆฌ, ์‹œ๊ฐํ™”

(์ด๋ฒˆ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” ํŒจ์บ  ๋”ฅ๋Ÿฌ๋‹ ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ•œ ์ฝ”๋“œ์ด๋‹ค) <์ด์ „ ํฌ์ŠคํŒ…> https://silvercoding.tistory.com/3 [MNIST ํ”„๋กœ์ ํŠธ] 1. MNIST ๋ฐ์ดํ„ฐ ์•Œ์•„๋ณด๊ธฐ (์ด๋ฒˆ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” ํŒจ์บ  ๋”ฅ๋Ÿฌ๋‹ ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ•œ

silvercoding.tistory.com




Noise ์ถ”๊ฐ€ํ•˜๊ธฐ

https://www.tensorflow.org/tutorials/images/data_augmentation

 

๋ฐ์ดํ„ฐ ์ฆ๊ฐ•  |  TensorFlow Core

๊ฐœ์š” ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ์ด๋ฏธ์ง€ ํšŒ์ „๊ณผ ๊ฐ™์€ ๋ฌด์ž‘์œ„(๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์‹ค์ ์ธ) ๋ณ€ํ™˜์„ ์ ์šฉํ•˜์—ฌ ํ›ˆ๋ จ ์„ธํŠธ์˜ ๋‹ค์–‘์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ธฐ์ˆ ์ธ ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•์˜ ์˜ˆ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ ์ฆ

www.tensorflow.org

์šฐ์„  Data augmentation ์€ ๋ฌด์ž‘์œ„ ๋ณ€ํ™˜์„ ์ ์šฉํ•˜์—ฌ ํ›ˆ๋ จ ์„ธํŠธ์˜ ๋‹ค์–‘์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

์ถœ์ฒ˜&nbsp; https://www.tensorflow.org/tutorials/images/data_augmentation &nbsp;

์ด ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ์‚ฌ๋žŒ ๋ˆˆ์—๋Š” ํšŒ์ „์„ ํ•˜๋“  ํ™•๋Œ€๋ฅผ ํ•˜๋“  ๊ฐ™์€ ๊ฝƒ์ด๋ผ๋Š” ๊ฑธ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ปดํ“จํ„ฐ ์ž…์žฅ์—์„œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์ง„์œผ๋กœ ์ž…๋ ฅ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๋ฌด์ž‘์œ„ ๋ณ€ํ˜•์„ ์‹œ์ผœ ํ›ˆ๋ จ์„ธํŠธ์˜ ๋‹ค์–‘ํ™”๋ฅผ ํ•˜๊ณ ์ž ํ•œ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” MNIST์— ์ด๋Ÿฌํ•œ Noise๋ฅผ ์ž…ํžŒ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

(1) (28, 28) ํฌ๊ธฐ์˜ ๋žœ๋ค ๋…ธ์ด์ฆˆ ์ƒ์„ฑํ•˜๊ธฐ
- np.random.random

print(np.random.random((2, 2))) 

np.random.random() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 0-1์‚ฌ์ด์˜ ์‹ค์ˆ˜๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. ๊ด„ํ˜ธ ์•ˆ์— ์‚ฌ์ด์ฆˆ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด

์ด๋ ‡๊ฒŒ (2, 2) ํ˜•ํƒœ๋กœ ๋žœ๋ค๊ฐ’์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

np.random.random((28,28)).shape

๋”ฐ๋ผ์„œ ์ด๋ ‡๊ฒŒ ํ•ด์ฃผ๋ฉด (28, 28) ์‚ฌ์ด์ฆˆ์˜ ๋žœ๋ค ๋…ธ์ด์ฆˆ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
์ด๋ฅผ plt.imshow()์— ๋„ฃ์–ด ํ™•์ธํ•ด๋ณด๋ฉด ์œ„์—์„œ ๋ณด์•˜๋˜ ๋…ธ์ด์ฆˆ ๊ทธ๋ฆผ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์œ„์—์„œ ๋ณด์•˜๋˜ ๊ทธ๋ฆผ๋ณด๋‹ค๋Š” ์ง„ํ•˜๋‹ค. ๋…ธ์ด์ฆˆ๋ฅผ ์ฃผ๊ธฐ์—” ๋„ˆ๋ฌด ์„ธ๋‹ค.

- np.random.normal

print(np.random.normal(0.0, 0.1, (28, 28))) 

๊ทธ๋ž˜์„œ np.random.normal๋กœ ํ‰๊ท ๊ณผ ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค. ํ‰๊ท  0, ํ‘œ์ค€ํŽธ์ฐจ 0.1 ๋กœ ์ง€์ •ํ•ด์ค€๋‹ค.
์ด๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ๊ทธ๋ ค์ฃผ๋ฉด

์ ๋‹นํ•œ ๋…ธ์ด์ฆˆ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค!




(2) ์ด๋ฏธ์ง€ ํ•œ์žฅ์— ์ ์šฉํ•ด๋ณด๊ธฐ
777๋ฒˆ์งธ ์ด๋ฏธ์ง€์— ๋…ธ์ด์ฆˆ๋ฅผ ์”Œ์›Œ๋ณด์ž.

noisy_image = train_images[777] + np.random.normal(0.5, 0.1, (28, 28))

์ฐจ์ด๋ฅผ ๋” ์„ ๋ช…ํžˆ ๋ณด๊ธฐ ์œ„ํ•ด ํ‰๊ท ์„ 0.5๋กœ ์ค€๋‹ค.

๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค๋ณด๋‹ˆ ๋…ธ์ด์ฆˆ๊ฐ€ ์ƒ๊ฒผ์ง€๋งŒ 1์ด ๋„˜๋Š” ๊ฐ’์ด ์ƒ๊ฒจ๋ฒ„๋ฆฐ๋‹ค.

noisy_image[noisy_image > 1.0] = 1.0 

๊ทธ๋ž˜์„œ 1.0์ด ๋„˜๋Š” ๊ฐ’์€ 1.0์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด

0๊ณผ 1์‚ฌ์ด์˜ ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋…ธ์ด์ฆˆ ์ด๋ฏธ์ง€๊ฐ€ ์™„์„ฑ๋œ๋‹ค.




(3) ๋ชจ๋“  ์ด๋ฏธ์ง€์— ๋…ธ์ด์ฆˆ ์ ์šฉํ•˜๊ธฐ

train_noisy_images = train_images + np.random.normal(0.5, 0.1, train_images.shape) 
train_noisy_images[train_noisy_images > 1.0] = 1.0 

test_noisy_images = test_images + np.random.normal(0.5, 0.1, test_images.shape) 
test_noisy_images[test_noisy_images > 1.0] = 1.0

์ตœ์ข…์ ์œผ๋กœ train์ด๋ฏธ์ง€์™€ test์ด๋ฏธ์ง€ ๋ชจ๋‘ ๋…ธ์ด์ฆˆ๋ฅผ ์ ์šฉ์‹œํ‚ค๋Š” ์ฝ”๋“œ์ด๋‹ค.
์ €๋ฒˆ์‹œ๊ฐ„์— ์—ฌ๋Ÿฌ์žฅ์˜ ์ด๋ฏธ์ง€๋ฅผ ํ•œ๋ฒˆ์— ์‹œ๊ฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒซ 5๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์ƒ์ ์œผ๋กœ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.





๋“œ๋””์–ด
๋ชจ๋ธ๋ง ํ•˜๊ธฐ

(1) ๋ชจ๋ธ๋ง ์ค€๋น„ - ๋ผ๋ฒจ ์›ํ•ซ์ธ์ฝ”๋”ฉ ์ž‘์—… (๋ฐฐ์น˜์‚ฌ์ด์ฆˆ,) -> (๋ฐฐ์น˜์‚ฌ์ด์ฆˆ, ํด๋ž˜์Šค ๊ฐœ์ˆ˜)
(60000,) (10000,) ์˜ ํ˜•ํƒœ์˜€๋˜ ๋ผ๋ฒจ์„ (60000, 10) (10000, 10) ์˜ ํ˜•ํƒœ๋กœ one-hot encoding ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

from keras.utils import to_categorical 
train_labels = to_categorical( train_labels, 10) 
test_labels = to_categorical( test_labels, 10) 

keras.utils์˜ to_categorical์„ import ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. to_categorical(์›ํ•ซ์ธ์ฝ”๋”ฉํ•  ๋ผ๋ฒจ, ํด๋ž˜์Šค ๊ฐœ์ˆ˜) ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.




(2) simpleRNN classification ๋ชจ๋ธ ์ƒ์„ฑ

from keras.layers import simpleRNN 
from keras.layers import Dense, Input 
from keras.models import Model 

inputs = Input(shape=(28, 28)) 
x1 = simpleRNN(64, activation="tanh")(inputs) 
x2 = Dense(10, activation="softmax")(x1) 

model = Model(inputs, x2)

keras.layers์˜ simpleRNN์œผ๋กœ ๋ชจ๋ธ ์ƒ์„ฑ์„ ํ•œ๋‹ค. activation ํ•จ์ˆ˜๋Š” ๊ฐ๊ฐ tanh, softmax๋กœ ๊ตฌ์„ฑ์ด ๋˜์–ด์žˆ๋‹ค.

model.summary()

summaryํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์š”์•ฝ์ •๋ณด๋ฅผ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐœ์ˆ˜์™€ ์•„์›ƒํ’‹ shape์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.




(3) loss, optimizer, metrics ์„ค์ •

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ["accuracy"])


compile ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์†์‹คํ•จ์ˆ˜๋Š” categorical crossentropy, optimizer ๋Š” adam, ์ง€ํ‘œ๋Š” ์ •ํ™•๋„๋กœ ์„ค์ •ํ•ด ์ค€๋‹ค.




(4) ํ•™์Šต์‹œํ‚ค๊ธฐ

hist = model.fit(train_noisy_images, train_labels, validation_data=(test_noisy_images, test_labels), epochs=5, verbose=2)

๋‹ค๋ฅธ ๊ฑด ๋‹ค ์˜ˆ์ƒ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ verbose๋Š” ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ์ฐพ์•„๋ณด์•˜๋‹ค.

verbose: 'auto', 0, 1, or 2. Verbosity mode. 0 = silent, 1 = progress bar, 2 = one line per epoch. 'auto' defaults to 1 for most cases, but 2 when used with ParameterServerStrategy. Note that the progress bar is not particularly useful when logged to a file, so verbose=2 is recommended

<์ถœ์ฒ˜>
https://keras.io/api/models/model_training_apis/

 

Keras documentation: Model training APIs

Model training APIs compile method Model.compile( optimizer="rmsprop", loss=None, metrics=None, loss_weights=None, weighted_metrics=None, run_eagerly=None, steps_per_execution=None, **kwargs ) Configures the model for training. Arguments optimizer: String

keras.io



** ๋น„๊ตํ•ด๋ณด๊ธฐ
- verbose = 1

์ง„ํ–‰์ƒํ™ฉ + ๊ฐ’์ด ๋‚˜์˜ด

- verbose = 2

๊ฐ’๋งŒ ๋‚˜์˜ด


(5) ํ•™์Šต ๊ฒฐ๊ณผ ํ™•์ธ

plt.plot(hist.history['accuracy'], label='accuracy') plt.plot(hist.history['loss'], label='loss') plt.plot(hist.history['val_accuracy'], label='val_accuracy') plt.plot(hist.history['val_loss'], label='val_loss') plt.legend(loc='upper left') plt.show()

ํ•™์Šตํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ๊ทธ๋ ค๋ณด์•˜์„ ๋•Œ ์ •ํ™•๋„๋Š” ๋งค์šฐ ๋†’๊ณ  ์˜ค๋ฅ˜๋Š” ๋งค์šฐ ๋‚ฎ์€ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ„๋‹จํ•œ RNN๋ชจ๋ธ๋กœ ๊ตฌํ˜„์„ ํ•˜์—ฌ๋„ ์„ฑ๋Šฅ์ด ๊ดœ์ฐฎ๋‹ค!


--- ์™„์„ฑ๋œ ๋ชจ๋ธ์— test ์ด๋ฏธ์ง€ ํ•œ์žฅ์œผ๋กœ ๊ฒฐ๊ณผ ํ™•์ธํ•ด๋ณด๊ธฐ

res = model.predict( test_noisy_images[777:778] ) 

777๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

plt.bar(range(10), res[0], color='red') plt.bar(np.array(range(10)) + 0.35, test_labels[777]) plt.show()

red๊ฐ€ ์˜ˆ์ธกํ•œ ํ™•๋ฅ , blue๊ฐ€ ์ •๋‹ต์ด๋‹ค. ๋ณด๋ฉด 1๋กœ ์ž˜ ์˜ˆ์ธกํ–ˆ์ง€๋งŒ, 7๊ณผ 8๋กœ ์˜ˆ์ธกํ•œ ๊ฒƒ์ด ๋ฏธ์„ธํ•˜๊ฒŒ ๋ณด์ธ๋‹ค. ์„ฑ๋Šฅ์€ ๋‚˜์˜์ง€ ์•Š์•„๋ณด์ธ๋‹ค.




(6) ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ํ‰๊ฐ€ํ•˜๊ธฐ

loss, acc = model.evaluate(test_noisy_images, test_labels, verbose=2) print(loss, acc)

evaluate์— ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์…‹์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

์ •ํ™•๋„ 95%๋กœ ๋ชจ๋ธ ํ‰๊ฐ€๊นŒ์ง€ ๋งˆ์ณค๋‹ค.




(7) ๋ชจ๋ธ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

# ๋ชจ๋ธ ์ €์žฅ 
model.save("./mnist_rnn.h5")
# ๋ชจ๋ธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ 
new_model = tf.keras.models.load_model('./mnist_rnn.h5')

h5๋กœ ์ €์žฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.


** ํ˜น์‹œ ์ฝ”๋žฉ์œผ๋กœ ํ–ˆ๋‹ค๋ฉด, ์ฝ”๋žฉ์— ์ €์žฅ๋œ ๋ชจ๋ธ์„ ์ปดํ“จํ„ฐ์— ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ

from google.colab import files 
files.download('./mnist_rnn.h5')

 

+ Recent posts