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


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

 

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

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

silvercoding.tistory.com


์ €๋ฒˆ ํฌ์ŠคํŒ…๊นŒ์ง€ celeba ๋ฐ์ดํ„ฐ์…‹์— ๋Œ€ํ•œ ์ „์ฒ˜๋ฆฌ๋ฅผ ๋ชจ๋‘ ๋งˆ์ณค๋‹ค. ์ด์ œ ๋ชจ๋ธ๋ง ํ•˜๋Š”์ผ๋งŒ ๋‚จ์•˜๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ๋ฐ”๋กœ ์ด์ „ ํ”„๋กœ์ ํŠธ์˜€๋˜ mnist ๋ชจ๋ธ์€ ์–ด๋Š ์ˆซ์ž์ธ์ง€ ๋งž์ถ”๋Š” 1๊ฐœ์˜ ์•„์›ƒํ’‹์ด ๋‚˜์˜ค๋Š” ๋ถ„๋ฅ˜๊ธฐ์˜€๋‹ค.

์ด๋ฒˆ์—๋Š” ์„ฑ๋ณ„๊ณผ, ์›ƒ์Œ ์—ฌ๋ถ€ ๋‘๊ฐ€์ง€๋ฅผ ๋งž์ถ”์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ฒซ๋ฒˆ์งธ๋กœ ์ด๋ฅผ ๋”ฐ๋กœ๋”ฐ๋กœ ๊ฐ๊ฐ ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด ๋ณด๊ณ ,  ๋‘๋ฒˆ์งธ๋กœ๋Š” weights๋Š” ๊ณต์œ ํ•˜๋ฉด์„œ ์•„์›ƒํ’‹๋งŒ ๋‹ค๋ฅด๊ฒŒ ํ•ด์ฃผ๋Š” ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด ๋ณผ ๊ฒƒ์ด๋‹ค.





๊ฐ๊ฐ ๋ชจ๋ธ๋ง ํ•˜๊ธฐ
(1) simple model ๊ตฌํ˜„

from keras.models import Model 
from keras.layers import Conv2D, MaxPool2D, Input, Dense, Flatten 
def simple_model(): 
	inputs = Input((72, 59, 3)) 
    x = Conv2D(32, 3, activation='relu')(inputs) 
    x = MaxPool2D(2)(x) 
    x = Conv2D(64, 3, activation='relu')(x) 
    x = MaxPool2D(2)(x) 
    x = Conv2D(64, 3, activation='relu')(x) 
    x = MaxPool2D(2)(x) 
    x = Flatten()(x) 
    x = Dense(64, activation='relu')(x) 
    
    outputs = Dense(2, activation='softmax')(x) 
    model = Model(inputs, outputs) 
    
    return model

๋‘๊ฐœ๋ฅผ ๋˜‘๊ฐ™์€ ๋ชจ๋ธ๋กœ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด ๋†“๋Š”๋‹ค.








(2) ๋ชจ๋ธ ์ƒ์„ฑ ๋ฐ ์š”์•ฝ์ •๋ณด ์ถœ๋ ฅ
- ๋ชจ๋ธ ์ƒ์„ฑ

gender_model = simple_model() 
smile_model = simple_model()

๊ฐ๊ฐ์— ๋Œ€ํ•˜์—ฌ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•œ๋‹ค.


- ๋ชจ๋ธ ์š”์•ฝ ์ •๋ณด ์ถœ๋ ฅ

gender_model.summary() 
smile_model.summary()

์ด๋ ‡๊ฒŒ ์ƒ๊ธด ๋ชจ๋ธ์ด 2๊ฐœ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.








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

gender_model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy']) 
smile_model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])

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

-- ๋‘ model ์˜ weight ํ™•์ธ ํ•ด๋ณด๊ธฐ

gender_model.get_weights()[0][0][0][0] 
smile_model.get_weights()[0][0][0][0]

๋‘ ๋ชจ๋ธ์˜ weight๋“ค์„ ์–ป์–ด์™€๋ณด๋ฉด ๋‹ค๋ฅธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ตฌ์กฐ๋งŒ ๊ฐ™์€ ๋ชจ๋ธ์ด๊ณ , ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ํ•™์Šต์ด ์ง„ํ–‰๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.







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

gender_hist = gender_model.fit(train_images, train_male_labels, validation_data=(test_images, test_male_labels), epochs=15, verbose=1) 
smile_hist = smile_model.fit(train_images, train_smile_labels, validation_data=(test_images, test_smile_labels), epochs=15, verbose=1)

ํ•™์Šต๋„ ์—ญ์‹œ ๊ฐ๊ฐ ๋”ฐ๋กœ ์‹œํ‚จ๋‹ค. ๋ผ๋ฒจ ๋นผ๊ณ ๋Š” ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋กฏํ•ด ๋ชจ๋‘ ๋™์ผํ•˜๋‹ค.
์ด ์‹œ์ ์—์„œ weight๋ฅผ ๋˜ ๋ถˆ๋Ÿฌ์™€ ๋ณด๋ฉด ์•„๊นŒ์™€ ๋‹ฌ๋ผ์ ธ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋‹น์—ฐํžˆ ๋‘ ๋ชจ๋ธ์˜ weight๋„ ์—ฌ์ „ํžˆ ๋‹ค๋ฅผ ๊ฒƒ์ด๋‹ค.


์ฐธ๊ณ ๋กœ verbose์— ๊ด€๋ จ๋œ ์„ค๋ช…์€ ์—ฌ๊ธฐ์— ์žˆ๋‹ค
https://silvercoding.tistory.com/5

 

[MNIST ํ”„๋กœ์ ํŠธ] 3. Noise ์ถ”๊ฐ€, RNN ๋ชจ๋ธ๋ง

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

silvercoding.tistory.com









(5) ํ•™์Šต ๊ฒฐ๊ณผ ํ™•์ธ
- ํ•™์Šต ๊ฒฐ๊ณผ ์‹œ๊ฐํ™”

plt.plot(gender_hist.history['accuracy'], label = 'gender_accuracy') 
plt.plot(gender_hist.history['loss'], label = 'gender_loss') 
plt.plot(gender_hist.history['val_accuracy'], label = 'gender_val_accuracy') 
plt.plot(gender_hist.history['val_loss'], label = 'gender_val_loss') 

plt.plot(smile_hist.history['accuracy'], label = 'smile_accuracy') 
plt.plot(smile_hist.history['loss'], label = 'smile_loss') 
plt.plot(smile_hist.history['val_accuracy'], label = 'smile_val_accuracy') 
plt.plot(smile_hist.history['val_loss'], label = 'smile_val_loss') 

plt.legend(loc='uppder left') 
plt.show()

ํžˆ์Šคํ† ๋ฆฌ์— ์ €์žฅ๋œ accuracy์™€ loss๋ฅผ ๊บผ๋‚ด์„œ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด

๋‚˜๋ฆ„ ๊ดœ์ฐฎ์€ ๋ชจ์–‘์„ ๋ˆ๋‹ค!


--- test image ํ•œ์žฅ์œผ๋กœ ๊ฒฐ๊ณผ ํ™•์ธํ•ด๋ณด๊ธฐ

gender_res = gender_model.predict(test_images[77:78]) 
smile_res = smile_model.predict(test_images[77:78]) 

77๋ฒˆ์งธ ์‚ฌ์ง„์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธ ํ•ด๋ณด์ž.

์šฐ์„  77๋ฒˆ์งธ ์‚ฌ์ง„์€ ์œ„์™€ ๊ฐ™๋‹ค. ์—ฌ์ž ์›ƒ์ŒO ์ผ ๊ฒƒ์œผ๋กœ ์ถ”์ •๋œ๋‹ค.
๊ฒฐ๊ณผ๋„ ๊ฐ๊ฐ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

- gender

plt.bar(range(2), gender_res[0], color='red') 
plt.bar(np.array(range(2)) + 0.3, test_male_labels[77]) 
plt.xticks(range(2), ['female', 'male']) 
plt.show()

print(gender_res)

red๊ฐ€ ์˜ˆ์ธก, blue๊ฐ€ ์ •๋‹ต์ด๋‹ค. ์ž˜ ๋งž์ถ”์—ˆ๋‹ค!

- smile

(์ฝ”๋“œ ์ƒ๋žต) gender_res ---> smile_res, test_male_labels ---> test_smile_labels ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.
์•„์ฃผ ์กฐ๊ธˆ์€ unsmiling์œผ๋กœ ์˜ˆ์ธกํ•˜๊ณ  ๊ฑฐ์˜ ์ž˜ ๋งž์ถ˜ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค!








(6) ๋ชจ๋ธ ํ‰๊ฐ€
๋ชจ๋ธ ํ‰๊ฐ€๋„ ๋‘๊ฐœ๋ฅผ ๋”ฐ๋กœ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

gender_model.evaluate(test_images, test_male_labels, verbose=2) 
smile_model.evaluate(test_images, test_smile_labels, verbose=2)

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






๊ทธ๋Ÿฐ๋ฐ ์•„์ฃผ ๋ฒˆ๊ฑฐ๋กญ๋‹ค. ๋‘๊ฐœ๋ผ์„œ ํ• ๋งŒํ–ˆ์ง€ ๋งŒ์•ฝ ๋” ๋งŽ์€ ์†์„ฑ์„ ๋ถ„๋ฅ˜ํ•˜๊ณ ์ž ํ–ˆ๋‹ค๋ฉด ์ •๋ง ํž˜๋“ค์—ˆ์„ ๊ฒƒ์ด๋‹ค. ๋ชจ๋ธ ์ƒ์„ฑ, ํ•™์Šต, ๊ฒฐ๊ณผ ํ™•์ธ, ํ‰๊ฐ€๊นŒ์ง€ ๋ชจ๋‘ ๋”ฐ๋กœ๋”ฐ๋กœ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฉ€ํ‹ฐ ์•„์›ƒํ’‹ ๋ชจ๋ธ๋ง์œผ๋กœ ํ•™์Šต์„ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.



๋ฉ€ํ‹ฐ ์•„์›ƒํ’‹ ๋ชจ๋ธ๋ง
์šฐ์„  ์•„์ด๋””์–ด๋Š” output ์ด์ „๊นŒ์ง€๋Š” ๋‹ค ๊ฐ™์œผ๋‹ˆ ๋˜‘๊ฐ™์ด ์ž‘์„ฑํ•˜๊ณ , output๋งŒ ๋‹ค๋ฅด๊ฒŒ ์ž‘์„ฑํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

- ๋ฐฉ๋ฒ• 1

from keras.models import Model 
from keras.layers import Conv2D, MaxPool2D, Input, Dense, Flatten, Concatenate 
def multi_model(): 
	inputs = Input((72, 59, 3)) 
    l1 = Conv2D(32, 3, activation='relu')(inputs) 
    l2 = MaxPool2D(2)(l1) 
    l3 = Conv2D(64, 3, activation='relu')(l2) 
    l4 = MaxPool2D(2)(l3) 
    l5 = Conv2D(64, 3, activation='relu')(l4) 
    l6 = MaxPool2D(2)(l5) 
    l7 = Flatten()(l6) 
    latent_vector = Dense(64, activation='relu')(l7) 
    
    gender_outputs = Dense(2, activation='softmax')(latent_vector) 
    smile_outputs = Dense(2, activation='softmax')(latent_vector) 
    
    outputs = Concatenate(axis=1)([gender_outputs, smile_outputs]) 
    model = Model(inputs, outputs) 
    
    return model

(1) ๋ชจ๋ธ ์ƒ์„ฑ ๋ฐ ์š”์•ฝ์ •๋ณด ์ถœ๋ ฅ

# ๋ชจ๋ธ ์ƒ์„ฑ
model = multi_model() 
# ๋ชจ๋ธ ์š”์•ฝ์ •๋ณด 
model.summary()

(None, 4)๋กœ ์ตœ์ข… ์•„์›ƒํ’‹์ด 1๊ฐœ


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

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

์ „๊ณผ ๊ฐ™์ด ํ•ด์ค€๋‹ค.

(3) ๋ชจ๋ธ ํ•™์Šต

hist1 = model.fit(train_images, train_labels2, validation_data=(test_images, test_labels2), epochs=15, verbose=1)


(4) ๊ฒฐ๊ณผ ๊ทธ๋ž˜ํ”„

๊ทธ๋ž˜ํ”„๊ฐ€ ๊ต‰์žฅํžˆ ์ด์ƒํ•˜๋‹ค. loss๊ฐ€ accuracy ๋ณด๋‹ค ๋†’๋‹ค. ์˜ค!



(5) ์˜ˆ์ธก ํ™•์ธ (ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์…‹ ์‚ฌ์ง„ ํ•œ์žฅ ํ™•์ธํ•ด๋ณด๊ธฐ)

res = model.predict(test_images[77:78]) print(res2.shape)


res์˜ shape ์€ (1, 4) ๊ฐ€ ๋‚˜์˜จ๋‹ค.

77๋ฒˆ์งธ ์‚ฌ์ง„์€

์ด๋ถ„์ด์‹œ๊ณ , ์ž˜ ์˜ˆ์ธกํ•˜๋Š”์ง€ ์‹œ๊ฐํ™”ํ•˜์—ฌ ํ™•์ธ์„ ํ•ด๋ณด์ž.

plt.bar(range(4), res[0]) 
plt.bar(np.array(range(4)) + 0.3, test_labels2[77]) 
plt.show()

 

77๋ฒˆ์งธ ์ด๋ฏธ์ง€๋Š” ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ž˜ ๋งž์ถ˜ ๊ฒƒ ๊ฐ™๋‹ค. ๊ฒฐ๊ณผ ๊ทธ๋ž˜ํ”„๋Š” ์•„์ฃผ ์ด์ƒํ–ˆ๋Š”๋ฐ ๊ฝค ๋งž์ถ”๊ธด ํ•˜๋‚˜๋ณด๋‹ค.




(6) ๋ชจ๋ธ ํ‰๊ฐ€

model.evaluate(test_images, test_labels2, verbose=2)

์—„์ฒญ๋‚œ loss์™€ ์ •ํ™•๋„ 60%๋กœ ๋ฐฉ๋ฒ• 1์˜ ๋ชจ๋ธ ํ‰๊ฐ€๊นŒ์ง€ ๋งˆ์ณค๋‹ค. ํ•œ๋ฒˆ์— ํ•ฉ์ณ์„œ ๋ชจ๋ธ๋ง์„ ํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ์กฐ์น˜๊ฐ€ ๋” ํ•„์š”ํ•ด ๋ณด์ธ๋‹ค.






-๋ฐฉ๋ฒ• 2

from keras.models import Model 
from keras.layers import Conv2D, MaxPool2D, Input, Dense, Flatten, Concatenate 
def multi_model(): 
	inputs = Input((72, 59, 3)) 
    l1 = Conv2D(32, 3, activation='relu')(inputs) 
    l2 = MaxPool2D(2)(l1) 
    l3 = Conv2D(64, 3, activation='relu')(l2) 
    l4 = MaxPool2D(2)(l3) 
    l5 = Conv2D(64, 3, activation='relu')(l4) 
    l6 = MaxPool2D(2)(l5) 
    l7 = Flatten()(l6) 
    latent_vector = Dense(64, activation='relu')(l7) 
    
    gender_outputs = Dense(2, activation='softmax')(latent_vector) 
    smile_outputs = Dense(2, activation='softmax')(latent_vector) 
    
    model = Model(inputs, [gender_outputs, smile_outputs]) 
    
    return model

์—ฌ๊ธฐ์„œ๋Š” gender_outpus์™€ smile_outputs๋ฅผ concatenateํ•ด์ฃผ์ง€ ์•Š๊ณ , model์— ๋ฆฌ์ŠคํŠธ๋กœ ๋ฌถ์–ด ๋ฐ”๋กœ ๋„ฃ์–ด์ค€๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐœ์ˆ˜๋Š” ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์—ฌ์ฃผ๋ฉด์„œ ์ฒ˜์Œ์— ํ–ˆ๋˜ ๊ฐ๊ฐ ๋ชจ๋ธ๋ง๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ํ•ด์ค€๋‹ค.


(1) ๋ชจ๋ธ ์ƒ์„ฑ ๋ฐ ์š”์•ฝ์ •๋ณด ์ถœ๋ ฅ

# ๋ชจ๋ธ ์ƒ์„ฑ 
model2 = multi_model() 
# ๋ชจ๋ธ ์š”์•ฝ์ •๋ณด 
model2.summary()

(None, 2) (None, 2) ๋กœ ์ตœ์ข… ์•„์›ƒํ’‹์ด 2๊ฐœ


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

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

๋˜‘๊ฐ™์ด ์„ค์ •!



(3) ๋ชจ๋ธ ํ•™์Šต

hist2 = model2.fit(train_images, [train_male_labels, train_smile_labels], validation_data=(test_images, [test_male_labels, test_smile_labels]), epochs=15, verbose=1)



(4) ๊ฒฐ๊ณผ ๊ทธ๋ž˜ํ”„

๊ฐ๊ฐ ๋ชจ๋ธ๋ง ํ–ˆ์„ ๋•Œ์™€ ๋น„์Šทํ•œ ํ˜•ํƒœ๋กœ ๋‚˜์˜ด์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.


(5) ์˜ˆ์ธก ํ™•์ธ (ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์…‹ ์‚ฌ์ง„ ํ•œ์žฅ ํ™•์ธํ•ด๋ณด๊ธฐ)
์•„๊นŒ์™€ ๊ฐ™์€ 77๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์˜ˆ์ธกํ•ด๋ณธ๋‹ค.

res2 = model2.predict(test_images[77:78]) print(res[0].shape, res[1].shape)

์—ฌ๊ธฐ์„œ๋Š” ์•„์›ƒํ’‹์ด 2๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด (1, 2) (1, 2) ์ด๋Ÿฌํ•œ ํ˜•ํƒœ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.
res2๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด,
[array([[9.999993e-01, 6.897806e-07]], dtype=float32),
array([[0.01424873, 0.9857512 ]], dtype=float32)] ์ด๋Ÿฌํ•œ ํ˜•ํƒœ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฝ”๋“œ๋Š” ์œ„์—์„œ ์‚ด์ง ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋˜๋‹ˆ ์ƒ๋žตํ•˜๊ณ , ๊ฐ๊ฐ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด

์„ฑ๋ณ„์€ ์—ฌ์ž, 100%๋Š” ์•„๋‹ˆ์ง€๋งŒ ์›ƒ๋Š” ์‚ฌ๋žŒ์œผ๋กœ ์ž˜ ํŒ๋ณ„ ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.



(6) ๋ชจ๋ธ ํ‰๊ฐ€

model2.evaluate(test_images, [test_male_labels, test_smile_labels], verbose=2)

๋„ˆ๋ฌด ๊ธธ์–ด์„œ ์งค๋ ธ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋‘ ์„ฑ๋ณ„, ์›ƒ์Œ ๋ชจ๋ธ ๋ชจ๋‘ ์ •ํ™•๋„ 91% ์ •๋„๋กœ ๋‚˜์™”๋‹ค. ์ œ์ผ ๋†’๊ฒŒ ๋‚˜์™”๋‹ค!


(7) ๋ชจ๋ธ ๋ถ„๋ฆฌ ํ•ด๋ณด๊ธฐ

gender_model2 = Model(inputs = model2.input, outputs = model2.get_layer('dense_5').output) 
gender_model2.summary()
smile_model2 = Model(inputs = model2.input, outputs = model2.get_layer('dense_6').output) 
smile_model2.summary()

model2์—์„œ input๊ณผ gender_outputs, smile_oupts์— ํ•ด๋‹นํ–ˆ๋˜ layer๋ฅผ get_layer๋ฅผ ํ†ตํ•ด ์–ป์–ด์™€์„œ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
summary๋ฅผ ํ•ด๋ณด๋ฉด ๊ฐ€์žฅ ์ฒ˜์Œ์— ํ–ˆ๋˜ ๊ฐ๊ฐ ๋ชจ๋ธ๋ง์—์„œ์˜ ํ˜•ํƒœ์™€ ๊ฐ™๊ฒŒ ๋‚˜์˜จ๋‹ค.


- weights ํ™•์ธ ํ•ด๋ณด๊ธฐ

smile_model2.get_weights()[0][0][0][0] 
gender_model2.get_weights()[0][0][0][0]


๊ฐ๊ฐ๋ชจ๋ธ๋ง์—์„œ weights๋ฅผ ํ™•์ธํ•ด ๋ณด์•˜์„ ๋•Œ๋Š” ์„œ๋กœ ๋‹ฌ๋ž๋‹ค. ํ•˜์ง€๋งŒ model2์—์„œ weights๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๋ถ„๋ฆฌ๋ฅผ ํ•ด์ค€ ์œ„์˜ ๋ชจ๋ธ์€ weights๊ฐ€ ๊ฐ™์€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.



(8) ๋ชจ๋ธ ์ €์žฅ ๋ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

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

์ด๋ฆ„ ์„ค์ •ํ•˜๊ณ  h5๋กœ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ!


--- ์ฝ”๋žฉ์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ์ปดํ“จํ„ฐ์— ๋ชจ๋ธ ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ

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





๊ฒฐ๋ก ์ ์œผ๋กœ
ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜ => ๊ฐ๊ฐ ๋ชจ๋ธ๋ง (์ด ์•ฝ 40๋งŒ๊ฐœ) > ๋ฉ€ํ‹ฐ ์•„์›ƒํ’‹ ๋ชจ๋ธ๋ง (์•ฝ 20๋งŒ๊ฐœ)
์ ˆ๋ฐ˜์ด ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ํ˜•ํƒœ์˜ ๋ชจ๋ธ์˜ ์•„์›ƒํ’‹๋งŒ ๋‹ฌ๋ฆฌ ํ•ด์ค„ ๋•Œ๋Š” ๋ฉ€ํ‹ฐ ์•„์›ƒํ’‹ ๋ชจ๋ธ๋ง์ด ๋” ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.


๋ฐฉ๋ฒ•1 vs ๋ฐฉ๋ฒ•2
๋ฐฉ๋ฒ• 1 ์€ ์•„์›ƒํ’‹์ด 1๊ฐœ (None, 4) , ๋ฐฉ๋ฒ•2๋Š” ์•„์›ƒํ’‹์ด 2๊ฐœ (None, 2) (None, 2) (๊ฐ๊ฐ ๋ชจ๋ธ๋ง๊ณผ ๊ฐ™์Œ)
๋ฐฉ๋ฒ•1์€ ์ด๋ฏธ์ง€ ํ•œ์žฅ์€ ์ž˜ ๋ถ„๋ฅ˜ํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ, loss๋‚˜ accuracy๊ฐ€ ์ด์ƒํ•ด์„œ ์กฐ์น˜๋ฅผ ๋” ์ทจํ•ด์ฃผ๊ฑฐ๋‚˜, ์กฐ๊ธˆ ๋” ์•Œ์•„๋ณผ ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

+ Recent posts