Skip to content

rimgosu/DeepLearning

Repository files navigation

image

DeepLearning

Text Mining

image

9์›” 13์ผ (๋จธ์‹ ๋Ÿฌ๋‹ ๋ณต์Šต, ํ…์ŠคํŠธ ๋งˆ์ด๋‹)

ex01. TextMining(์˜ํ™”๋ฆฌ๋ทฐ ๊ฐ์„ฑ๋ถ„์„)

๋จธ์‹ ๋Ÿฌ๋‹ ์ข…๋ฅ˜

  1. ์ง€๋„ํ•™์Šต
    • ๋ถ„๋ฅ˜(ใ…‚) : ์ •๋‹ต ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฒ”์ฃผํ˜•(ใ…‚),
      class : ์ •๋‹ต ๋ฐ์ดํ„ฐ์˜ ๊ฐฏ์ˆ˜
      โ€ป๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ : ๋ถ„๋ฅ˜๋ชจ๋ธ(์–œ ํŠน์ดํ•˜๊ฒŒํšŒ๊ท€์ง€๋งŒ ๋ถ„๋ฅ˜๋ชจ๋ธ์ž„)
    • ํšŒ๊ท€(ใ…‡) : ์ •๋‹ต ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฐ์†ํ˜•(ใ…‡)
  2. ๋น„์ง€๋„ํ•™์Šต
  3. ๊ฐ•ํ™”ํ•™์Šต

๋จธ์‹ ๋Ÿฌ๋‹ ๋ถ„์„ ํ”„๋กœ์„ธ์Šค

  1. ๋ฌธ์ œ์ •์˜
  2. ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
  3. ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ
  4. EDA (ํƒ์ƒ‰์  ๋ฐ์ดํ„ฐ ๋ถ„์„) - ์‹œ๊ฐํ™”
  5. ๋ชจ๋ธ ์„ ํƒ ๋ฐ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ์„ ํƒ
  6. ๋ชจ๋ธ ํ•™์Šต (fit)
  7. ๋ชจ๋ธ ์˜ˆ์ธก ๋ฐ ํ‰๊ฐ€ (predict, score)

ํ…์ŠคํŠธ๋งˆ์ด๋‹

  • ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ ๋ฐฉ์‹ : Natural Language Processing, NLP
  • ์ž์—ฐ์–ด : ์ผ์ƒ์ƒํ™œ์— ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด
  • ์ธ๊ณต์–ธ์–ด : python, ์ˆ˜ํ•™์‹ ๋“ฑ

ํ…์ŠคํŠธ๋งˆ์ด๋‹์˜ ์˜์—ญ

  1. ํ…์ŠคํŠธ ๋ถ„๋ฅ˜
  2. ๊ฐ์„ฑ ๋ถ„์„ (*)
  3. ํ…์ŠคํŠธ ์š”์•ฝ
  4. ํ…์ŠคํŠธ ๊ตฐ์ง‘ํ™” ๋ฐ ์œ ์‚ฌ๋„ ๋ถ„์„

ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ

๋ง๋ญ‰์น˜ >> ๋ฌธ์„œ >> ๋ฌธ๋‹จ >> ๋ฌธ์žฅ >> ๋‹ค์–ด >> ํ˜•ํƒœ์†Œ

  • ํ˜•ํƒœ์†Œ : ์ผ์ •ํ•œ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฐ€์žฅ ์ž‘์€ ๋ง์˜ ๋‹จ์œ„ (ex: ์ฒซ/์‚ฌ๋ž‘)

ํ…์ŠคํŠธ ๋งˆ์ด๋‹ ๋ถ„์„ ํ”„๋กœ์„ธ์Šค

  1. ํ…์ŠคํŠธ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(ํฌ๋กค๋ง)
  2. ํ…์ŠคํŠธ ์ „์ฒ˜๋ฆฌ
  3. ํ† ํฐํ™”(๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜, ์ชผ๊ฐœ๊ธฐ - ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ)
    a. ๋‹จ์–ด๋‹จ์œ„
    b. ๋ฌธ์ž๋‹จ์œ„
    c. n-gram ๋‹จ์œ„(n๊ฐœ์˜ ์—ฐ์†๋œ ๋‹จ์–ด๋ฅผ ํ•˜๋‚˜๋กœ ์ทจ๊ธ‰)
    ex) ICE/CREAM => ICECREAM

  4. ํŠน์ง• ๊ฐ’ ์ถ”์ถœ(์ค‘์š”ํ•œ ๋‹จ์–ด ์ถ”์ถœ)
    TF-IDF : "๋ฌธ์„œ"๋‚ด์—์„œ ์ค‘์š”ํ•œ ๋‹จ์–ด์—ฌ์•ผํ•จ.
    "๋ชจ๋“ ๋ฌธ์„œ" ๋‚ด์—์„œ ์ค‘์š”ํ•œ๊ฑฐ ์ถ”์ถœํ•˜๋ฉด a, the ์™€ ๊ฐ™์ด ํ•„์š” ์—†๋Š” ๋‹จ์–ด๋ฅผ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ฐฉ๊ฐํ•  ์ˆ˜ ์žˆ์Œ.
  5. ๋ฐ์ดํ„ฐ ๋ถ„์„

ํ† ํฐํ™”

์›ํ•ซ ์ธ์ฝ”๋”ฉ

image

TF-IDF

๊ฐœ๋ณ„ ๋ฌธ์„œ์—์„œ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ๋‹จ์–ด์—๋Š” ๋†’์€ ๊ฐ€์ค‘์น˜๋ฅผ ์ฃผ๋˜, ๋ชจ๋“  ๋ฌธ์„œ์— ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ๋‹จ์–ด์—๋Š” ํŒจ๋„ํ‹ฐ
TF : ๋‹จ์–ด๊ฐ€ ๊ฐ ๋ฌธ์„œ์—์„œ ๋ฐœ์ƒํ•œ ๋นˆ๋„
DF : ๋‹จ์–ด X๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์„œ์˜ ์ˆ˜

BOW : BAG OF WORDS

CounterVectorize(๋‹จ์ˆœ ์นด์šดํŒ…) : ๋นˆ๋„ ์ˆ˜ ๊ธฐ๋ฐ˜ image

9์›” 14์ผ (ํ…์ŠคํŠธ๋งˆ์ด๋‹, ๋”ฅ๋Ÿฌ๋‹ ๊ฐœ์š”)

ex01. TextMining(์˜ํ™”๋ฆฌ๋ทฐ ๊ฐ์„ฑ๋ถ„์„)

์ „์ฒ˜๋ฆฌ ๊ณ ๊ธ‰๊ธฐ์ˆ 

txt_train = [i.replace(b'<br />', b'') for i in txt_train]
  • ๋Œ€์ž…๋ณ€์ˆ˜๋ช… =[๋ˆ„์ ํ•˜๊ณ ์‹ถ์€ ๊ฒฐ๊ณผ๊ฐ’ for i in ๋Œ€์ƒ๋ฒ”์œ„]
  • b'' : byte ๋ฌธ์ž์—ด์„ ์˜๋ฏธํ•œ๋‹ค. ์ธ์ฝ”๋”ฉ์„ ํ•˜์ง€ ์•Š์•„ ์†๋„๊ฐ€ ๋น ๋ฅธ ๋Œ€์‹ , b''๋กœ ์จ์ค˜์•ผํ•จ.

CountVectorizer

  • ๋นˆ๋„์ˆ˜ ๊ธฐ๋ฐ˜ ๋ฒกํ„ฐํ™” ๋„๊ตฌ
  • ์˜ค์ง ๋„์–ด์“ฐ๊ธฐ๋งŒ์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜์—ฌ ๋‹จ์–ด๋ฅผ ์ž๋ฅธ ํ›„์— 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() # ํ™•์ธ

LogisticRegression

  • 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

image

  • 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() # ๋ฒกํ„ฐํ™”์ˆ˜์น˜ ๋ณด๊ธฐ

๋”ฅ๋Ÿฌ๋‹ ๊ฐœ์š”

image image

9์›” 15์ผ

ex00. ๋”ฅ๋Ÿฌ๋‹ ๋ง›๋ณด๊ธฐ.ipynb

๊ต์ฐจ์—”ํŠธ๋กœํ”ผ (cross entrophy)

image

  • ํšŒ๊ท€์—์„œ๋Š” ์˜ค์ฐจ๋ฅผ MSE๋กœ ๋ถ„๋ฅ˜ํ•˜์ง€๋งŒ, ๋ถ„๋ฅ˜์—์„œ ์˜ค์ฐจ๋ฅผ ๊ต์ฐจ์—”ํŠธ๋กœํ”ผ๋ฅผ ํ™œ์šฉํ•ด ๊ตฌํ•œ๋‹ค.
  • โ”” (ํ‹€๋ฆด ๋•Œ ์˜ค์ฐจ๋ฅผ ์ฆํญ์‹œํ‚ค๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค.)

๋”ฅ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ

  1. tensorflow

    • ๊ตฌ๊ธ€์ด ๋งŒ๋“  ๋”ฅ๋Ÿฌ๋‹์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  2. keras

    • tensorflow ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์‚ฌ์šฉ์ž ์นœํ™”์  = ์‰ฌ์›€)

์ผ€๋ผ์Šค(Keras)๋Š” TensorFlow, Theano, CNTK ๋“ฑ ๋”ฅ ๋Ÿฌ๋‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฑ์—”๋“œ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋‹ค์ธต ํผ์…‰ํŠธ๋ก  ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ, ์ปจ๋ณผ๋ฃจ์…˜ ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ, ์ˆœํ™˜ ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ, ์กฐํ•ฉ ๋ชจ๋ธ ๋“ฑ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

2017๋…„, ๊ตฌ๊ธ€์€ TensorFlow 2.0๋ถ€ํ„ฐ๋Š” ์ฝ”์–ด ๋ ˆ๋ฒจ์—์„œ Keras๋ฅผ ์ง€์›ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๊ฒ ๋‹ค๊ณ  ๋ฐœํ‘œํ•˜์˜€๊ณ , ํ˜„์žฌ ๋ฐœํ‘œ๋œ TensorFlow 2.0 stable๋ถ€ํ„ฐ๋Š” ์‚ฌ์‹ค์ƒ ์ „๋ถ€ Keras๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋™์ž‘ํ•˜๋„๋ก ๋ฐ”๋€Œ์—ˆ๋‹ค. ์‚ฌ์šฉ์ž์šฉ ํŠœํ† ๋ฆฌ์–ผ ํŽ˜์ด์ง€ 1.15๋ถ€ํ„ฐ deprecated ๋ชฉ๋ก์— ๋“ค์–ด๊ฐ€ ์žˆ๋˜ ์ž์ž˜ํ•œ API๊ฐ€ ๋Œ€๋ถ€๋ถ„ ์ •๋ฆฌ๋˜์—ˆ๊ณ , ์ต์ˆ™๋˜๋ฉด ์กฐ๊ธˆ ๋” ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋™์•ˆ ์ต์ˆ™ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด ์™”๋˜ ๋ชจ๋ธ์„ ๋งŒ๋“  ๋‹ค์Œ session์„ ๋งŒ๋“ค์–ด ๋™์ž‘ํ•˜๋Š” ๊ตฌ์กฐ์— ์ต์ˆ™ํ•˜๋˜ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฉ˜๋ถ•์„ ์ค€ ๊ฒƒ์€ ๋ค.

colab

  • ๋งˆ์šดํŠธ ํ•„์š”.
  • ๋งˆ์šดํŠธ ํ•ด์•ผ ํŒŒ์ผ ๋“œ๋ผ์ด๋ธŒ์— ์ €์žฅํ•ด๋‘๊ณ  ์˜๊ตฌ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.
  • mount ์„ฑ๊ณต ์‹œ "drive" ํด๋”๊ฐ€ ์ƒ์„ฑ๋จ.
  1. ๋งˆ์šดํŠธ ๋ฒ„ํŠผ ํด๋ฆญ image

  2. ๋‹ค์Œ ์ฝ”๋“œ ์‹คํ–‰

from google.colab import drive
drive.mount('/content/drive')

colab ๋‹จ์ถ•ํ‚ค

๊ธฐ๋Šฅ๋‹จ์ถ•ํ‚ค
์‹คํ–‰ (์ปค์„œ ๊ทธ๋Œ€๋กœ ์œ„์น˜)Ctrl + Enter
์‹คํ–‰ ํ›„ ์•„๋ž˜ ์…€๋กœ ์ด๋™Shift + Enter
์‹คํ–‰ ํ›„ ์•„๋ž˜ ์…€ ์ƒ์„ฑ ๋ฐ ์ด๋™Alt + Enter
๋งˆํฌ๋‹ค์šด์œผ๋กœ ์…€ ๋ณ€ํ™˜ (์ฝ”๋“œ -> ํ…์ŠคํŠธ)Ctrl + M, M
์ฝ”๋“œ ๋ชจ๋“œ๋กœ ์…€ ๋ณ€ํ™˜ (ํ…์ŠคํŠธ -> ์ฝ”๋“œ)Ctrl + M, Y
์•„๋ž˜์— ์…€ ์ถ”๊ฐ€Ctrl + M, B
์œ„์— ์…€ ์ถ”๊ฐ€Ctrl + M, A
๋ชจ๋“  ๋‹จ์ถ•ํ‚ค ๋ชฉ๋ก ๋ณด๊ธฐCtrl + M, H

tensorflow

# 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)

9์›” 18์ผ

ex00. ๋”ฅ๋Ÿฌ๋‹ ๋ง›๋ณด๊ธฐ.ipynb

๋”ฅ๋Ÿฌ๋‹ (์„ฑ์ ๋ฐ์ดํ„ฐ)

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import InputLayer, Dense, Activation
  1. ์‹ ๊ฒฝ๋ง ๊ตฌ์กฐ ์„ค๊ณ„
# ๋ผˆ๋Œ€ ์ƒ์„ฑ
model = Sequential()
# ์ž…๋ ฅ์ธต
model.add(InputLayer(input_shape=(1,))) 
# ์ค‘๊ฐ„์ธต (์€๋‹‰์ธต)
model.add(Dense(units=10))
model.add(Activation('sigmoid'))
# ์ถœ๋ ฅ์ธต
model.add(Dense(units=1))
  1. ํ•™์Šต ๋ฐ ํ‰๊ฐ€ ๋ฐฉ๋ฒ• ์„ค๊ณ„
from scipy import optimize
model.compile(
    loss='mean_squared_error', 
    optimizer='SGD', 
    metrics=['mse']
)
  1. ๋ชจ๋ธํ•™์Šต
model.fit(X_train, y_train, validation_split=0.2, epochs=20) 
  1. ๋ชจ๋ธํ‰๊ฐ€
model.evaluate(X_test,y_test)

9์›” 18์ผ

ex01. ์œ ๋ฐฉ์•” ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜(์ด์ง„๋ถ„๋ฅ˜).ipynb

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'))

ํผ์…‰ํŠธ๋ก 

์„ ํ˜•๋ชจ๋ธ + ํ™œ์„ฑํ™”ํ•จ์ˆ˜

  • ํ™œ์„ฑํ™” ํ•จ์ˆ˜ (์ค‘๊ฐ„์ธต, ์ถœ๋ ฅ์ธต์—์„œ ์‚ฌ์šฉ)
  • ์ค‘๊ฐ„์ธต : ํ™œ์„ฑํ™”/ ๋น„ํ™œ์„ฑํ™”(์—ญ์น˜)
  • ์Šคํ… ํŽ‘์…˜ => ์‹œ๊ทธ๋ชจ์ด๋“œ (์™œ? ์ตœ์ ํ™”์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์šธ๊ธฐ์™€ ์—ญ์น˜๊ฐœ๋…์„ ๊ฐ€์ง€๋Š” ์‹œ๊ทธ๋ชจ์ด๋“œ ์‚ฌ์šฉ)

img

  • ์ถœ๋ ฅ์ธต : ์ตœ์ข… ๊ฒฐ๊ณผ์˜ ํ˜•ํƒœ๋ฅผ ๊ฒฐ์ •
    (๋‚ด๊ฐ€ ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ํ˜•ํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ž‘์„ฑ, units/activation)
# ์†์‹คํ•จ์ˆ˜๋กœ cross entropy ์‚ฌ์šฉ
# ์ด์ง„๋ถ„๋ฅ˜์ด๊ธฐ ๋•Œ๋ฌธ์— binary_crossentropy
from scipy import optimize
model.compile(
ย  ย  loss='binary_crossentropy',
ย  ย  optimizer='SGD',
ย  ย  metrics=['accuracy']
)

9์›” 19์ผ

ex02. ์†๊ธ€์”จ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜.ipynb

์ถœ๋ ฅ ํ˜•ํƒœ์— ๋”ฐ๋ฅธ unit์˜ ๊ฐฏ์ˆ˜

  • ํšŒ๊ท€ : units =1
  • ์ด์ง„๋ถ„๋ฅ˜ : units = 1
  • ๋‹ค์ค‘๋ถ„๋ฅ˜ : units = ํด๋ž˜์Šค์˜ ๊ฐœ์ˆ˜

์ถœ๋ ฅ ํ˜•ํƒœ์— ๋”ฐ๋ฅธ ํ™œ์„ฑํ™”ํ•จ์ˆ˜์˜ ์ข…๋ฅ˜

  • ํšŒ๊ท€ : activation='linear' (ํ•ญ๋“ฑํ•จ์ˆ˜, y=x ์„ ํ˜• ๋ชจ๋ธ์ด ์˜ˆ์ธกํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ) ๊ธฐ๋ณธ๊ฐ’, ์ ์–ด์ฃผ์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ๋‹ค
  • ์ด์ง„๋ถ„๋ฅ˜ : activation='sigmoid' (0~1 ์‚ฌ์ด์˜ ํ™•๋ฅ ๊ฐ’์„ ์ถœ๋ ฅ)
  • ๋‹ค์ค‘๋ถ„๋ฅ˜ : activation='softmax' (ํด๋ž˜์Šค์˜ ๊ฐœ์ˆ˜๋งŒํผ ํ™•๋ฅ ๊ฐ’์„ ์ถœ๋ ฅ => ๊ฐ๊ฐ์˜ ํ™•๋ฅ ๊ฐ’์˜ ์ดํ•ฉ์ด 1์ด ๋˜๋„๋ก ์ถœ๋ ฅ)
์ถœ๋ ฅ ํ˜•ํƒœํ™œ์„ฑํ™” ํ•จ์ˆ˜์†์‹ค ํ•จ์ˆ˜์„ค๋ช…
ํšŒ๊ท€LinearMean Squared Error (MSE)ํ•ญ๋“ฑํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ํšŒ๊ท€ ๋ชจ๋ธ์— ์ฃผ๋กœ ์‚ฌ์šฉ
์ด์ง„ ๋ถ„๋ฅ˜SigmoidBinary Cross-Entropy (BCE)0๊ณผ 1 ์‚ฌ์ด์˜ ํ™•๋ฅ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ์ด์ง„ ๋ถ„๋ฅ˜ ๋ชจ๋ธ์— ์‚ฌ์šฉ
๋‹ค์ค‘ ๋ถ„๋ฅ˜SoftmaxCategorical Cross-Entropy๋‹ค์ค‘ ํด๋ž˜์Šค ๋ถ„๋ฅ˜ ๋ชจ๋ธ์—์„œ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์‚ฌ์šฉ

9์›” 20์ผ

ex02. ์†๊ธ€์”จ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜.ipynb

๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ(Y) ํ•™์Šต

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'])

PIL

  • ํŒŒ์ด์ฌ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
# ํŒŒ์ด์ฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
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)์ถœ๋ ฅ์ธต์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ ์ž…๋ ฅ์ธต๊นŒ์ง€ ์ „ํŒŒํ•˜์—ฌ ๊ฐ€์ค‘์น˜๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ณผ์ •๋ชจ๋ธ์„ ํ•™์Šตํ•˜์—ฌ ์ตœ์ ์˜ ๊ฒฐ๊ณผ ๋„์ถœ

sigmoid, relu

ํ•จ์ˆ˜ํŠน์ง•
Step Function- ๋ฏธ๋ถ„ ๋ถˆ๊ฐ€๋Šฅ (๊ธฐ์šธ๊ธฐ๊ฐ€ ์—†์Œ)
- ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•์— ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ
- ์ž…๋ ฅ๊ฐ’์— ๋”ฐ๋ผ 0 ๋˜๋Š” 1์„ ์ถœ๋ ฅ (์ด์ง„ ๋ถ„๋ฅ˜์— ์ ํ•ฉ)
Sigmoid Function- ๋งค๋„๋Ÿฌ์šด ๊ณก์„  ํ˜•ํƒœ
- ๋ฏธ๋ถ„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ธฐ์šธ๊ธฐ ์†Œ์‹ค ๋ฌธ์ œ ๋ฐœ์ƒ
- ์ž…๋ ฅ๊ฐ’์ด ํฌ๊ฑฐ๋‚˜ ์ž‘์„ ๋•Œ ๊ธฐ์šธ๊ธฐ๊ฐ€ 0์— ๊ฐ€๊น๊ฒŒ ์ˆ˜๋ ดํ•˜์—ฌ ํ•™์Šต์ด ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Œ
- ํ™•๋ฅ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋จ
ReLU (Rectified Linear Unit)- ๋ฏธ๋ถ„ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๊ธฐ์šธ๊ธฐ ์†Œ์‹ค ๋ฌธ์ œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
- ์ž…๋ ฅ๊ฐ’์ด ์–‘์ˆ˜์ธ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ 0์œผ๋กœ ์ถœ๋ ฅ
- ํ•™์Šต์ด ๋น ๋ฅด๊ณ  ํšจ๊ณผ์ ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฃผ๋กœ ์€๋‹‰์ธต์˜ ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ๋จ
Sigmoid
  • 'step function'์€ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•จ(๊ธฐ์šธ๊ธฐ ์—†๊ธฐ ๋•Œ๋ฌธ)
  • ๊ทธ๋Ÿฌ๋‚˜ ๋ฏธ๋ถ„ํ•  ๋•Œ ๊ธฐ์šธ๊ธฐ ์†Œ์‹ค ๋ฌธ์ œ ๋ฐœ์ƒ
  • ํ•œ ๋ฒˆ ์ธต์„ ์˜ฎ๊ธธ ๋•Œ๋งˆ๋‹ค 1/4(0.25)๋กœ ๊ธฐ์šธ๊ธฐ๊ฐ€ ์ค„์–ด๋“ ๋‹ค.

image

image

Relu
  • ๊ธฐ์šธ๊ธฐ ์†Œ์‹ค ๋ฌธ์ œ ํ•ด๊ฒฐ
// ์†๊ธ€์”จ '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'))

9์›” 22์ผ

ex03. ํ™œ์„ฑํ™”ํ•จ์ˆ˜, ์ตœ์ ํ™”ํ•จ์ˆ˜, callbackํ•จ์ˆ˜.ipynb

์ตœ์ ํ™” ํ•จ์ˆ˜(optimizer)

img (1)

  1. ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•

    • ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ์—…๋ฐ์ดํŠธ
  2. ํ™•๋ฅ ์ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ• (Stochastic Gradient Descent

    • ํ™•๋ฅ ์ ์œผ๋กœ ์„ ํƒ๋œ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ์—…๋ฐ์ดํŠธ
    • ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•๋ณด๋‹ค ๋” ๋นจ๋ฆฌ, ๋” ์ž์ฃผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
  3. ๋ชจ๋ฉ˜ํ…€

    • ๊ด€์„ฑ์„ ์ ์šฉํ•ด ์—…๋ฐ์ดํŠธ ํ˜„์žฌ batch ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด์ „ batch ๋ฐ์ดํ„ฐ์˜ ํ•™์Šต ๊ฒฐ๊ณผ๋„ ๋ฐ˜์˜
    • ฮฑ : learning rate, m : ๋ชจ๋ฉ˜ํ…€ ๊ณ„์ˆ˜
  4. ๋„ค์Šคํ…Œ๋กœํ”„ ๋ชจ๋ฉ˜ํ…€ (NAG)

    • ๋ฏธ๋ฆฌ ํ•ด๋‹น ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๊ธฐ์šธ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ด๋ณธ ๋’ค ์‹ค์ œ ์—…๋ฐ์ดํŠธ ๋ฐ˜์˜
  5. adam

    • ์š”์ฆ˜ ๊ฐ€์žฅ ๊ฐ๊ด‘๋ฐ›๋Š” ์ตœ์ ํ™” ํ•จ์ˆ˜
์กฐํ•ฉํŠน์ง•
sigmoid + SGD- ์•„์ฃผ ๋‚ฎ์€ ์ •ํ™•๋„๋ฅผ ๋ณด์ž„. <br> - Sigmoid ํ•จ์ˆ˜๋Š” ๊ทธ๋ž˜๋””์–ธํŠธ ์†Œ์‹ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด, ๋”ฅ ๋‰ด๋Ÿด ๋„คํŠธ์›Œํฌ์—์„œ๋Š” ์ž˜ ํ™œ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. <br> - SGD๋Š” ํ•™์Šต ์†๋„๊ฐ€ ๋Š๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
relu + SGD- ์ค‘๊ฐ„ ์ •๋„์˜ ์ •ํ™•๋„๋ฅผ ๋ณด์ž„. <br> - ReLU๋Š” ๊ทธ๋ž˜๋””์–ธํŠธ ์†Œ์‹ค ๋ฌธ์ œ์— ๋œ ๋ฏผ๊ฐํ•˜์ง€๋งŒ, SGD๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ์ „ํžˆ ํ•™์Šต ์†๋„๊ฐ€ ๋Š๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
relu + Adam- ๊ฐ€์žฅ ๋†’์€ ์ •ํ™•๋„๋ฅผ ๋ณด์ž„. <br> - ReLU์™€ Adam ์กฐํ•ฉ์€ ๊ทธ๋ž˜๋””์–ธํŠธ ์†Œ์‹ค ๋ฌธ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋ฐฉ์ง€ํ•˜๊ณ , Adam ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•™์Šต๋ฅ  ์กฐ์ ˆ๋กœ ๋น ๋ฅธ ํ•™์Šต์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

image

Batch_size
  • ์ผ๋ฐ˜์ ์œผ๋กœ PC ๋ฉ”๋ชจ๋ฆฌ์˜ ํ•œ๊ณ„ ๋ฐ ์†๋„ ์ €ํ•˜ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š” ํ•œ๋ฒˆ์˜ epoch์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ง‘์–ด๋„ฃ๊ธฐ๊ฐ€ ํž˜๋“ฆ
  • epochs ๋‹น ํ•™์Šต : train_data_size/batch_size
  • batch size 32 : 1500/1500 => batch size 128 : 375/375

image

callback ํ•จ์ˆ˜
  • ๋ชจ๋ธ์ €์žฅ ๋ฐ ์กฐ๊ธฐํ•™์Šต์ค‘๋‹จ
  • ๋ชจ๋ธ์ €์žฅ
    • ๋”ฅ๋Ÿฌ๋‹๋ชจ๋ธ ํ•™์Šต์‹œ ์ง€์ •๋œ epoch ๋ฅผ ๋‹ค ๋๋‚ด๋ฉด ๊ณผ๋Œ€์ ํ•ฉ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค -> ์ค‘๊ฐ„์— ์ผ๋ฐ˜ํ™”๋œ ๋ชจ๋ธ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ!!
  • ์กฐ๊ธฐํ•™์Šต ์ค‘๋‹จ
    • epoch ๋ฅผ ํฌ๊ฒŒ ์„ค์ •ํ•  ๊ฒฝ์šฐ ์ผ์ •ํšŸ์ˆ˜ ์ด์ƒ์œผ๋กœ๋Š” ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. -> ์‹œ๊ฐ„๋‚ญ๋น„ -> ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ์กฐ๊ธฐ์ค‘๋‹จ์ด ํ•„์š”
  1. ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ž„ํฌํŠธ
    from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping

  2. hdf5 ํŒŒ์ผ(๋ชจ๋ธ ๋กœ๊ทธ) ๊ฒฝ๋กœ ์ž‘์„ฑ

model_path = '/content/drive/MyDrive/Colab Notebooks/DeepLearning(Spring)/data/digit_model/dm_{epoch:02d}_{val_accuracy:0.2f}.hdf5'
  1. ModelCheckpoint
ModelCheckpoint(
    filepath = model_path,
    verbose = 1, 
    save_best_only = True,
    monitor = 'val_accuracy'
)
  1. 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' # ์ตœ๊ณ ์ ์˜ ๊ธฐ์ค€์น˜
)
  1. ํ•™์Šต (callbacks = [mckp, early] ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”๊ฐ€)
h4 = model3.fit(
    X_train,
    y_train,
    validation_split=0.2,
    epochs = 1000,
    batch_size=128,
    callbacks = [mckp, early]
)
  1. ํŒŒ์ผ๋กœ ์ €์žฅ๋œ ๋ชจ๋ธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
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')

9์›” 25์ผ

image

dogs_vs_cats_small
ex04. ๊ฐœ ๊ณ ์–‘์ด ๋ถ„๋ฅ˜ํ•˜๊ธฐ.ipynb

CNN(Convolution Neural Network)

image

  1. ์ด๋ฏธ์ง€ ํ•™์Šต ๊ฐ€๋Šฅ (2์ฐจ์›์˜ ๋ฐ์ดํ„ฐ๋„ ํ•™์Šต)
  2. ๋ฐ์ดํ„ฐ์˜ ํŠน์ง•์„ ์ถ”์ถœํ•˜๊ณ  ์ถ”์ถœ๋œ ํŠน์ง•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•™์Šต
    • ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ, ๋ฐฉํ–ฅ ๋“ฑ์— ํฌ๊ฒŒ ๊ด€์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค
  3. CNN ์ธต์€ CONV LAYER, POOLING LAYER ์žˆ๋‹ค.
Layer Function
CONV ํŠน์ง•์„ ์ฐพ๋Š”๋‹ค.
POOLING ํŠน์ง•์ด ์•„๋‹Œ ๋ถ€๋ถ„์„ ์ฐพ์•„ ํ•ด์ƒ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค.
DENSE ์ฐพ์•„์ง„ ํŠน์ง•์„ ํ† ๋Œ€๋กœ ์‚ฌ๋ฌผ์„ ๊ตฌ๋ถ„ํ•  ๊ทœ์น™์„ ๋งŒ๋“ ๋‹ค.

cat vs dog ์‹ค์Šต

a. ImageDataGenerator

  • ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ฆ๊ฐ•ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณต
  • ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€ํ’€๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
# ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜์— ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ „๋ถ€๋‹ค ํ•ฉ์น˜๊ธฐ
from tensorflow.keras.preprocessing.image import ImageDataGenerator
  1. ํ”ฝ์…€๊ฐ’ ์ •๊ทœํ™” (0255 โ†’ 01)
generator = ImageDataGenerator(rescale= 1./255)
  1. ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜์— ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ „๋ถ€ ๋‹ด๊ธฐ
    • 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 ๋ชจ๋ธ ์„ค๊ณ„

  1. filter = 32 : ์ฐพ์„ ํŠน์ง•์˜ ๊ฐฏ์ˆ˜
  2. kernel_size = (3,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. ๋ถ„๋ฅ˜๋ถ„์„ & ์ถœ๋ ฅ

  1. model1.add(Flatten()) : ํŠน์ง•์ถ”์ถœ๋ถ€์™€ ๋ถ„๋ฅ˜๋ถ€๋ฅผ ์ด์–ด์ฃผ๋Š” ์—ญํ• 
  2. model1.add(Dense(units = 32, activation = 'relu')) : Dense์ธต ์ถ”๊ฐ€
  3. 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)

  1. train_generator : ํ•™์Šต๋ฐ์ดํ„ฐ (X_train, y_train ํ•ฉ์ณ์ ธ ์žˆ๋‹ค)
  2. valid_generator : ๊ฒ€์ฆ๋ฐ์ดํ„ฐ (X_val, y_val)
model1.fit(
    train_generator, 
    epochs = 20,
    validation_data = valid_generator
)

9์›” 27์ผ

image

ex04. ๊ฐœ ๊ณ ์–‘์ด ๋ถ„๋ฅ˜ํ•˜๊ธฐ.ipynb

a. image-kernels

  • filter๋ฅผ ๋ณด๋ฉด ์ถ•์†Œ์ƒ˜ํ”Œ๋ง ์œผ๋กœ์ธํ•ด ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ€ ์ฃฝ์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

image

b. ์ถ•์†Œ์ƒ˜ํ”Œ๋ง

  • ์ถ•์†Œ ์ƒ˜ํ”Œ๋ง์„ ์ง„ํ–‰ํ•  ๋•Œ : padding='valid'
  • ์ถ•์†Œ ์ƒ˜ํ”Œ๋ง์„ ์ง„ํ–‰ ์•ˆํ•  ๋•Œ : padding='same'
    • ์ด ๋•Œ ์›๋ณธ ์ด๋ฏธ์ง€์˜ ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ 0์œผ๋กœ ์ฑ„์›Œ๋„ฃ์–ด ์ž‘์•„์งˆ ๋งŒํผ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ํ‚ค์šด๋‹ค

10์›” 4์ผ

ex04. ๊ฐœ ๊ณ ์–‘์ด ๋ถ„๋ฅ˜ํ•˜๊ธฐ.ipynb

๊ณผ๋Œ€์ ํ•ฉ์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•๋“ค

  • ์ฆ์‹
    • ์žฅ์  : ๊ฐ„๋‹จ
    • ๋‹จ์  : ๊ฐ€์งœ๋Š” ๊ฐ€์งœ๋‹ค. (๊ธ‰๊ฒฉํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์€ ์—†๋‹ค)
    • epoch ์ˆ˜๋Š” ์ฆ๊ฐ€์‹œ์ผœ์ฃผ์–ด์•ผํ•œ๋‹ค.
  • dropout()
    • ์ธต์— ์‚ฌ์šฉํ•˜๋Š” ํผ์…‰ํŠธ๋ก ์˜ ์ˆ˜๋ฅผ ์„ค์ •ํ•œ ๋น„์œจ๋งŒํผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•
    • epoch๋งˆ๋‹ค ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํผ์…‰ํŠธ๋ก ์€ ๋žœ๋ค
  • BatchNormalization() : ์ •๊ทœํ™”
    • CNN์ธต = Conv (ํŠน์„ฑ์ถ”์ถœ) + Maxpooling (ํฌ๊ธฐ ์ถ•์†Œ)
    • Conv์ธต์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ •๊ทœํ™”(ํ‰๊ท  0, ๋ถ„์‚ฐ 1)
      => ์Œ์ˆ˜๊ฐ€ ๋ฐœ์ƒ
      => relu๋ฅผ ์ ์šฉํ•˜๋ฉด
      => ์Œ์ˆ˜๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ => leaky relu
  • GlobalAveragePooling2D()
    • CNN์—์„œ ๊ฐ€์žฅ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ธต : Maxpooling ์ธต
      => CNN ์†๋„์˜ 60% ์ด์ƒ์„ ์ฐจ์ง€ (๋Š๋ฆฌ๋‹ค)
    • Maxpooling2D+ Flatten()
    • Dense ์ธต๊ณผ ์—ฐ๊ฒฐ๋˜๋Š” ์ธต์— ์‚ฌ์šฉ

Dropout

from tensorflow.keras.layers import Dropout, BatchNormalization, GlobalAveragePooling2D
  • Dropout ์ธต์€ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜ ์ฐจ์ด๊ฐ€ ์ปค์„œ ๊ณผ์ ํ•ฉ์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šด ์ธต๊ณผ ์ธต ์‚ฌ์ด์— ์ง‘์–ด๋„ฃ๋Š”๋‹ค.
# ๋ชจ๋ธ์˜ ์ธต, ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜ ํ™•์ธ
model1.summary()
# Dropout ์ธต ์ถ”๊ฐ€
model1.add(Dropout(0.5))

# ๋“œ๋กญ์•„์›ƒ ์ธต์„ ๋„ฃ๊ณ  ๋ชจ๋ธ์„ ํ•™์Šตํ•˜๋ฉด ๊ณผ์ ํ•ฉ์ด ์‚ด์ง ์ค„์–ด๋“  ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

GlobalAveragePooling

  • ์ธต์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ํ™• ์ค„์–ด๋“œ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜์žˆ๋‹ค.
# GlobalAveragePooling ์ธต ์ถ”๊ฐ€
model1.add(GlobalAveragePooling2D())

# ์ด ์ธต์œผ๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•˜๋ฉด ์ •ํ™•๋„๋Š” ๋งค์šฐ ๋–จ์–ด์ง€์ง€๋งŒ, ๊ณผ์ ํ•ฉ์ด ์ƒ๋‹นํžˆ ๊ฐœ์„ ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

BatchNormalization

  • Conv2D()์™€ Activation() ์ธต ์‚ฌ์ด์— ๋ฐฐ์น˜
  • Activation()์ด ์ •๊ทœํ™” ๊ธฐ๋Šฅ์„ ์ผ๋ถ€ ์ˆ˜ํ–‰ => Activation() ๋‹ค์Œ์— ๋ฐฐ์น˜ํ•˜๋ฉด ํšจ๊ณผ๊ฐ€ ๋–จ์–ด์ง
  • ์›์น™ : C + B + A + M => ๊ทผ๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ : C + A + B + M
  • ์„ฑ๋Šฅ์ด ํ™•์‹คํ•˜๊ฒŒ ํ–ฅ์ƒ๋˜๋Š” ๊ฒŒ ์žฅ์ ์ด๋‹ค.
  • ๋‹จ์  : ์™œ ์ข‹์•„์ง€๋Š”์ง€ ์•Œ ๊ธธ์ด ์—†๋‹ค.

์ „์ดํ•™์Šต

image

  • ์ „์ดํ•™์Šต ํ•˜๋Š” ์ด์œ 

    • ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ€์กฑ
    • ์„ค๊ณ„ํ•œ ์‹ ๊ฒฝ๋ง์ด ๊ทธ๋‹ฅ ์ข‹์ง€ ๋ชปํ•˜๋‹ค
  • ์ „์ดํ•™์Šต์˜ ์ข…๋ฅ˜

    • ํŠน์„ฑ ์ถ”์ถœ : CNN์ธต์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ
    • ๋ฏธ์„ธ ์กฐ์ • (fine tuning) : CNN์ธต์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์ผ๋ถ€ ์‚ด์ง ๋ณ€๊ฒฝํ•ด์„œ ์‚ฌ์šฉ

image

10์›” 6์ผ

์ „์ดํ•™์Šต-2

ex04. ๊ฐœ ๊ณ ์–‘์ด ๋ถ„๋ฅ˜ํ•˜๊ธฐ.ipynb

VGG ๋‹ค์šด๋กœ๋“œ
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)
)
๋ชจ๋ธ์„ ์‹œ๊ฐํ™”ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•
  1. summary
๋ชจ๋ธ.summary()
  1. plot_model
    • summary ๋ฐฉ์‹๋ณด๋‹ค ์ข€ ๋” ์ง๊ด€์ ์ž„
plot_model(๋ชจ๋ธ, show_shapes= True, dpi=60)
  1. visual keras
  • visual keras ๋‹ค์šด๋กœ๋“œ
!pip install visualkeras
  • ๊ตฌ๋กœ๋ฅผ ์ด๋ฏธ์ง€๋กœ ์‹œ๊ฐํ™”
import visualkeras

visualkeras.layered_view(๋ชจ๋ธ).show()
visualkeras.layered_view(๋ชจ๋ธ, legend=True)

image

์ด๋ฟŒ๋‹น..

๋ชจ๋ธ ์ด์–ด๋ถ™์ด๊ธฐ
  • ๊ธฐ๋ณธ ๋ชจ๋ธ์„ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ ธ์žˆ๋Š” 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
๋ฏธ์„ธ์กฐ์ •(fine tuning)
  • ๋ถ„๋ฅ˜๊ธฐ๊ฐ€ ์—ฐ๊ฒฐ๋˜๋Š” ๋ชจ๋ธ์˜ ์ธต๋งŒ ํ•™์Šต์ด ๋˜๋„๋ก ๋™๊ฒฐ์„ ํ’€์–ด์ฃผ๋Š” ๊ฒƒ
์ธต 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 ๋ชจ๋ธ

image

  • ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์„œ Xception ๋ชจ๋ธ์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค
from tensorflow.keras.applications import Xception

conv_base2 = Xception(
    weights ="imagenet",
    include_top =False,
    input_shape = (150, 150,3)
)
  • ์‹œ๊ฐํ™” ํ•ด๋ณด๋ฉด ๊ต‰์žฅํžˆ ๊ธธ๊ณ  ๋ณต์žกํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค
  • BatchNormalization ์ธต์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ.

image

  • ํ•™์Šต ๊ฒฐ๊ณผ : 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

yolov7

image

10์›” 10์ผ

ํ”„๋กœ์ ํŠธ005_YoloV7๊ธฐ๋ฐ˜_Custom๋ฐ์ดํ„ฐ๋กœ_๊ฐ์ฒดํƒ์ง€.ipynb

  • ์ด ํ”„๋กœ์ ํŠธ์— ์žˆ๋Š” ํŠœํ† ๋ฆฌ์–ผ ๋˜‘๊ฐ™์ด ๋”ฐ๋ผํ•˜๋ฉด ๋œ๋‹ค.

  • Yolov5s, Yolov5m, YOlov5l, Yolov5x ์žˆ์„ ๋•Œ ํ˜„์žฌ ์ปดํ“จํ„ฐ๋ก  l,x๋Š” ๋ชป์“ด๋‹ค.

  • ๋กœ๋ณดํ”Œ๋กœ์šฐ ํ”„๋กœ์ ํŠธ

    • ์–ด๋…ธํ…Œ์ด์…˜ ์ž‘์—…์„ ์œ„ํ•ด ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ์‚ฌ์ดํŠธ

About

DeepLearningLecture

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published