(๋ณธ ํ๋ก์ ํธ ์ฝ๋๋ ํจ์บ ๋ฅ๋ฌ๋ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ ์ฝ๋์ด๋ค) <์ด์ ํฌ์คํ
> 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๊ฐ ์ด์ํด์ ์กฐ์น๋ฅผ ๋ ์ทจํด์ฃผ๊ฑฐ๋, ์กฐ๊ธ ๋ ์์๋ณผ ํ์๊ฐ ์์ ๊ฒ ๊ฐ๋ค.