ex01. TextMining(์ํ๋ฆฌ๋ทฐ ๊ฐ์ฑ๋ถ์)
- ์ง๋ํ์ต
- ๋ถ๋ฅ(ใ
) : ์ ๋ต ๋ฐ์ดํฐ๊ฐ ๋ฒ์ฃผํ(ใ
),
class : ์ ๋ต ๋ฐ์ดํฐ์ ๊ฐฏ์
โป๋ก์ง์คํฑ ํ๊ท : ๋ถ๋ฅ๋ชจ๋ธ(์ ํน์ดํ๊ฒํ๊ท์ง๋ง ๋ถ๋ฅ๋ชจ๋ธ์) - ํ๊ท(ใ ) : ์ ๋ต ๋ฐ์ดํฐ๊ฐ ์ฐ์ํ(ใ )
- ๋ถ๋ฅ(ใ
) : ์ ๋ต ๋ฐ์ดํฐ๊ฐ ๋ฒ์ฃผํ(ใ
),
- ๋น์ง๋ํ์ต
- ๊ฐํํ์ต
- ๋ฌธ์ ์ ์
- ๋ฐ์ดํฐ ์์ง
- ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
- EDA (ํ์์ ๋ฐ์ดํฐ ๋ถ์) - ์๊ฐํ
- ๋ชจ๋ธ ์ ํ ๋ฐ ํ์ดํผํ๋ผ๋ฏธํฐ ์ ํ
- ๋ชจ๋ธ ํ์ต (fit)
- ๋ชจ๋ธ ์์ธก ๋ฐ ํ๊ฐ (predict, score)
- ์์ฐ์ด ์ฒ๋ฆฌ ๋ฐฉ์ : Natural Language Processing, NLP
- ์์ฐ์ด : ์ผ์์ํ์ ์ฌ์ฉ๋๋ ์ธ์ด
- ์ธ๊ณต์ธ์ด : python, ์ํ์ ๋ฑ
- ํ ์คํธ ๋ถ๋ฅ
- ๊ฐ์ฑ ๋ถ์ (*)
- ํ ์คํธ ์์ฝ
- ํ ์คํธ ๊ตฐ์งํ ๋ฐ ์ ์ฌ๋ ๋ถ์
๋ง๋ญ์น >> ๋ฌธ์ >> ๋ฌธ๋จ >> ๋ฌธ์ฅ >> ๋ค์ด >> ํํ์
- ํํ์ : ์ผ์ ํ ์๋ฏธ๊ฐ ์๋ ๊ฐ์ฅ ์์ ๋ง์ ๋จ์ (ex: ์ฒซ/์ฌ๋)
- ํ ์คํธ๋ฐ์ดํฐ ์์ง(ํฌ๋กค๋ง)
- ํ ์คํธ ์ ์ฒ๋ฆฌ
- ํ ํฐํ(๋ฒกํฐ๋ก ๋ณํ, ์ชผ๊ฐ๊ธฐ - ํํ์ ๋ถ์๊ธฐ)
a. ๋จ์ด๋จ์
b. ๋ฌธ์๋จ์
c. n-gram ๋จ์(n๊ฐ์ ์ฐ์๋ ๋จ์ด๋ฅผ ํ๋๋ก ์ทจ๊ธ)
ex) ICE/CREAM => ICECREAM - ํน์ง ๊ฐ ์ถ์ถ(์ค์ํ ๋จ์ด ์ถ์ถ)
TF-IDF : "๋ฌธ์"๋ด์์ ์ค์ํ ๋จ์ด์ฌ์ผํจ.
"๋ชจ๋ ๋ฌธ์" ๋ด์์ ์ค์ํ๊ฑฐ ์ถ์ถํ๋ฉด a, the ์ ๊ฐ์ด ํ์ ์๋ ๋จ์ด๋ฅผ ์ค์ํ๋ค๊ณ ์ฐฉ๊ฐํ ์ ์์. - ๋ฐ์ดํฐ ๋ถ์
๊ฐ๋ณ ๋ฌธ์์์ ์์ฃผ ๋ฑ์ฅํ๋ ๋จ์ด์๋ ๋์ ๊ฐ์ค์น๋ฅผ ์ฃผ๋, ๋ชจ๋ ๋ฌธ์์ ์์ฃผ ๋ฑ์ฅํ๋ ๋จ์ด์๋ ํจ๋ํฐ
TF : ๋จ์ด๊ฐ ๊ฐ ๋ฌธ์์์ ๋ฐ์ํ ๋น๋
DF : ๋จ์ด X๊ฐ ํฌํจ๋ ๋ฌธ์์ ์
CounterVectorize(๋จ์ ์นด์ดํ
) : ๋น๋ ์ ๊ธฐ๋ฐ
ex01. TextMining(์ํ๋ฆฌ๋ทฐ ๊ฐ์ฑ๋ถ์)
txt_train = [i.replace(b'<br />', b'') for i in txt_train]
- ๋์ ๋ณ์๋ช =[๋์ ํ๊ณ ์ถ์ ๊ฒฐ๊ณผ๊ฐ for i in ๋์๋ฒ์]
- b'' : byte ๋ฌธ์์ด์ ์๋ฏธํ๋ค. ์ธ์ฝ๋ฉ์ ํ์ง ์์ ์๋๊ฐ ๋น ๋ฅธ ๋์ , b''๋ก ์จ์ค์ผํจ.
- ๋น๋์ ๊ธฐ๋ฐ ๋ฒกํฐํ ๋๊ตฌ
- ์ค์ง ๋์ด์ฐ๊ธฐ๋ง์ ๊ธฐ์ค์ผ๋ก ํ์ฌ ๋จ์ด๋ฅผ ์๋ฅธ ํ์ BOW๋ฅผ ๋ง๋ฆ!
from sklearn.feature_extraction.text import CountVectorizer
# ๋จ์ด์ฌ์ ๊ตฌ์ถ
vect = CountVectorizer()
vect.fit(test_words)
print(vect.vocabulary_)
# ๋จ์ด์ฌ์ ์ ๋ฐํ์ผ๋ก ๋ฒกํฐ๊ฐ ๋ฐ๊พธ๊ธฐ
vect.transform(test_words)
vect.transform(test_words).toarray() # ํ์ธ
- CountVectorizer์์์ LogisticRegression
# ๋ก์ง์คํฑ ๋ชจ๋ธ ์์ฑ
logi = LogisticRegression()
logi.fit(X_train, y_train)
logi.score(X_test,y_test)
# ์์ธก
data = rv_vect.transform(data)
pre = logi.predict(data1)
- TF-IDF(Term Frequency - Inverse Document Frequency)
- ๋จ์ด์ ์ค์๋๋ฅผ ํ์ธํ ๋ ๋จ์ ์นด์ดํธ ๊ธฐ๋ฐ์ด ์๋, ๋ชจ๋ ๋ฌธ์๋ฅผ ํ์ธ ํ ํ์ ํน์ ๋ฌธ์์๋ง ์์ฃผ ๋ฑ์ฅํ๋ ๋จ์ด๋ค์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ๋ ๋ฐฉ์์ด๋ค
- TF : ํ๋์ ๋ฌธ์์ ๋ฑ์ฅํ๋ ํ์
- DF : ์ ์ฒด์ ๋ฌธ์์ ๋ฑ์ฅํ๋ ํ์
- ๊ฒฐ๊ณผ๊ฐ์ด ํด์๋ก ์ค์๋๊ฐ ๋์๋จ์ด, ๊ฒฐ๊ณผ๊ฐ์ด ๋ฎ์์๋ก ์ค์๋๊ฐ ๋ฎ์ ๋จ์ด!
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vect = TfidfVectorizer()
tfidf_vect.fit(corpus) # corpus : ๋ฌธ์์ด ๋ฐ์ดํฐ
tfidf_vect.vocabulary_ # ๋จ์ด์ฌ์ ๋ณด๊ธฐ
tfidf_vect.transform(corpus).toarray() # ๋ฒกํฐํ์์น ๋ณด๊ธฐ
- ํ๊ท์์๋ ์ค์ฐจ๋ฅผ MSE๋ก ๋ถ๋ฅํ์ง๋ง, ๋ถ๋ฅ์์ ์ค์ฐจ๋ฅผ ๊ต์ฐจ์ํธ๋กํผ๋ฅผ ํ์ฉํด ๊ตฌํ๋ค.
- โ (ํ๋ฆด ๋ ์ค์ฐจ๋ฅผ ์ฆํญ์ํค๋ ํจ์๋ฅผ ์ด์ฉํ๋ค.)
-
tensorflow
- ๊ตฌ๊ธ์ด ๋ง๋ ๋ฅ๋ฌ๋์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
-
keras
- tensorflow ์์์ ๋์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (์ฌ์ฉ์ ์นํ์ = ์ฌ์)
์ผ๋ผ์ค(Keras)๋ TensorFlow, Theano, CNTK ๋ฑ ๋ฅ ๋ฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐฑ์๋๋ก ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ๋ค์ธต ํผ์ ํธ๋ก ์ ๊ฒฝ๋ง ๋ชจ๋ธ, ์ปจ๋ณผ๋ฃจ์ ์ ๊ฒฝ๋ง ๋ชจ๋ธ, ์ํ ์ ๊ฒฝ๋ง ๋ชจ๋ธ, ์กฐํฉ ๋ชจ๋ธ ๋ฑ์ ๊ตฌ์ฑํ ์ ์๋ค.
2017๋ , ๊ตฌ๊ธ์ TensorFlow 2.0๋ถํฐ๋ ์ฝ์ด ๋ ๋ฒจ์์ Keras๋ฅผ ์ง์ํ๋๋ก ๋ณ๊ฒฝํ๊ฒ ๋ค๊ณ ๋ฐํํ์๊ณ , ํ์ฌ ๋ฐํ๋ TensorFlow 2.0 stable๋ถํฐ๋ ์ฌ์ค์ ์ ๋ถ Keras๋ฅผ ํตํด์๋ง ๋์ํ๋๋ก ๋ฐ๋์๋ค. ์ฌ์ฉ์์ฉ ํํ ๋ฆฌ์ผ ํ์ด์ง 1.15๋ถํฐ deprecated ๋ชฉ๋ก์ ๋ค์ด๊ฐ ์๋ ์์ํ API๊ฐ ๋๋ถ๋ถ ์ ๋ฆฌ๋์๊ณ , ์ต์๋๋ฉด ์กฐ๊ธ ๋ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋ณํ๋ค. ํ์ง๋ง ๊ทธ๋์ ์ต์ํ๊ฒ ์ฌ์ฉํด ์๋ ๋ชจ๋ธ์ ๋ง๋ ๋ค์ session์ ๋ง๋ค์ด ๋์ํ๋ ๊ตฌ์กฐ์ ์ต์ํ๋ ์ฌ๋๋ค์๊ฒ ๋ฉ๋ถ์ ์ค ๊ฒ์ ๋ค.
- ๋ง์ดํธ ํ์.
- ๋ง์ดํธ ํด์ผ ํ์ผ ๋๋ผ์ด๋ธ์ ์ ์ฅํด๋๊ณ ์๊ตฌ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ.
- mount ์ฑ๊ณต ์ "drive" ํด๋๊ฐ ์์ฑ๋จ.
from google.colab import drive
drive.mount('/content/drive')
๊ธฐ๋ฅ | ๋จ์ถํค |
---|---|
์คํ (์ปค์ ๊ทธ๋๋ก ์์น) | Ctrl + Enter |
์คํ ํ ์๋ ์ ๋ก ์ด๋ | Shift + Enter |
์คํ ํ ์๋ ์ ์์ฑ ๋ฐ ์ด๋ | Alt + Enter |
๋งํฌ๋ค์ด์ผ๋ก ์ ๋ณํ (์ฝ๋ -> ํ ์คํธ) | Ctrl + M, M |
์ฝ๋ ๋ชจ๋๋ก ์ ๋ณํ (ํ ์คํธ -> ์ฝ๋) | Ctrl + M, Y |
์๋์ ์ ์ถ๊ฐ | Ctrl + M, B |
์์ ์ ์ถ๊ฐ | Ctrl + M, A |
๋ชจ๋ ๋จ์ถํค ๋ชฉ๋ก ๋ณด๊ธฐ | Ctrl + M, H |
# tensorflow ๋ฒ์ ํ์ธ
import tensorflow as tf
print(tf.__version__)
# %cd : ์์
๊ฒฝ๋ก๋ฅผ ์๊ตฌํ ๋ฐ๊ฟ.
%cd "/content/drive/MyDrive/Colab Notebooks/DeepLearning(Spring)"
# delimiter=';' : ๊ตฌ๋ถ์ ํ์
data = pd.read_csv('./data/student-mat.csv', delimiter=';')
# ๊ธฐ์กด ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ํ๋ฆ
# 1. ๋ชจ๋ธ ์์ฑ
linear_model = LinearRegression()
# 2. ๋ชจ๋ธ ํ์ต
linear_model.fit(X_train.values.reshape(-1,1), y_train)
# 3. ๋ชจ๋ธ ์์ธก
linear_pre = linear_model.predict(X_test.values.reshape(-1,1))
# 4. ๋ชจ๋ธ ํ๊ฐ
mean_squared_error(y_test, linear_pre)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import InputLayer, Dense, Activation
- ์ ๊ฒฝ๋ง ๊ตฌ์กฐ ์ค๊ณ
# ๋ผ๋ ์์ฑ
model = Sequential()
# ์
๋ ฅ์ธต
model.add(InputLayer(input_shape=(1,)))
# ์ค๊ฐ์ธต (์๋์ธต)
model.add(Dense(units=10))
model.add(Activation('sigmoid'))
# ์ถ๋ ฅ์ธต
model.add(Dense(units=1))
- ํ์ต ๋ฐ ํ๊ฐ ๋ฐฉ๋ฒ ์ค๊ณ
from scipy import optimize
model.compile(
loss='mean_squared_error',
optimizer='SGD',
metrics=['mse']
)
- ๋ชจ๋ธํ์ต
model.fit(X_train, y_train, validation_split=0.2, epochs=20)
- ๋ชจ๋ธํ๊ฐ
model.evaluate(X_test,y_test)
model = Sequential()
# ์
๋ ฅ์ธต - ํ์ต ๋ฐ์ดํฐ์ ์ปฌ๋ผ์ด 30๊ฐ๋ผ๋ฉด ์ ํํ๊ฒ "30"์ผ๋ก ์ง์ ํด์ฃผ์ด์ผ ํจmodel.add(InputLayer(input_shape=(30,)))
# ์ค๊ฐ์ธต (์๋์ธต), units๊ณผ activation์ ๋์์ ์ค ์ ์๋ค.
model.add(Dense(units=16, activation='sigmoid'))
model.add(Dense(units=8, activation='sigmoid'))
# ์ถ๋ ฅ์ธต : ์ถ๋ ฅ๋ฐ๊ณ ์ถ์ ๋ฐ์ดํฐ์ ํํ๋ฅผ ์ง์ ํจ(์ด์ง๋ถ๋ฅ 1๊ฐ์ ํ๋ฅ ๊ฐ 0~1)
model.add(Dense(units=1, activation='sigmoid'))
์ ํ๋ชจ๋ธ + ํ์ฑํํจ์
- ํ์ฑํ ํจ์ (์ค๊ฐ์ธต, ์ถ๋ ฅ์ธต์์ ์ฌ์ฉ)
- ์ค๊ฐ์ธต : ํ์ฑํ/ ๋นํ์ฑํ(์ญ์น)
- ์คํ ํ์ => ์๊ทธ๋ชจ์ด๋ (์? ์ต์ ํ์๊ณ ๋ฆฌ์ฆ ๊ฒฝ์ฌํ๊ฐ๋ฒ์ ์ ์ฉํ๊ธฐ ์ํด ๊ธฐ์ธ๊ธฐ์ ์ญ์น๊ฐ๋ ์ ๊ฐ์ง๋ ์๊ทธ๋ชจ์ด๋ ์ฌ์ฉ)
- ์ถ๋ ฅ์ธต : ์ต์ข
๊ฒฐ๊ณผ์ ํํ๋ฅผ ๊ฒฐ์
(๋ด๊ฐ ์ถ๋ ฅํ๊ณ ์ ํ๋ ํํ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์์ฑ, units/activation)
# ์์คํจ์๋ก cross entropy ์ฌ์ฉ
# ์ด์ง๋ถ๋ฅ์ด๊ธฐ ๋๋ฌธ์ binary_crossentropy
from scipy import optimize
model.compile(
ย ย loss='binary_crossentropy',
ย ย optimizer='SGD',
ย ย metrics=['accuracy']
)
- ํ๊ท : units =1
- ์ด์ง๋ถ๋ฅ : units = 1
- ๋ค์ค๋ถ๋ฅ : units = ํด๋์ค์ ๊ฐ์
- ํ๊ท : activation='linear' (ํญ๋ฑํจ์, y=x ์ ํ ๋ชจ๋ธ์ด ์์ธกํ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์ถ๋ ฅ) ๊ธฐ๋ณธ๊ฐ, ์ ์ด์ฃผ์ง ์์๋ ๊ด์ฐฎ๋ค
- ์ด์ง๋ถ๋ฅ : activation='sigmoid' (0~1 ์ฌ์ด์ ํ๋ฅ ๊ฐ์ ์ถ๋ ฅ)
- ๋ค์ค๋ถ๋ฅ : activation='softmax' (ํด๋์ค์ ๊ฐ์๋งํผ ํ๋ฅ ๊ฐ์ ์ถ๋ ฅ => ๊ฐ๊ฐ์ ํ๋ฅ ๊ฐ์ ์ดํฉ์ด 1์ด ๋๋๋ก ์ถ๋ ฅ)
์ถ๋ ฅ ํํ | ํ์ฑํ ํจ์ | ์์ค ํจ์ | ์ค๋ช |
---|---|---|---|
ํ๊ท | Linear | Mean Squared Error (MSE) | ํญ๋ฑํจ์๋ฅผ ์ฌ์ฉํ ํ๊ท ๋ชจ๋ธ์ ์ฃผ๋ก ์ฌ์ฉ |
์ด์ง ๋ถ๋ฅ | Sigmoid | Binary Cross-Entropy (BCE) | 0๊ณผ 1 ์ฌ์ด์ ํ๋ฅ ๊ฐ์ ์ถ๋ ฅํ๋ ์ด์ง ๋ถ๋ฅ ๋ชจ๋ธ์ ์ฌ์ฉ |
๋ค์ค ๋ถ๋ฅ | Softmax | Categorical Cross-Entropy | ๋ค์ค ํด๋์ค ๋ถ๋ฅ ๋ชจ๋ธ์์ ํด๋์ค ๊ฐ์ ๊ต์ฐจ ์ํธ๋กํผ ์ฌ์ฉ |
h1 = digit_model.fit(X_train,y_train,
validation_split=0.2,
epochs = 20)
ValueError: Shapes (32, 1) and (32, 10) are incompatible
- ๋ฐฉ๋ฒ1: ์ ๋ต๋ฐ์ดํฐ๋ฅผ ํ๋ฅ ๋ก ๋ณ๊ฒฝ
์ ๋ต ๋ฐ์ดํฐ๋ฅผ ํ๋ฅ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ ๋ต ๋ฐ์ดํฐ๋ ํ์ฌ ํด๋์ค ์ค ํ๋๋ฅผ ๋ํ๋ด๋ ํํ๋ก ๋์ด ์์ ๊ฒ์ด๋ฉฐ, ๋ชจ๋ธ์ ์ถ๋ ฅ์ 10๊ฐ์ ํด๋์ค์ ๋ํ ํ๋ฅ ๊ฐ์ ์ถ๋ ฅํ๊ณ ์์ต๋๋ค. ์ด ๋ ํํ๋ฅผ ํธํ์ํค๊ธฐ ์ํด ์ ๋ต ๋ฐ์ดํฐ๋ฅผ ํ๋ฅ ๋ก ๋ณํํ์ฌ ๋ชจ๋ธ๊ณผ ๋น๊ตํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด ์-ํซ ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ๊ฑฐ๋ ์ ๋ต ํด๋์ค์ ํด๋นํ๋ ํ๋ฅ ์ 1๋ก, ๋๋จธ์ง ํด๋์ค์๋ 0์ผ๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
from tensorflow.keras.utils import to_categorical
one_hot_y_train = to_categorical(y_train)
one_hot_y_train[0:2]
- ๋ฐฉ๋ฒ2: loss ํจ์๋ฅผ ๋ณ๊ฒฝ
Keras๋ ๋ค์ํ loss ํจ์๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ชจ๋ธ์ ํ์ตํ ๋ ์ฌ์ฉํ๋ loss ํจ์๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, categorical cross-entropy loss ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ธ์ด 10๊ฐ์ ํด๋์ค์ ๋ํ ํ๋ฅ ๋ถํฌ๋ฅผ ์ถ๋ ฅํ๋๋ก ๋ชจ๋ธ์ ํ์ตํ ์ ์์ต๋๋ค. ์ด๋ฌํ loss ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ธ์ด ํ๋ฅ ๋ก ์ถ๋ ฅํ๋๋ก ์๋์ผ๋ก ์กฐ์ ๋ฉ๋๋ค. ๋ฐ๋ผ์, ์์ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ ํํ์ฌ ๋ชจ๋ธ์ ์์ ํ๋ฉด ๋ฉ๋๋ค.
digit_model.compile(loss = 'sparse_categorical_crossentropy',
optimizer= 'SGD',
metrics = ['accuracy'])
- ํ์ด์ฌ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
# ํ์ด์ฌ์์ ์ด๋ฏธ์ง๋ฅผ ์ฒ๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
import PIL.Image as pimg
# ์ด๋ฏธ์ง ์คํ, ํ๋ฐฑ์ด๋ฏธ์ง๋ก ๋ณ๊ฒฝ
img = pimg.open('/content/drive/MyDrive/Colab Notebooks/DeepLearning(Spring)/แแ
ฉแซแแ
ณแฏแแ
ต/0.png').convert('L')
plt.imshow(img, cmap = 'gray')
# predict
digit_model.predict(test_img)
๊ณผ์ | ์ค๋ช | ๋ชฉ์ |
---|---|---|
์์ ํ (Forward Propagation) | ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ์ธต์์ ์ถ๋ ฅ์ธต๊น์ง ์ ๋ฌํ์ฌ ์์ธก ๊ฐ์ ๊ณ์ฐํ๋ ๊ณผ์ | ์ถ๋ ฅ ๊ฐ์ ์ถ๋ก ํ๊ธฐ ์ํจ |
์ญ์ ํ (Backpropagation) | ์ถ๋ ฅ์ธต์์ ๋ฐ์ํ ์๋ฌ๋ฅผ ์ ๋ ฅ์ธต๊น์ง ์ ํํ์ฌ ๊ฐ์ค์น๋ฅผ ์กฐ์ ํ๋ ๊ณผ์ | ๋ชจ๋ธ์ ํ์ตํ์ฌ ์ต์ ์ ๊ฒฐ๊ณผ ๋์ถ |
ํจ์ | ํน์ง |
---|---|
Step Function | - ๋ฏธ๋ถ ๋ถ๊ฐ๋ฅ (๊ธฐ์ธ๊ธฐ๊ฐ ์์) |
- ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ | |
- ์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ 0 ๋๋ 1์ ์ถ๋ ฅ (์ด์ง ๋ถ๋ฅ์ ์ ํฉ) | |
Sigmoid Function | - ๋งค๋๋ฌ์ด ๊ณก์ ํํ |
- ๋ฏธ๋ถ ๊ฐ๋ฅํ์ง๋ง ๊ธฐ์ธ๊ธฐ ์์ค ๋ฌธ์ ๋ฐ์ | |
- ์ ๋ ฅ๊ฐ์ด ํฌ๊ฑฐ๋ ์์ ๋ ๊ธฐ์ธ๊ธฐ๊ฐ 0์ ๊ฐ๊น๊ฒ ์๋ ดํ์ฌ ํ์ต์ด ์ด๋ ค์์ง ์ ์์ | |
- ํ๋ฅ ๊ฐ์ ์ถ๋ ฅํ๋ ๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋จ | |
ReLU (Rectified Linear Unit) | - ๋ฏธ๋ถ ๊ฐ๋ฅํ๋ฉฐ ๊ธฐ์ธ๊ธฐ ์์ค ๋ฌธ์ ๋ฅผ ์ค์ผ ์ ์์ |
- ์ ๋ ฅ๊ฐ์ด ์์์ธ ๊ฒฝ์ฐ ๊ทธ๋๋ก ์ถ๋ ฅํ๊ณ ์์์ธ ๊ฒฝ์ฐ 0์ผ๋ก ์ถ๋ ฅ | |
- ํ์ต์ด ๋น ๋ฅด๊ณ ํจ๊ณผ์ ์ผ ์ ์์ผ๋ฉฐ, ์ฃผ๋ก ์๋์ธต์ ํ์ฑํ ํจ์๋ก ์ฌ์ฉ๋จ |
- 'step function'์ ๊ฒฝ์ฌํ๊ฐ๋ฒ์ ์ฌ์ฉํ์ง ๋ชปํจ(๊ธฐ์ธ๊ธฐ ์๊ธฐ ๋๋ฌธ)
- ๊ทธ๋ฌ๋ ๋ฏธ๋ถํ ๋ ๊ธฐ์ธ๊ธฐ ์์ค ๋ฌธ์ ๋ฐ์
- ํ ๋ฒ ์ธต์ ์ฎ๊ธธ ๋๋ง๋ค 1/4(0.25)๋ก ๊ธฐ์ธ๊ธฐ๊ฐ ์ค์ด๋ ๋ค.
- ๊ธฐ์ธ๊ธฐ ์์ค ๋ฌธ์ ํด๊ฒฐ
// ์๊ธ์จ 'sigmoid' => 'relu'
digit_model = Sequential()
digit_model.add(InputLayer(input_shape = (28,28)))
digit_model.add(Flatten())
digit_model.add(Dense(units=16, activation='relu'))
digit_model.add(Dense(units=8, activation='relu'))
digit_model.add(Dense(units=32, activation='relu'))
digit_model.add(Dense(units=16, activation='relu'))
digit_model.add(Dense(units=8, activation='relu'))
# ์ถ๋ ฅ์ธต
digit_model.add(Dense(units=10, activation='softmax'))
ex03. ํ์ฑํํจ์, ์ต์ ํํจ์, callbackํจ์.ipynb
-
๊ฒฝ์ฌํ๊ฐ๋ฒ
- ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ์ ๋ฐ์ดํธ
-
ํ๋ฅ ์ ๊ฒฝ์ฌํ๊ฐ๋ฒ (Stochastic Gradient Descent
- ํ๋ฅ ์ ์ผ๋ก ์ ํ๋ ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ์ ๋ฐ์ดํธ
- ๊ฒฝ์ฌํ๊ฐ๋ฒ๋ณด๋ค ๋ ๋นจ๋ฆฌ, ๋ ์์ฃผ ์ ๋ฐ์ดํธํ๋ค.
-
๋ชจ๋ฉํ
- ๊ด์ฑ์ ์ ์ฉํด ์ ๋ฐ์ดํธ ํ์ฌ batch ๋ฟ๋ง ์๋๋ผ ์ด์ batch ๋ฐ์ดํฐ์ ํ์ต ๊ฒฐ๊ณผ๋ ๋ฐ์
ฮฑ : learning rate, m : ๋ชจ๋ฉํ ๊ณ์
-
๋ค์คํ ๋กํ ๋ชจ๋ฉํ (NAG)
- ๋ฏธ๋ฆฌ ํด๋น ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋ค๊ณ ๊ฐ์ ํ๊ณ ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ณ์ฐํด๋ณธ ๋ค ์ค์ ์ ๋ฐ์ดํธ ๋ฐ์
-
adam
- ์์ฆ ๊ฐ์ฅ ๊ฐ๊ด๋ฐ๋ ์ต์ ํ ํจ์
์กฐํฉ | ํน์ง |
---|---|
sigmoid + SGD | - ์์ฃผ ๋ฎ์ ์ ํ๋๋ฅผ ๋ณด์. <br> - Sigmoid ํจ์๋ ๊ทธ๋๋์ธํธ ์์ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด, ๋ฅ ๋ด๋ด ๋คํธ์ํฌ์์๋ ์ ํ์ฉ๋์ง ์์ต๋๋ค. <br> - SGD๋ ํ์ต ์๋๊ฐ ๋๋ฆด ์ ์์ต๋๋ค. |
relu + SGD | - ์ค๊ฐ ์ ๋์ ์ ํ๋๋ฅผ ๋ณด์. <br> - ReLU๋ ๊ทธ๋๋์ธํธ ์์ค ๋ฌธ์ ์ ๋ ๋ฏผ๊ฐํ์ง๋ง, SGD๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ ํ ํ์ต ์๋๊ฐ ๋๋ฆด ์ ์์ต๋๋ค. |
relu + Adam | - ๊ฐ์ฅ ๋์ ์ ํ๋๋ฅผ ๋ณด์. <br> - ReLU์ Adam ์กฐํฉ์ ๊ทธ๋๋์ธํธ ์์ค ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ฐฉ์งํ๊ณ , Adam ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์ ํ์ต๋ฅ ์กฐ์ ๋ก ๋น ๋ฅธ ํ์ต์ ์ง์ํฉ๋๋ค. |
- ์ผ๋ฐ์ ์ผ๋ก PC ๋ฉ๋ชจ๋ฆฌ์ ํ๊ณ ๋ฐ ์๋ ์ ํ ๋๋ฌธ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ ํ๋ฒ์ epoch์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ์ง์ด๋ฃ๊ธฐ๊ฐ ํ๋ฆ
epochs ๋น ํ์ต : train_data_size/batch_size
- batch size 32 : 1500/1500 => batch size 128 : 375/375
- ๋ชจ๋ธ์ ์ฅ ๋ฐ ์กฐ๊ธฐํ์ต์ค๋จ
- ๋ชจ๋ธ์ ์ฅ
- ๋ฅ๋ฌ๋๋ชจ๋ธ ํ์ต์ ์ง์ ๋ epoch ๋ฅผ ๋ค ๋๋ด๋ฉด ๊ณผ๋์ ํฉ์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค -> ์ค๊ฐ์ ์ผ๋ฐํ๋ ๋ชจ๋ธ์ ์ ์ฅํ ์ ์๋ ๊ธฐ๋ฅ!!
- ์กฐ๊ธฐํ์ต ์ค๋จ
- epoch ๋ฅผ ํฌ๊ฒ ์ค์ ํ ๊ฒฝ์ฐ ์ผ์ ํ์ ์ด์์ผ๋ก๋ ๋ชจ๋ธ์ ์ฑ๋ฅ์ด ๊ฐ์ ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. -> ์๊ฐ๋ญ๋น -> ๋ชจ๋ธ์ ์ฑ๋ฅ์ด ๊ฐ์ ๋์ง ์๋ ๊ฒฝ์ฐ์๋ ์กฐ๊ธฐ์ค๋จ์ด ํ์
-
์ฝ๋ฐฑํจ์ ์ํฌํธ
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
-
hdf5 ํ์ผ(๋ชจ๋ธ ๋ก๊ทธ) ๊ฒฝ๋ก ์์ฑ
model_path = '/content/drive/MyDrive/Colab Notebooks/DeepLearning(Spring)/data/digit_model/dm_{epoch:02d}_{val_accuracy:0.2f}.hdf5'
- ModelCheckpoint
ModelCheckpoint(
filepath = model_path,
verbose = 1,
save_best_only = True,
monitor = 'val_accuracy'
)
- EarlyStopping
model_path = '/content/drive/MyDrive/Colab Notebooks/DeepLearning(Spring)/data/digit_model/dm_{epoch:02d}_{val_accuracy:0.2f}.hdf5'
mckp = ModelCheckpoint(
filepath = model_path,
verbose = 1, # ๋ก๊ทธ ์ถ๋ ฅ, 1: ๋ก๊ทธ ์ถ๋ ฅ ํด์ฃผ์ธ์
save_best_only = True, # ๋ชจ๋ธ ์ฑ๋ฅ์ด ์ต๊ณ ์ ์ ๊ฐฑ์ ํ ๋๋ง๋ค ์ ์ฅ
monitor = 'val_accuracy' # ์ต๊ณ ์ ์ ๊ธฐ์ค์น
)
- ํ์ต (callbacks = [mckp, early] ํ๋ผ๋ฏธํฐ ์ถ๊ฐ)
h4 = model3.fit(
X_train,
y_train,
validation_split=0.2,
epochs = 1000,
batch_size=128,
callbacks = [mckp, early]
)
- ํ์ผ๋ก ์ ์ฅ๋ ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ
from tensorflow.keras.models import load_model
best_model = load_model('/content/drive/MyDrive/Colab Notebooks/DeepLearning(Spring)/data/digit_model/dm_19_0.73.hdf5')
- ์ด๋ฏธ์ง ํ์ต ๊ฐ๋ฅ (2์ฐจ์์ ๋ฐ์ดํฐ๋ ํ์ต)
- ๋ฐ์ดํฐ์ ํน์ง์ ์ถ์ถํ๊ณ ์ถ์ถ๋ ํน์ง์ ๊ธฐ๋ฐ์ผ๋ก ํ์ต
- ์ด๋ฏธ์ง์ ํฌ๊ธฐ, ๋ฐฉํฅ ๋ฑ์ ํฌ๊ฒ ๊ด์ฌํ์ง ์๋๋ค
- CNN ์ธต์ CONV LAYER, POOLING LAYER ์๋ค.
Layer | Function |
---|---|
CONV | ํน์ง์ ์ฐพ๋๋ค. |
POOLING | ํน์ง์ด ์๋ ๋ถ๋ถ์ ์ฐพ์ ํด์๋๋ฅผ ๋ฎ์ถ๋ค. |
DENSE | ์ฐพ์์ง ํน์ง์ ํ ๋๋ก ์ฌ๋ฌผ์ ๊ตฌ๋ถํ ๊ท์น์ ๋ง๋ ๋ค. |
a. ImageDataGenerator
- ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ ์ฆ๊ฐํ๊ธฐ ์ํ ๋๊ตฌ๋ฅผ ์ ๊ณต
- ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ถํ๋ฆฌ๊ธฐ ์ํด ์ฌ์ฉ
# ํ๋์ ๋ณ์์ ์ด๋ฏธ์ง ํ์ผ ์ ๋ถ๋ค ํฉ์น๊ธฐ
from tensorflow.keras.preprocessing.image import ImageDataGenerator
- ํฝ์
๊ฐ ์ ๊ทํ (0
255 โ 01)
generator = ImageDataGenerator(rescale= 1./255)
- ํ๋์ ๋ณ์์ ์ด๋ฏธ์ง ํ์ผ ์ ๋ถ ๋ด๊ธฐ
- target_size = (150,150) : ๋ณํํ ์ด๋ฏธ์ง์ ํฌ๊ธฐ
- class_mode = 'binary' : ๋ผ๋ฒจ๋ง ๋ฐฉ๋ฒ, ๋ค์ค๋ถ๋ฅ : categorical
train_generator = generator.flow_from_directory(
directory = train_dir,
target_size = (150,150),
batch_size = 100,
class_mode = 'binary'
)
valid_generator = generator.flow_from_directory(
directory = valid_dir,
target_size = (150,150),
batch_size = 100,
class_mode = 'binary'
)
b. ๋ชจ๋ธ ์ค๊ณ๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Flatten
c. CNN ๋ชจ๋ธ ์ค๊ณ
- filter = 32 : ์ฐพ์ ํน์ง์ ๊ฐฏ์
- kernel_size = (3,3) : ํน์ง์ ํฌ๊ธฐ
- input_shape = (150,150,3) : ์
๋ ฅ ๋ฐ์ดํฐ์ ๋ชจ์ (๊ฐ๋ก, ์ธ๋ก, RGB)
- 0 : ๊ฒ์์, 255 : ํฐ์
- ์ ๊ตฌ : ์ฒซ ๋ฒ์งธ Conv2D์๋ง ์ง์ ํด์ค๋ค.
model1 = Sequential()
model1.add(Conv2D(
filters = 32,
kernel_size = (3,3),
input_shape = (150,150,3),
activation = 'relu'
))
model1.add(MaxPool2D(
pool_size= (2,2)
))
model1.add(Conv2D(
filters = 32,
kernel_size = (3,3),
activation = 'relu'
))
model1.add(MaxPool2D(
pool_size= (2,2)
))
d. ๋ถ๋ฅ๋ถ์ & ์ถ๋ ฅ
- model1.add(Flatten()) : ํน์ง์ถ์ถ๋ถ์ ๋ถ๋ฅ๋ถ๋ฅผ ์ด์ด์ฃผ๋ ์ญํ
- model1.add(Dense(units = 32, activation = 'relu')) : Dense์ธต ์ถ๊ฐ
- model1.add(Dense(units= 1, activation = 'sigmoid')) : ์ถ๋ ฅ์ธต
- ์ด์ง ๋ถ๋ฅ๋ฅผ ํด์ผ๋๋ฏ๋ก sigmoid๋ฅผ ์ด๋ค.
model1.add(Flatten())
model1.add(Dense(units = 32, activation = 'relu'))
model1.add(Dense(units= 1, activation = 'sigmoid'))
e. ํ์ต ๋ฐฉ๋ฒ ์ค์ (compile)
model1.compile(
loss = 'binary_crossentropy',
optimizer = 'Adam',
metrics = ['accuracy']
)
f. ํ์ตํ๊ธฐ (fit)
- train_generator : ํ์ต๋ฐ์ดํฐ (X_train, y_train ํฉ์ณ์ ธ ์๋ค)
- valid_generator : ๊ฒ์ฆ๋ฐ์ดํฐ (X_val, y_val)
model1.fit(
train_generator,
epochs = 20,
validation_data = valid_generator
)
- filter๋ฅผ ๋ณด๋ฉด ์ถ์์ํ๋ง ์ผ๋ก์ธํด ๊ฐ์ฅ์๋ฆฌ๊ฐ ์ฃฝ์ ๊ฒ์ ๋ณผ ์ ์๋ค.
b. ์ถ์์ํ๋ง
- ์ถ์ ์ํ๋ง์ ์งํํ ๋ :
padding='valid'
- ์ถ์ ์ํ๋ง์ ์งํ ์ํ ๋ :
padding='same'
- ์ด ๋ ์๋ณธ ์ด๋ฏธ์ง์ ๊ฐ์ฅ์๋ฆฌ๋ฅผ 0์ผ๋ก ์ฑ์๋ฃ์ด ์์์ง ๋งํผ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ํค์ด๋ค
- ์ฆ์
- ์ฅ์ : ๊ฐ๋จ
- ๋จ์ : ๊ฐ์ง๋ ๊ฐ์ง๋ค. (๊ธ๊ฒฉํ ์ฑ๋ฅ ํฅ์์ ์๋ค)
- epoch ์๋ ์ฆ๊ฐ์์ผ์ฃผ์ด์ผํ๋ค.
- dropout()
- ์ธต์ ์ฌ์ฉํ๋ ํผ์ ํธ๋ก ์ ์๋ฅผ ์ค์ ํ ๋น์จ๋งํผ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ๋ฒ
- epoch๋ง๋ค ์ฌ์ฉํ์ง ์๋ ํผ์ ํธ๋ก ์ ๋๋ค
- BatchNormalization() : ์ ๊ทํ
- CNN์ธต = Conv (ํน์ฑ์ถ์ถ) + Maxpooling (ํฌ๊ธฐ ์ถ์)
- Conv์ธต์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๊ทํ(ํ๊ท 0, ๋ถ์ฐ 1)
=> ์์๊ฐ ๋ฐ์
=> relu๋ฅผ ์ ์ฉํ๋ฉด
=> ์์๊ฐ ์ฌ๋ผ์ง๋ ๋ฌธ์ => leaky relu
- GlobalAveragePooling2D()
- CNN์์ ๊ฐ์ฅ ๋ฌธ์ ๊ฐ ๋๋ ์ธต : Maxpooling ์ธต
=> CNN ์๋์ 60% ์ด์์ ์ฐจ์ง (๋๋ฆฌ๋ค) - Maxpooling2D+ Flatten()
- Dense ์ธต๊ณผ ์ฐ๊ฒฐ๋๋ ์ธต์ ์ฌ์ฉ
- CNN์์ ๊ฐ์ฅ ๋ฌธ์ ๊ฐ ๋๋ ์ธต : Maxpooling ์ธต
from tensorflow.keras.layers import Dropout, BatchNormalization, GlobalAveragePooling2D
- Dropout ์ธต์ ํ๋ผ๋ฏธํฐ ์ ์ฐจ์ด๊ฐ ์ปค์ ๊ณผ์ ํฉ์ด ๋ฐ์ํ๊ธฐ ์ฌ์ด ์ธต๊ณผ ์ธต ์ฌ์ด์ ์ง์ด๋ฃ๋๋ค.
# ๋ชจ๋ธ์ ์ธต, ํ๋ผ๋ฏธํฐ ์ ํ์ธ
model1.summary()
# Dropout ์ธต ์ถ๊ฐ
model1.add(Dropout(0.5))
# ๋๋กญ์์ ์ธต์ ๋ฃ๊ณ ๋ชจ๋ธ์ ํ์ตํ๋ฉด ๊ณผ์ ํฉ์ด ์ด์ง ์ค์ด๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
- ์ธต์ ์ถ๊ฐํ๋ฉด ํ๋ผ๋ฏธํฐ๊ฐ์ ์ฐจ์ด๊ฐ ํ ์ค์ด๋๋ ๊ฒ์ ๋ณผ ์์๋ค.
# GlobalAveragePooling ์ธต ์ถ๊ฐ
model1.add(GlobalAveragePooling2D())
# ์ด ์ธต์ผ๋ก ํ์ต์ ์งํํ๋ฉด ์ ํ๋๋ ๋งค์ฐ ๋จ์ด์ง์ง๋ง, ๊ณผ์ ํฉ์ด ์๋นํ ๊ฐ์ ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
- Conv2D()์ Activation() ์ธต ์ฌ์ด์ ๋ฐฐ์น
- Activation()์ด ์ ๊ทํ ๊ธฐ๋ฅ์ ์ผ๋ถ ์ํ => Activation() ๋ค์์ ๋ฐฐ์นํ๋ฉด ํจ๊ณผ๊ฐ ๋จ์ด์ง
- ์์น : C + B + A + M => ๊ทผ๋ฐ ์ผ๋ฐ์ ์ผ๋ก : C + A + B + M
- ์ฑ๋ฅ์ด ํ์คํ๊ฒ ํฅ์๋๋ ๊ฒ ์ฅ์ ์ด๋ค.
- ๋จ์ : ์ ์ข์์ง๋์ง ์ ๊ธธ์ด ์๋ค.
-
์ ์ดํ์ต ํ๋ ์ด์
- ๋ฐ์ดํฐ๊ฐ ๋ถ์กฑ
- ์ค๊ณํ ์ ๊ฒฝ๋ง์ด ๊ทธ๋ฅ ์ข์ง ๋ชปํ๋ค
-
์ ์ดํ์ต์ ์ข ๋ฅ
- ํน์ฑ ์ถ์ถ : CNN์ธต์ ๊ฐ์ค์น๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ
- ๋ฏธ์ธ ์กฐ์ (fine tuning) : CNN์ธต์ ๊ฐ์ค์น๋ฅผ ์ผ๋ถ ์ด์ง ๋ณ๊ฒฝํด์ ์ฌ์ฉ
from tensorflow.keras.applications import VGG16
# weights : ์ฌ์ฉํ ๊ฐ์ค์น์ ์ข
๋ฅ (imagenet)
# include_top = False : ๋ชจ๋ธ์ ์ ์ฒด ๋๋ ํน์ฑ์ถ์ถ๊ธฐ๋ง ๊ฐ์ ธ์ฌ ๊ฒ์ธ์ง ์ ํ (False : ํน์ฑ์ถ์ถ๊ธฐ๋ง ๊ฐ์ ธ์ด)
conv_base = VGG16(
weights = "imagenet",
include_top = False,
input_shape = (150, 150, 3)
)
- summary
๋ชจ๋ธ.summary()
- plot_model
- summary ๋ฐฉ์๋ณด๋ค ์ข ๋ ์ง๊ด์ ์
plot_model(๋ชจ๋ธ, show_shapes= True, dpi=60)
- visual keras
- visual keras ๋ค์ด๋ก๋
!pip install visualkeras
- ๊ตฌ๋ก๋ฅผ ์ด๋ฏธ์ง๋ก ์๊ฐํ
import visualkeras
visualkeras.layered_view(๋ชจ๋ธ).show()
visualkeras.layered_view(๋ชจ๋ธ, legend=True)
์ด๋ฟ๋น..
- ๊ธฐ๋ณธ ๋ชจ๋ธ์ ์ด๋ฏธ ๋ง๋ค์ด์ ธ์๋ conv_base ๋ชจ๋ธ ์ธต์ ํต์งธ๋ก ์ด์ด๋ถ์ฌ ํ์ตํจ.
- ๊ตฌ์กฐ : conv_base => ๊ธฐ์กด์ ๋ง๋ค์ด์ ธ์๋ ๋ชจ๋ธ
model1 = Sequential()
model1.add(conv_base)
model1.add(Flatten())
model1.add(Dropout(0.5))
model1.add(Dense(units = 64, activation = LeakyReLU(alpha=0.1)))
model1.add(Dense(units = 128, activation = LeakyReLU(alpha=0.1)))
model1.add(Dense(units = 64, activation = LeakyReLU(alpha=0.1)))
model1.add(Dense(units = 32, activation = LeakyReLU(alpha=0.1)))
model1.add(Dense(units = 1, activation = 'sigmoid'))
model1.summary()
- ๋ชจ๋ธ์ ์ด์ด๋ถ์ผ ๋, ๋๊ฒฐ์์ผ์ฃผ๋ ๊ณผ์ ์ด ํ์ํ๋ค
- ๊ฐ์ ธ์จ ๋ชจ๋ธ์ ํ์ต์ด ๋์ง ์๋๋ก ์ค์
- ๋๊ฒฐ ํ ๋ชจ๋ธ ํ์ตํ๋ฉด ์ฑ๋ฅ์ด ๊ต์ฅํ ํฅ์๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
conv_base.trainable = False
- fit ๊ฒฐ๊ณผ : val_accuracy๊ฐ 89%๊น์ง ์ฌ๋ผ๊ฐ ๊ฒ์ ๋ณผ ์ ์๋ค.
Epoch 10/10
20/20 [==============================] - 9s 461ms/step - loss: 0.1216 - accuracy: 0.9515 - val_loss: 0.3081 - val_accuracy: 0.8850
- ๋ถ๋ฅ๊ธฐ๊ฐ ์ฐ๊ฒฐ๋๋ ๋ชจ๋ธ์ ์ธต๋ง ํ์ต์ด ๋๋๋ก ๋๊ฒฐ์ ํ์ด์ฃผ๋ ๊ฒ
์ธต | 1๋ฒ์ธต | 2๋ฒ์ธต | 3๋ฒ์ธต | 4๋ฒ์ธต | 5๋ฒ์ธต |
---|---|---|---|---|---|
ํ์ต | ํ์ตx | ํ์ตx | ํ์ตx | ํ์ตx | ํ์ตo |
conv_base.trainable = True
set_trainable = False
for layer in conv_base.layers:
if layer.name == "block5_conv1":
set_trainable = True
if set_trainable :
layer.trainable = True
else:
layer.trainable = False
- ๋ค์ ์ฝ๋๋ฅผ ์์ฑํด์ Xception ๋ชจ๋ธ์ ๋ถ๋ฌ์ฌ ์ ์๋ค
from tensorflow.keras.applications import Xception
conv_base2 = Xception(
weights ="imagenet",
include_top =False,
input_shape = (150, 150,3)
)
- ์๊ฐํ ํด๋ณด๋ฉด ๊ต์ฅํ ๊ธธ๊ณ ๋ณต์กํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค
- BatchNormalization ์ธต์ด ์ถ๊ฐ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์์.
- ํ์ต ๊ฒฐ๊ณผ : val_accuracy๊ฐ 97%๋ก ์ฑ๋ฅ์ด ๋งค์ฐ ์ฌ๋ผ๊ฐ ๊ฒ์ ๋ณผ ์ ์๋ค.
Epoch 10/10
20/20 [==============================] - 9s 429ms/step - loss: 9.1577e-04 - accuracy: 1.0000 - val_loss: 0.1350 - val_accuracy: 0.9690
ํ๋ก์ ํธ005_YoloV7๊ธฐ๋ฐ_Custom๋ฐ์ดํฐ๋ก_๊ฐ์ฒดํ์ง.ipynb
-
์ด ํ๋ก์ ํธ์ ์๋ ํํ ๋ฆฌ์ผ ๋๊ฐ์ด ๋ฐ๋ผํ๋ฉด ๋๋ค.
-
Yolov5s, Yolov5m, YOlov5l, Yolov5x ์์ ๋ ํ์ฌ ์ปดํจํฐ๋ก l,x๋ ๋ชป์ด๋ค.
-
- ์ด๋ ธํ ์ด์ ์์ ์ ์ํด ๊ฐ์ฅ ๋ง์ด ์ฐ๋ ์ฌ์ดํธ