73. NIPA AI์จ๋ผ์ธ ๊ต์ก AI ์ค๋ฌด ์์ฉ ๊ณผ์ (4) ๋ฅ๋ฌ๋
AI ์ค๋ฌด ์์ฉ ๊ณผ์
[์์ฉ๊ต์ก๊ณผ์ ] ๋ฅ๋ฌ๋ ์์ํ๊ธฐ (4) ๋ฅ๋ฌ๋
๋ฅ๋ฌ๋๊ฐ๋ก
์ธ๊ณต์ง๋ฅ > ๋จธ์ ๋ฌ๋ > ๋ฅ๋ฌ๋
๋ฅ๋ฌ๋์ด๋?
๋จธ์ ๋ฌ๋์ ์ฌ๋ฌ ๋ฐฉ๋ฒ๋ก ์ค ํ๋๋ก์จ ์ธ๊ณต์ ๊ฒฝ๋ง์ ๊ธฐ๋ฐํ์ฌ ์ปดํจํฐ์๊ฒ ์ฌ๋์ ์ฌ๊ณ ๋ฐฉ์์ ๊ฐ๋ฅด์น๋ ๋ฐฉ๋ฒ
์ธ๊ณต์ ๊ฒฝ๋ง์ด๋?
์๋ฌผํ์ ์ ๊ฒฝ๋ง์์ ์๊ฐ์ ์ป์ ํ์ต ์๊ณ ๋ฆฌ์ฆ. ์ฌ๋์ ์ ๊ฒฝ ์์คํ ์ ๋ชจ๋ฐฉํจ
์ ๊ฒฝ ์์คํ ?
๋๋์ ๊ฐ์ฅ ์์ ์ ๋ณด์ฒ๋ฆฌ ๋จ์
์ ๊ฒฝ์ธํฌ๋ค์ด ๋ค๋ฐ๋ค์ ํตํด ์ฐ๊ฒฐ๋์ด ์๋ ๊ตฌ์กฐ
์๊ทน์ด ๋ค์ด์ค๋ฉด ์ ๊ฒฝ์ธํฌ๋ฅผ ํตํด ๋ค์ ์ ๊ฒฝ์ธํฌ๋ก ์ ๋ฌ๋๊ณ , ๋ด๋ถ์ ์ฌ๋ฌ๊ฐ์ง ์ฒ๋ฆฌ ๊ณผ์ ์ด ์กด์ฌํ๋ค.
์ฌ๋์ ์ ๊ฒฝ ์์คํ
๋ฅ๋ฌ๋ ์ญ์ฌ
First AI winter : ์ฒซ๋ฒ์งธ ๋ฅ๋ฌ๋ ๋นํ๊ธฐ
1986๋ ๋ : ๊ธฐ๋ณธ์ ์ธ ์ด๋ก ๋ค ๋ฑ์ฅ
Second AI winter : ๋๋ฒ์งธ ๋ฅ๋ฌ๋ ๋นํ๊ธฐ
2012๋ ๋ : ์ด๋ฏธ์ง๋ท (GPU๋ฅผ ์ฌ์ฉํ ๋ฅ๋ฌ๋ AlexNet์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๊ตฌ๋ถ์ ์ ํ๋๋ฅผ ๋์ด์ฌ๋ฆผ)
ํ๋์ ๋ค์ํ ๋ฅ๋ฌ๋ ๊ธฐ์ ์ ์ฉ ์ฌ๋ก
1. ์ผ๊ตด ์ธ์ ์นด๋ฉ๋ผ
2. ๊ธฐ๊ณ ๋ฒ์ญ ๋ชจ๋ธ
3. ์ํ๊ณ ์ ๋ก (๋ฅ๋ฌ๋X ๊ฐํํ์ต๋ชจ๋ธ+๋ฅ๋ฌ๋O)
ํผ์ ํธ๋ก (Perceptron)
์ ๊ฒฝ๋ง ์ด์ ์ ์ฐ๊ตฌ
์ผ๊ตด ์ธ์ : ๋ค๋ชจ ๋ฐ์ค ์์ ์ด๋ชฉ๊ตฌ๋น๋ฅผ ๊ตฌ๋ณ
์ซ์ ๋ฐ ๋ฌธ์ : ๋ช ๊ฐ์ง ํจํด์ ํตํด ๊ตฌ๋ณ
-> ์ฌ๋์ด ์ง์ ํจํด์ ํ์ ํ ๋ค ์์ธก
1958๋ ๋ ์ด๊ธฐ ์ ๊ฒฝ๋ง ํผ์ ํธ๋ก ๋ฑ์ฅ
N๊ฐ์ ์ ํธ๋ฅผ ๋ฐ๋ ๋๊ธฐ > ํ๋๋ก ํฉ์ณ์ง๊ณ > ์ ๋ฌ๋๊ณ > N๊ฐ์ ๋ค๋ฅธ ์ ํธ๋ค๋ก ์ ๋ฌ๋๋ ํํ (=์ธํ x, ์์ํ y)
ํผ์ ํธ๋ก ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
๊ฐ์ค์น : ๋ค์ด์ค๋ ๊ฐ์ ์ผ๋ง๋ ์ฆํญํ๊ณ ๊ฐํญํด์ค์ง ํ๋จ
bias : ์ ๋ ฅํ๋ ๊ฐ์ ์๊ด์์ด ๋ค์ด์ค๋ ๊ฐ
∑ (summation) : '๋ชจ๋ ๋ํด๋ผ'
ํ์ฑํํจ์ Activation function
ํ์ฑํํจ์
๋ค์ด์ค๋ x๊ฐ์ด 0๋ณด๋ค ํฌ๋ฉด 1๋ก ๋งคํ, 0๋ณด๋ค ์์ผ๋ฉด 0์ผ๋ก ๋งคํ
ํผ์ ํธ๋ก ๋์ ์
[์ถ๊ฐ ์์] 1, -2, -0.5๊ฐ ๋ค์ด์๋ค๋ฉด? y = -0.5 + 2 * 1 + 1 * (-1) = activation 0.5 = 0
์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ ๋์ถ๊ฐ์ด ๋ค๋ฅผ ์ ์๋ค.
ํผ์ ํธ๋ก ๋์ ์2
X1 ์ ์ ๋๋ผ๋ง ์ / X2 ์ฌ๊ฐ์๊ฐ / Y ํ์ต ์ฌ๋ถ
w0 ํ์ต ์์ง / w1 ์ ์ ๋๋ผ๋ง์ ๋ฐ๋ ์ํฅ / w2 ์ฌ๊ฐ ์๊ฐ์ ๋ฐ๋ฅธ ํ์ตํ๊ณ ์ถ์ ์ ๋
-> ์ ๋ ฅ๊ฐ(w)์ ๋ฐ๋ผ ์์ธก๊ฐ์ด ๋ฐ๋๋ค.
์ : ๊ฐ๊ฐ์ ๋ฐ์ดํฐ
๋ณด๋ผ์ ์ : ํ์ต์ ํ์ง ์์ ๊ฒฝ์ฐ
์ด๋ก์ ์ : ํ์ต์ ํ ๊ฒฝ์ฐ
* ์ง์ ์ ์ผ๋ง๋ ์ ๊ตฌํ๋๋๊ฐ ํผ์ ํธ๋ก ์ ์ผ๋งํผ ์ ๊ตฌํํ๋์ง์ ๋ํ ์ฒ๋๋ค.
ํผ์ ํธ๋ก ์ ์ด์ฉํ ์ ํ๋ถ๋ฅ๊ธฐ
ํผ์ ํธ๋ก ์ ์ ํ ๋ถ๋ฅ๊ธฐ๋ก์จ ๋ฐ์ดํฐ ๋ถ๋ฅ๊ฐ ๊ฐ๋ฅํ๋ค (์ ์ ํตํด ๋ถ๋ฅ)
๋ฌธ์ ์
ํ๋์ ์ ์ผ๋ก ๋ถ๋ฅํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฑ์ฅ = ํผ์ ํธ๋ก ์ผ๋ก ์๋ฒฝํ ๋ถ๋ฅ ๋ถ๊ฐ๋ฅ
[์ฐ์ต๋ฌธ์ 1] ํผ์ ํธ๋ก ์๋ ์์ ๊ตฌํํ๊ธฐ
perceptron์ ์์ธก ๊ฒฐ๊ณผ๊ฐ ํ์ตํ๋ค:1 ์ด ๋์ค๋๋ก x1x_{1}, x2x_{2}์ ์ ์ ํ ๊ฐ์ ์ ๋ ฅํ์ธ์. ํ์ฑํ ํจ์๋ ‘์ ํธ์ ์ดํฉ์ด 0 ์ด์์ด๋ฉด ํ์ตํ๊ณ , 0 ๋ฏธ๋ง์ด๋ผ๋ฉด ํ์ตํ์ง ์๋๋ค‘๋ ๊ท์น์ ๊ฐ์ง๋๋ค.
#ํ์ต ์ฌ๋ถ๋ฅผ ์์ธกํ๋ ํผ์
ํธ๋ก ํจ์
def Perceptron(x_1,x_2):
#์ค์ ํ ๊ฐ์ค์น๊ฐ์ ์ ์ฉ
w_0 = -5
w_1 = -1
w_2 = 5
#ํ์ฑํ ํจ์์ ๋ค์ด๊ฐ ๊ฐ์ ๊ณ์ฐ
output = w_0+w_1*x_1+w_2*x_2
#ํ์ฑํ ํจ์ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ฐ
if output < 0:
y = 0
else:
y = 1
return y, output
#1. perceptron์ ์์ธก ๊ฒฐ๊ณผ๊ฐ ํ์ตํ๋ค:1 ์ด ๋์ค๋๋ก x_1, x_2์ ์ ์ ํ ๊ฐ์ ์
๋ ฅํ์ธ์.
x_1 = 0
x_2 = 2
result, go_out = Perceptron(x_1,x_2)
print("์ ํธ์ ์ดํฉ : %d" % go_out)
if go_out > 0:
print("ํ์ต ์ฌ๋ถ : %d\n ==> ํ์ตํ๋ค!" % result)
else:
print("ํ์ต ์ฌ๋ถ : %d\n ==> ํ์ตํ์ง ์๋๋ค!" % result)
์ ํธ์ ์ดํฉ : 5
ํ์ต ์ฌ๋ถ : 1
==> ํ์ตํ๋ค!
[์ฐ์ต๋ฌธ์ 2] DIY ํผ์ ํธ๋ก ๋ง๋ค๊ธฐ
1. ์ ํธ์ ์ดํฉ output์ ์ ์ํ๊ณ , output์ด 0 ์ด์์ด๋ฉด 1์, ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ธ y๋ฅผ ๋ฐํํ๋ ํ์ฑํ ํจ์๋ฅผ ์์ฑํด perceptron ํจ์๋ฅผ ์์ฑํฉ๋๋ค.
'''
1. ์ ํธ์ ์ดํฉ๊ณผ ๊ทธ์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ 0 ๋๋ 1์ ๋ฐํํ๋ ํจ์ perceptron์ ์์ฑํฉ๋๋ค.
Step01. ์
๋ ฅ ๋ฐ์ ๊ฐ์ ์ด์ฉํ์ฌ ์ ํธ์ ์ดํฉ์ ๊ตฌํฉ๋๋ค.
Step02. ์ ํธ์ ์ดํฉ์ด 0 ์ด์์ด๋ฉด 1์, ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ ๋ฐํํ๋ ํ์ฑํ ํจ์๋ฅผ ์์ฑํฉ๋๋ค.
'''
def perceptron(w, x):
output = w[0] + w[1]*x[0] + w[2]*x[1] + w[3]*x[2] + w[4]*x[3]
y = 1
return y, output
#x_1, x_2, x_3, x_4์ ๊ฐ์ ์์๋๋ก list ํํ๋ก ์ ์ฅ
x = [1,2,3,4]
#w_0, w_1, w_2, w_3, w_4์ ๊ฐ์ ์์๋๋ก list ํํ๋ก ์ ์ฅ
w = [2, -1, 1, 3, -2]
#ํผ์
ํธ๋ก ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ
y, output = perceptron(w,x)
print('output: ', output)
print('y: ', y)
[์ฐ์ต๋ฌธ์ 3] ํผ์ ํธ๋ก ์ ์๋ง์ ๊ฐ์ค์น ์ฐพ๊ธฐ
๋จ์ธต ํผ์ ํธ๋ก ์ ์ง์ ๊ตฌํํด๋ณด๋ฉฐ ์ ์ ํ ๊ฐ์ค์น(Weight)์ Bias ๊ฐ์ ์ฐพ์๋ด ์๋ค.
1. perceptron ํจ์์ ์ ๋ ฅ์ผ๋ก ๋ค์ด๊ฐ ๊ฐ์ค์น ๊ฐ์ ์ ๋ ฅํด์ฃผ์ธ์.
w ๋ฆฌ์คํธ ์์ ๊ฐ๋ค์ ์์๋๋ก w0,w1,w2w_0, w_1, w_2์ ํด๋น๋ฉ๋๋ค.
import numpy as np
def perceptron(w, x):
output = w[1] * x[0] + w[2] * x[1] + w[0]
if output >= 0:
y = 1
else:
y = 0
return y
#Input ๋ฐ์ดํฐ
X = [[0,0], [0,1], [1,0], [1,1]]
#1. perceptron ํจ์์ ์
๋ ฅ์ผ๋ก ๋ค์ด๊ฐ ๊ฐ์ค์น ๊ฐ์ ์
๋ ฅํด์ฃผ์ธ์. ์์๋๋ก w_0, w_1, w_2์ ํด๋น๋ฉ๋๋ค.
w = [-2, 1, 1]
#AND Gate๋ฅผ ๋ง์กฑํ๋์ง ์ถ๋ ฅํ์ฌ ํ์ธ
print('perceptron ์ถ๋ ฅ')
for x in X:
print('Input: ',x[0], x[1], ', Output: ',perceptron(w, x))
๋ค์ธต ํผ์ ํธ๋ก
๋จ์ธต ํผ์ ํธ๋ก | ๋ค์ธต ํผ์ ํธ๋ก (Multi Layer Perceptron) |
![]() |
![]() |
์
๋ ฅ์ธต๊ณผ ์ถ๋ ฅ์ธต๋ง ์กด์ฌ ํผ์ ํธ๋ก ์ด 1๊ฐ๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ |
๋จ์ธต ํผ์
ํธ๋ก ์ ์ฌ๋ฌ ๊ฐ ์์ ๊ฒ ๋จ์ธต ํผ์ ํธ๋ก ์ ๋ง์ด ์์์๋ก ์ฌ๋ฌ๊ฐ์ง ๊ฒฐ๊ณผ๊ฐ์ ์ป์ ์ ์๋ค. |
* ๋น ์ ํ์ ์ธ ๋ฌธ์ (=์ ํ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ์ง ๋ชปํ๋ ๋ฌธ์ ) ํด๊ฒฐ
ํ๋ ์ธต (Hidden Layer)
์ ๋ ฅ์ธต๊ณผ ์ถ๋ ฅ์ธต ์ฌ์ด์ ๋ชจ๋ Layer
ํ๋ ์ธต ๊ฐ์์ ๋ฅ๋ฌ๋
ํ๋ ์ธต์ด ๋ง์์ง๋ฉด ๊น์ ์ ๊ฒฝ๋ง์ด๋ผ๋ ์๋ฏธ์ Deep Learning๋จ์ด ์ฌ์ฉ
- ์ฅ์ : ๋ถ๋ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฆ๊ฐ (์ฑ๋ฅ์ด ์ข์์ง ์ ์์)
- ๋จ์ : ๊ฐ์ค์น ์กด์ฌ. (ํผ์ ํธ๋ก ํ๋์ ํ์ํ ๊ฐ์ค์น๋ n+1. ๋ค์ธต ํผ์ ํธ๋ก ์ ๊ตฌํด์ผํ๋ ๊ฐ์ค์น๊ฐ ๊ต์ฅํ ๋ง์์ง๋ค.)
ํ ์ํ๋ก์ฐ์ ์ ๊ฒฝ๋ง
๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๊ตฌ์ฑ์์
๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ํ์ต ๋ฐฉ๋ฒ
์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ ๊ฐ์ ์ค์ฐจ๊ฐ์ ์ต์ํํ๊ธฐ ์ํด ์ค์ฐจ๊ฐ์ ์ต์ํํ๋ ๋ชจ๋ธ์ ์ธ์๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉ.
Loss Function์ ์ต์ํํ๋ ๊ฐ์ค์น๋ฅผ ์ฐพ๊ธฐ ์ํด ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉ
๋ฅ๋ฌ๋ ๋ชจ๋ธ์์ ์์ธก๊ฐ ๊ตฌํ๋ ๋ฐฉ๋ฒ
์์ ํ (Forward propagation) : ์ ๋ ฅ ๊ฐ์ ๋ฐํ์ผ๋ก ๊ฐ๊น์ด ํผ์ ํธ๋ก ๋ถํฐ ์ ์ง์ ์ผ๋ก ์ถ๋ ฅ ๊ฐ์ ๊ณ์ฐํ๋ ๊ณผ์
์์ ํ ์์
activation function : ๋ค์ํ ์ข ๋ฅ์ ํ์ฑํ ํจ์๊ฐ ์กด์ฌํ๋ฉฐ, ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๋ฐ๋ผ ์ฐ์์ด ๋ค๋ฅด๋ค
์ต์ ํ ๋ฐฉ์
์์ ํ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ธก ๊ฐ๊ณผ ์ค์ ๊ฐ ๊ฐ์ ์ค์ฐจ๊ฐ์ ๊ตฌํ์ฌ Loss function์ ๊ตฌํ ์ ์์
๊ทธ๋ ๋ค๋ฉด ์ต์ ํ๋ฅผ ์ด๋ป๊ฒ ํด์ผํ ๊น? -> ๊ฒฝ์ฌํ๊ฐ๋ฒ(Gradient descent)์ ์ฌ์ฉ
๊ฒฝ์ฌ ํ๊ฐ๋ฒ
๊ฐ์ค์น๋ฅผ Loss function๊ฐ์ด ์์์ง๊ฒ ์ ๋ฐ์ดํธ ํ๋ ๋ฐฉ๋ฒ
๊ฐ์ค์น๋ Gradient๊ฐ์ ์ฌ์ฉํ์ฌ ์ ๋ฐ์ดํธ๋ฅผ ์ํ
Gradient๊ฐ์ ๊ฐ ๊ฐ์ค์น๋ง๋ค ์ ํด์ง๋ฉฐ, ์ญ์ ํ(Backpropogation)๋ฅผ ํตํ์ฌ ๊ตฌํ ์ ์์
์ญ์ ํ
๊ฐ์ค์น ์ ๋ฐ์ดํธ ๊ณผ์
์ ๊ณผ์ ์ ์ํํ์ฌ ๊ฐ์ค์น๋ค์ ์ ๋ฐ์ดํธํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ๋ฐ๋ณตํ์ฌ Loss function์ ์ ์ผ ์๊ฒ ๋ง๋๋ ๊ฐ์ค์น๋ฅผ ๊ตฌํจ
๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ํ์ต์์
1. ํ์ต์ฉ feature๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ์ฌ ์์ธก๊ฐ ๊ตฌํ๊ธฐ (์์ ํ)
2. ์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ ์ฌ์ด์ ์ค์ฐจ ๊ตฌํ๊ธฐ (Loss๊ตฌํ๊ธฐ)
3. Loss๋ฅผ ์ค์ผ ์ ์๋ ๊ฐ์ค์น ์ ๋ฐ์ดํธํ๊ธฐ (์ญ์ ํ)
4. 1~3๋ฒ์ ๋ฐ๋ณตํ๋ฉฐ Loss๋ฅผ ์ต์๋ก ํ๋ ๊ฐ์ค์น ์ป๊ธฐ
ํ ์ํ๋ก์ฐ๋ก ๋ฅ๋ฌ๋ ๊ตฌํํ๊ธฐ - ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
TensorFlow?
์ ์ฐํ๊ณ , ํจ์จ์ ์ด๋ฉฐ, ํ์ฅ์ฑ์๋ ๋ฅ๋ฌ๋ ํ๋ ์์ํฌ
๋ํ ํด๋ฌ์คํฐ ์ปดํจํฐ๋ถํฐ ์ค๋งํธํฐ๊น์ง ๋ค์ํ ๋๋ฐ์ด์ค์์ ๋์ ๊ฐ๋ฅ
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ํ๋ ์์ํฌ
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
Tensorflow ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ Tensorํํ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค.
Tensor : ๋ค์ฐจ์๋ฐฐ์ด๋ก์จ Tensorflow์์ ์ฌ์ฉํ๋ ๊ฐ์ฒด
๋ฐ์ดํฐ > Tensorํํ ๋ฐ์ดํฐ ๋ณํ > Tensorflow๋ฅ๋ฌ๋ ๋ชจ๋ธ
* ๋ค๋ฅธ ์ ์ : 1์ฐจ์ vector, 2์ฐจ์ matrix, 3์ฐจ์๋ถํฐ Tensor
Dataset API๋ฅผ ์ฌ์ฉํ์ฌ ๋ฅ๋ฌ๋๋ชจ๋ธ์ฉ Dataset ์์ฑ
#pandas๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
df = pd.read_csv('data.csv')
feature = df.drop(columns=['label'])
labe = df['label']
#tensorํํ๋ก ๋ฐ์ดํฐ ๋ณํ
dataset = tf.data.Dataset.from_tensor_slices((feature.values, label.values))
๋ฅ๋ฌ๋์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ ์ถ๊ฐ์ ์ธ ์ ์ฒ๋ฆฌ ์์ ์ด ํ์ -> Epoch, Batch
- Epoch : ํ ๋ฒ์ epoch๋ ์ ์ฒด ๋ฐ์ดํฐ ์ ์ ๋ํด ํ ๋ฒ ํ์ต์ ์๋ฃํ ์ํ
- Batch : ๋๋ ์ง ๋ฐ์ดํฐ ์ (๋ณดํต mini-batch๋ผ๊ณ ํํ)
iteration์ epoch๋ฅผ ๋๋์ด์ ์คํํ๋ ํ์๋ฅผ ์๋ฏธ
* ๋ฅ๋ฌ๋ ํ์ต๊ณผ์ ์์ ๋ฐ์ดํฐ ์๊ณผ ๋ชจ๋ธ์ด ์ปค์ง๋ฉด w๋ฅผ ๊ณ์ฐํ ๋ ๊ต์ฅํ ๋ง์ ์ฐ์ฐ๋์ด ํ์ํ๋ค. ๊ณ์ฐ๋์ ์ค์ด๊ธฐ ์ํด ์ ์ฒด(epoch)์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ๊ฒ ์๋๋ผ, ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ชผ๊ฐ์ ๋ฃ์ด๋ณด์!(=1batch, 2batch...) ํ๋ฅ ์ ์ผ๋ก ์ฑ๋ฅ์ด ๋จ์ด์ง ์๋ ์์ผ๋, ์ฒ๋ฆฌ ์๋๋ ํจ์ฌ ๋น ๋ฅด๋ค.
ex) ์ด ๋ฐ์ดํฐ๊ฐ 1000๊ฐ, Batch size = 100์ผ ๋
1iteration = 100๊ฐ ๋ฐ์ดํฐ์ ๋ํด์ ํ์ต
1epoch = 1000/Batch size = 10iteration
#tensorํํ๋ก ๋ฐ์ดํฐ ๋ณํ
dataset = tf.data.Dataset.from_tensor_slices((feature.values, label.values))
#dataset์ batch์ฌ์ด์ฆ๋ฅผ 32๋ก ์ค์
datset = dataset.batch(32)
[์ฐ์ต๋ฌธ์ 1] ํ ์ํ๋ก์ฐ๋ฅผ ํ์ฉํ์ฌ ์ ๊ฒฝ๋ง ๊ตฌํํ๊ธฐ - ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
ํ ์ํ๋ก์ฐ๋ฅผ ํ์ฉํ์ฌ ์ ๊ฒฝ๋ง์ ๊ตฌํํด๋ณด๋ ๊ณผ์ ์ ์ํํด๋ณด๊ฒ ์ต๋๋ค. ํ ์ํ๋ก์ฐ ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ํ์ต ๋ฐ์ดํฐ๋ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ tf.data.Dataset ํ์์ผ๋ก ๋ณํํ์ฌ ์ฌ์ฉํฉ๋๋ค. pandas์ DataFrame ํํ ๋ฐ์ดํฐ๋ฅผ Dataset์ผ๋ก ๋ณํํ๊ธฐ ์ํด์๋ from_tensor_slices() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ds์ ์ ์ฅํ ์ ์์ต๋๋ค.
1. pandas DataFrame df์์ Sales ๋ณ์๋ label ๋ฐ์ดํฐ๋ก Y์ ์ ์ฅํ๊ณ ๋๋จธ์ง X์ ์ ์ฅํฉ๋๋ค.
2. ํ์ต์ฉ ๋ฐ์ดํฐ train_X, train_Y๋ฅผ tf.data.Dataset ํํ๋ก ๋ณํํฉ๋๋ค.
- from_tensor_slices ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ณํํฉ๋๋ค.
import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
np.random.seed(100)
tf.random.set_seed(100)
#๋ฐ์ดํฐ๋ฅผ DataFrame ํํ๋ก ๋ถ๋ฌ ์ต๋๋ค.
df = pd.read_csv("data/Advertising.csv")
#DataFrame ๋ฐ์ดํฐ ์ํ 5๊ฐ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print('์๋ณธ ๋ฐ์ดํฐ ์ํ :')
print(df.head(),'\n')
#์๋ฏธ์๋ ๋ณ์๋ ์ญ์ ํฉ๋๋ค.
df = df.drop(columns=['Unnamed: 0'])
#1. Sales ๋ณ์๋ label ๋ฐ์ดํฐ๋ก Y์ ์ ์ฅํ๊ณ ๋๋จธ์ง X์ ์ ์ฅํฉ๋๋ค.
X = df.drop(columns=['Sales'])
Y = df['Sales']
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.3)
#2. ํ์ต์ฉ ๋ฐ์ดํฐ๋ฅผ tf.data.Dataset ํํ๋ก ๋ณํํฉ๋๋ค. from_tensor_slices ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ณํํ๊ณ batch๋ฅผ ์ํํ๊ฒ ํฉ๋๋ค.
train_ds = tf.data.Dataset.from_tensor_slices((train_X.values, train_Y.values))
train_ds = train_ds.shuffle(len(train_X)).batch(batch_size=5)
#ํ๋์ batch๋ฅผ ๋ฝ์์ feature์ label๋ก ๋ถ๋ฆฌํฉ๋๋ค.
[(train_features_batch, label_batch)] = train_ds.take(1)
#batch ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print('\nFB, TV, Newspaper batch ๋ฐ์ดํฐ:\n',train_features_batch)
print('Sales batch ๋ฐ์ดํฐ:',label_batch)
๋ชจ๋ธ ๊ตฌํ
Keras ํจํค์ง
ํ ์ํ๋ก์ฐ์ ํจํค์ง๋ก ์ ๊ณต๋๋ ๊ณ ์์คAPI
๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๊ฐ๋จํ๊ณ ๋น ๋ฅด๊ฒ ๊ตฌํ๊ฐ๋ฅ
Keras ๋ฉ์๋ (1)
๋ชจ๋ธ ํด๋์ค ๊ฐ์ฒด ์์ฑ
tf.keras.models.Sequential()
๋ชจ๋ธ์ ๊ฐ Layer๊ตฌ์ฑ
tf.keras.layer.Dense(units, activation)
units : ๋ ์ด์ด ์์ Node ์
activation : ์ ์ฉํ activationํจ์ ์ค์
Input Layer์ ์ ๋ ฅ ํํ ์ ์ฅํ๊ธฐ
์ฒซ ๋ฒ์งธ(=Input layer)๋ ์ ๋ ฅ ํํ์ ๋ํ ์ ๋ณด๋ฅผ ํ์๋ก ํ๋ค.
input_shape or input_dim ์ธ์ ์ค์ ํ์
๋ชจ๋ธ ๊ตฌ์ถ ์ฝ๋ ์์
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_dim=2, activation='sigmoid'), #2๊ฐ์ ์
๋ ฅ๋ณ์, 10๊ฐ ๋
ธ๋
tf.keras.layers.Dense(10, activation='sigmoid'), #10๊ฐ์ ๋
ธ๋
tf.keras.layers.Dense(1, activation='sigmoid'), #1๊ฐ์ ๋
ธ๋
])
* ์ ๋ ฅ์ด ๋ ๊ฐ, ์ถ๋ ฅ์ด ํ๋, ์ธ ๊ฐ์ ์ธต ์กด์ฌ
Keras ๋ฉ์๋ (2)
๋ชจ๋ธ์ Layer์ถ๊ฐํ๊ธฐ
[model].add(tf.keras.layers.Dense(units, activation))
units : ๋ ์ด์ด ์์ Node ์
activation : ์ ์ฉํ activationํจ์ ์ค์
๋ชจ๋ธ ๊ตฌ์ถ ์ฝ๋ ์์(2)
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(10, input_dim=2, activation='sigmoid'))
model.add(tf.keras.layers.Dense(10, activation='sigmoid'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
Keras ๋ฉ์๋ (3)
๋ฅ๋ฌ๋ ๋ชจ๋ธ ํ์ต์ํค๊ธฐ
๋ชจ๋ธ ํ์ต ๋ฐฉ์์ ์ค์ ํ๊ธฐ ์ํ ํจ์
[model].compile(optimizer, loss)
- optimizer : ๋ชจ๋ธ ํ์ต ์ต์ ํ ๋ฐฉ๋ฒ ex) GD, SGD, Adam...
- loss : ์์ค ํจ์ ์ค์ (ํ๊ท์์๋ MSE, ๋ถ๋ฅ์์๋ Cross Entropy...)
๋ชจ๋ธ์ ํ์ต์ํค๊ธฐ ์ํ ํจ์
[model].fit(x,y)
- x : ํ์ต ๋ฐ์ดํฐ
- y : ํ์ต ๋ฐ์ดํฐ์ label
* tensor ํํ์ dataset์ ๋ฃ์ด๋ ๋๋ค
์ฝ๋ ์์
#MSE๋ฅผ loss๋ก ์ค์ , ์ต์ ํ ๋ฐฉ์์ SGD์ฌ์ฉ
model.compile(loss='mean_squared_error', optimizer='SGD') #MSE
#dataset์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ๊ณ , epochs๋ฅผ 100์ผ๋ก ์ค์ ํ์ฌ ํ์ต
model.fit(dataset, epochs=100)
Keras ๋ฉ์๋ (4)
ํ๊ฐ ๋ฐ ์์ธกํ๊ธฐ
๋ชจ๋ธ์ ํ๊ฐํ๊ธฐ ์ํ ๋ฉ์๋
[model].evaluate(x, y)
- x : ํ ์คํธ ๋ฐ์ดํฐ
- y : ํ ์คํธ ๋ฐ์ดํฐ์ label
๋ชจ๋ธ๋ก ์์ธก์ ์ํํ๊ธฐ ์ํ ํจ์
[model].predict(x)
- x : ์์ธกํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ
์ฝ๋ ์์
#MSE๋ฅผ loss๋ก ์ค์ , ์ต์ ํ ๋ฐฉ์์ SGD์ฌ์ฉ
model.compile(loss='mean_squared_error', optimizer='SGD') #MSE
#dataset์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ๊ณ , epochs๋ฅผ 100์ผ๋ก ์ค์ ํ์ฌ ํ์ต
model.fit(dataset, epochs=100)
#๋ชจ๋ธ ํ๊ฐ ๋ฐ ์์ธกํ๊ธฐ
model.evaluate(X_test, Y_test)
predicted_labels_test = model.predict(X_test)
[์ฐ์ต๋ฌธ์ 2] ํ ์ํ๋ก์ฐ๋ฅผ ํ์ฉํ์ฌ ์ ๊ฒฝ๋ง ๊ตฌํํ๊ธฐ - ๋ชจ๋ธ ๊ตฌํ
[์ค์ต1]์ ์ด์ด์ ์ด๋ฒ ์ค์ต์์๋ ํ ์ํ๋ก์ฐ์ ์ผ๋ผ์ค(Keras)๋ฅผ ํ์ฉํ์ฌ ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
1. tf.keras.models.Sequential()์ ํ์ฉํ์ฌ ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ์์ฑํฉ๋๋ค.
- ์์ ๋กญ๊ฒ layers๋ฅผ ์๊ณ ๋ง์ง๋ง layers๋ ๋ ธ๋ ์๋ฅผ 1๊ฐ๋ก ์ค์ ํฉ๋๋ค.
import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
np.random.seed(100)
tf.random.set_seed(100)
#๋ฐ์ดํฐ๋ฅผ DataFrame ํํ๋ก ๋ถ๋ฌ ์ต๋๋ค.
df = pd.read_csv("data/Advertising.csv")
#DataFrame ๋ฐ์ดํฐ ์ํ 5๊ฐ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print('์๋ณธ ๋ฐ์ดํฐ ์ํ :')
print(df.head(),'\n')
#์๋ฏธ์๋ ๋ณ์๋ ์ญ์ ํฉ๋๋ค.
df = df.drop(columns=['Unnamed: 0'])
X = df.drop(columns=['Sales'])
Y = df['Sales']
#ํ์ต์ฉ ํ
์คํธ์ฉ ๋ฐ์ดํฐ๋ก ๋ถ๋ฆฌํฉ๋๋ค.
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.3)
#Dataset ํํ๋ก ๋ณํํฉ๋๋ค.
train_ds = tf.data.Dataset.from_tensor_slices((train_X.values, train_Y))
train_ds = train_ds.shuffle(len(train_X)).batch(batch_size=5)
#1. tf.keras.models.Sequential()๋ฅผ ํ์ฉํ์ฌ ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ์์ฑํฉ๋๋ค. ์์ ๋กญ๊ฒ layers๋ฅผ ์๊ณ ๋ง์ง๋ง layers๋ ๋
ธ๋ ์๋ฅผ 1๊ฐ๋ก ์ค์ ํฉ๋๋ค.
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_shape=(3,)),
tf.keras.layers.Dense(1)
])
print(model.summary())
[์ฐ์ต๋ฌธ์ 3] ํ ์ํ๋ก์ฐ๋ฅผ ํ์ฉํ์ฌ ์ ๊ฒฝ๋ง ๊ตฌํํ๊ธฐ - ๋ชจ๋ธ ํ์ต
ํ์ต๋ฐฉ๋ฒ ์ค์ : complie() ๋ฉ์๋๋ ๋ชจ๋ธ์ ์ด๋ป๊ฒ ํ์ตํ ์ง์ ๋ํด์ ์ค์ ํฉ๋๋ค. loss๋ ํ๊ท์์๋ ์ผ๋ฐ์ ์ผ๋ก MSE์ธ ‘mean_squared_error’, ๋ถ๋ฅ์์๋ ‘sparse_categorical_crossentropy’ ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
ํ์ต ์ํ : X ๋ฐ์ดํฐ๋ฅผ ์ํฌํฌ๋ฅผ 100๋ฒ์ผ๋ก ํ์ฌ ํ์ตํฉ๋๋ค. verbose ์ธ์๋ ํ์ต ์, ํ๋ฉด์ ์ถ๋ ฅ๋๋ ํํ๋ฅผ ์ค์ ํฉ๋๋ค. (0: ํ๊ธฐ ์์, 1: ์งํ ๋ฐ, 2: ์ํฌํฌ๋น ํ ์ค ์ถ๋ ฅ)
1. Dataset์ผ๋ก ๋ณํ๋ ํ์ต์ฉ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ๋ชจ๋ธ์ ํ์ต์ ์ํํฉ๋๋ค.
- compile ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ํ ๋ชจ๋ธ์ ์ค์ ํฉ๋๋ค. loss๋ ‘mean_squared_error’, optimizer๋ ‘adam’์ผ๋ก ์ค์ ํฉ๋๋ค.
- fit ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต์ฉ ๋ฐ์ดํฐ๋ฅผ ํ์ตํฉ๋๋ค. epochs๋ 100์ผ๋ก ์ค์ ํฉ๋๋ค.
import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
np.random.seed(100)
tf.random.set_seed(100)
#๋ฐ์ดํฐ๋ฅผ DataFrame ํํ๋ก ๋ถ๋ฌ ์ต๋๋ค.
df = pd.read_csv("data/Advertising.csv")
#DataFrame ๋ฐ์ดํฐ ์ํ 5๊ฐ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print('์๋ณธ ๋ฐ์ดํฐ ์ํ :')
print(df.head(),'\n')
#์๋ฏธ์๋ ๋ณ์๋ ์ญ์ ํฉ๋๋ค.
df = df.drop(columns=['Unnamed: 0'])
X = df.drop(columns=['Sales'])
Y = df['Sales']
#ํ์ต์ฉ ํ
์คํธ์ฉ ๋ฐ์ดํฐ๋ก ๋ถ๋ฆฌํฉ๋๋ค.
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.3)
#Dataset ํํ๋ก ๋ณํํฉ๋๋ค.
train_ds = tf.data.Dataset.from_tensor_slices((train_X.values, train_Y))
train_ds = train_ds.shuffle(len(train_X)).batch(batch_size=5)
#keras๋ฅผ ํ์ฉํ์ฌ ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ์์ฑํฉ๋๋ค.
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_shape=(3,)),
tf.keras.layers.Dense(1)
])
"""
1. ํ์ต์ฉ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ๋ชจ๋ธ์ ํ์ต์ ์ํํฉ๋๋ค.
step1. compile ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ํ ๋ชจ๋ธ ์ค์ ํฉ๋๋ค. loss๋ mean_squared_error, optimizer๋ adam์ผ๋ก ์ค์ ํฉ๋๋ค.
step2. fit ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ Dataset์ผ๋ก ๋ณํ๋ ํ์ต์ฉ ๋ฐ์ดํฐ๋ฅผ ํ์ตํฉ๋๋ค. epochs๋ 100์ผ๋ก ์ค์ ํฉ๋๋ค.
"""
model.compile(loss='mean_squared_error', optimizer='adam')
history = model.fit(train_ds, epochs=100, verbose=2)
[์ฐ์ต๋ฌธ์ 4] ํ ์ํ๋ก์ฐ๋ฅผ ํ์ฉํ์ฌ ์ ๊ฒฝ๋ง ๊ตฌํํ๊ธฐ - ๋ชจ๋ธ ํ๊ฐ ๋ฐ ์์ธก
ํ๊ฐ ๋ฐฉ๋ฒ : evaluate() ๋ฉ์๋๋ ํ์ต๋ ๋ชจ๋ธ์ ๋ฐํ์ผ๋ก ์ ๋ ฅํ feature ๋ฐ์ดํฐ X์ label Y์ loss ๊ฐ๊ณผ metrics ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค. ์ด๋ฒ ์ค์ต์์๋ metrics ๋ฅผ compile์์ ์ค์ ํ์ง ์์์ง๋ง, ๋ถ๋ฅ์์๋ ์ผ๋ฐ์ ์ผ๋ก accuracy๋ฅผ ์ฌ์ฉํ์ฌ evaluate ์ฌ์ฉ ์, 2๊ฐ์ ์์ํ์ ๋ฆฌํดํฉ๋๋ค.
์์ธก ๋ฐฉ๋ฒ : X ๋ฐ์ดํฐ์ ์์ธก label ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
1. evaluate ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ์ฉ ๋ฐ์ดํฐ์ loss ๊ฐ์ ๊ณ์ฐํ๊ณ loss์ ์ ์ฅํฉ๋๋ค.
2. predict ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ์ฉ ๋ฐ์ดํฐ์ ์์ธก๊ฐ์ ๊ณ์ฐํ๊ณ predictions์ ์ ์ฅํฉ๋๋ค.
import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
np.random.seed(100)
tf.random.set_seed(100)
#๋ฐ์ดํฐ๋ฅผ DataFrame ํํ๋ก ๋ถ๋ฌ ์ต๋๋ค.
df = pd.read_csv("data/Advertising.csv")
#DataFrame ๋ฐ์ดํฐ ์ํ 5๊ฐ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print('์๋ณธ ๋ฐ์ดํฐ ์ํ :')
print(df.head(),'\n')
#์๋ฏธ์๋ ๋ณ์๋ ์ญ์ ํฉ๋๋ค.
df = df.drop(columns=['Unnamed: 0'])
X = df.drop(columns=['Sales'])
Y = df['Sales']
#ํ์ต์ฉ ํ
์คํธ์ฉ ๋ฐ์ดํฐ๋ก ๋ถ๋ฆฌํฉ๋๋ค.
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.3)
#Dataset ํํ๋ก ๋ณํํฉ๋๋ค.
train_ds = tf.data.Dataset.from_tensor_slices((train_X.values, train_Y))
train_ds = train_ds.shuffle(len(train_X)).batch(batch_size=5)
#keras๋ฅผ ํ์ฉํ์ฌ ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ์์ฑํฉ๋๋ค.
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_shape=(3,)),
tf.keras.layers.Dense(1)
])
#ํ์ต์ฉ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ๋ชจ๋ธ์ ํ์ต์ ์ํํฉ๋๋ค.
model.compile(loss='mean_squared_error', optimizer='adam')
history = model.fit(train_ds, epochs=100, verbose=2)
#1. evaluate ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ
์คํธ์ฉ ๋ฐ์ดํฐ์ loss ๊ฐ์ ๊ณ์ฐํฉ๋๋ค.
loss = model.evaluate(test_X, test_Y, verbose=0)
#2. predict ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ
์คํธ์ฉ ๋ฐ์ดํฐ์ ์์ธก๊ฐ์ ๊ณ์ฐํฉ๋๋ค.
predictions = model.predict(test_X)
#๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print("ํ
์คํธ ๋ฐ์ดํฐ์ Loss ๊ฐ: ", loss)
for i in range(5):
print("%d ๋ฒ์งธ ํ
์คํธ ๋ฐ์ดํฐ์ ์ค์ ๊ฐ: %f" % (i, test_Y.iloc[i]))
print("%d ๋ฒ์งธ ํ
์คํธ ๋ฐ์ดํฐ์ ์์ธก๊ฐ: %f" % (i, predictions[i][0]))
[์ฐ์ต๋ฌธ์ 5] ์ ๊ฒฝ๋ง ๋ชจ๋ธ๋ก ๋ถ๋ฅํ๊ธฐ
Iris ๋ฐ์ดํฐ๊ฐ ์ฃผ์ด์ก์ ๋ ๋ถ๊ฝ์ ์ข ๋ฅ๋ฅผ ๋ถ๋ฅํ๋ ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ๊ตฌํํฉ๋๋ค. Iris ๋ฐ์ดํฐ๋ ์๋์ ๊ฐ์ด ๊ฝ๋ฐ์นจ ๊ธธ์ด, ๊ฝ๋ฐ์นจ ๋์ด, ๊ฝ์ ๊ธธ์ด, ๊ฝ์ ๋์ด ๋ค ๊ฐ์ง ๋ณ์์ ์ธ ์ข ๋ฅ์ ๋ถ๊ฝ ํด๋์ค๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
๋ชจ๋ธ ๊ตฌํ (5๊ฐ์ ๋ฒ์ฃผ๋ฅผ ๊ฐ๋ label ์์) : ๋ถ๋ฅ ๋ชจ๋ธ์์๋ ๋ง์ง๋ง ๋ ์ด์ด์ ๋ถ๋ฅ ๋ฐ์ดํฐ์ label ๋ฒ์ฃผ์ ๊ฐ์๋งํผ ๋ ธ๋๋ฅผ ์ค์ ํฉ๋๋ค. ์ถ๊ฐ๋ก activation ์ธ์๋ก ‘softmax’ ๋ฅผ ์ค์ ํฉ๋๋ค.
ํ์ต ๋ฐฉ๋ฒ : ๋ถ๋ฅ์์๋ ์ผ๋ฐ์ ์ผ๋ก loss๋ฅผ ‘sparse_categorical_crossentropy’์ผ๋ก ์ฌ์ฉํฉ๋๋ค. metrics ์ธ์๋ ์ํฌํฌ๋ง๋ค ๊ณ์ฐ๋๋ ํ๊ฐ ์งํ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ ํ๋๋ฅผ ์๋ฏธํ๋ ‘accuracy’ ๋ฅผ ์ ๋ ฅํ๋ฉด ์ํฌํฌ๋ง๋ค accuracy๋ฅผ ๊ณ์ฐํ์ฌ ์ถ๋ ฅํฉ๋๋ค.
1. keras๋ฅผ ํ์ฉํ์ฌ ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ์์ฑํฉ๋๋ค. 3๊ฐ์ง ๋ฒ์ฃผ๋ฅผ ๊ฐ๋ label ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ๊ธฐ ์ํด์ ๋ง์ง๋ง ๋ ์ด์ด ๋ ธ๋๋ฅผ ์๋์ ๊ฐ์ด ์ค์ ํฉ๋๋ค.
- ๋ ธ๋์ ์๋ 3๊ฐ
- activation์ ‘softmax’๋ก ์ค์ ํฉ๋๋ค.
import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
np.random.seed(100)
tf.random.set_seed(100)
#sklearn์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ ์ต๋๋ค.
X, Y = load_iris(return_X_y = True)
#DataFrame์ผ๋ก ๋ณํ
df = pd.DataFrame(X, columns=['๊ฝ๋ฐ์นจ ๊ธธ์ด','๊ฝ๋ฐ์นจ ๋์ด', '๊ฝ์ ๊ธธ์ด', '๊ฝ์ ๋์ด'])
df['ํด๋์ค'] = Y
X = df.drop(columns=['ํด๋์ค'])
Y = df['ํด๋์ค']
#ํ์ต์ฉ ํ๊ฐ์ฉ ๋ฐ์ดํฐ๋ก ๋ถ๋ฆฌํฉ๋๋ค
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.2, random_state = 42)
#Dataset ํํ๋ก ๋ณํํฉ๋๋ค.
train_ds = tf.data.Dataset.from_tensor_slices((train_X.values, train_Y))
train_ds = train_ds.shuffle(len(train_X)).batch(batch_size=5)
# 1. keras๋ฅผ ํ์ฉํ์ฌ ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ์์ฑํฉ๋๋ค. 3๊ฐ์ง ๋ฒ์ฃผ๋ฅผ ๊ฐ๋ label ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ๊ธฐ ์ํด์ ๋ง์ง๋ง ๋ ์ด์ด ๋
ธ๋๋ฅผ ์๋์ ๊ฐ์ด ์ค์ ํฉ๋๋ค.
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_dim=4),
tf.keras.layers.Dense(3, activation='softmax')
])
#ํ์ต์ฉ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ๋ชจ๋ธ์ ํ์ต์ ์ํํฉ๋๋ค.
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(train_ds, epochs=100, verbose=2)
#ํ
์คํธ์ฉ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ํ์ต๋ ๋ชจ๋ธ์ ํ๊ฐํฉ๋๋ค.
loss, acc = model.evaluate(test_X, test_Y)
#ํ
์คํธ์ฉ ๋ฐ์ดํฐ์ ์์ธก๊ฐ์ ๊ตฌํฉ๋๋ค.
predictions = model.predict(test_X)
#๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print("ํ
์คํธ ๋ฐ์ดํฐ์ Accuracy ๊ฐ: ", acc)
for i in range(5):
print("%d ๋ฒ์งธ ํ
์คํธ ๋ฐ์ดํฐ์ ์ค์ ๊ฐ: %d" % (i, test_Y.iloc[i]))
print("%d ๋ฒ์งธ ํ
์คํธ ๋ฐ์ดํฐ์ ์์ธก๊ฐ: %d" % (i, np.argmax(predictions[i])))
๋ค์ํ ์ ๊ฒฝ๋ง
์ฐ๋ฆฌ ์ฃผ๋ณ์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๊ธฐ์ ex) ์ผ๊ตด ์ธ์ ์นด๋ฉ๋ผ, ํ์ง ๊ฐ์ , ์ด๋ฏธ์ง ์๋ ํ๊น
๋ค์๊ณผ ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์๋ค๊ณ ํ ๋, ์ด๋ค ๋๋ฌผ์ธ์ง ๋ถ๋ฅํ๊ณ ์ ํ๋ค๋ฉด?
-> ์ปดํจํฐ์๊ฒ ์ด๋ฏธ์ง๋ ๊ฐ ํฝ์ ๊ฐ์ ๊ฐ์ง ์ซ์ ๋ฐฐ์ด๋ก ์ธ์
* ํฝ์ : ์ ์ฌ๊ฐํ ํํ์ ์ด๋ฏธ์ง์ ์์ ๋จ์
์ด๋ฏธ์ง ์ ์ฒ๋ฆฌํ๊ธฐ
๋ชจ๋ ๊ฐ์ ํฌ๊ธฐ๋ฅผ ๊ฐ๋ ์ด๋ฏธ์ง๋ก ํต์ผ
1) ๊ฐ๋ก, ์ธ๋ก ํฝ์ ์ฌ์ด์ฆ๋ฅผ ํํํ๋ ํด์๋๋ฅผ ํต์ผ
2) ์์ ํํํ๋ ๋ฐฉ์ ํต์ผ (RGG, HSV, Gray-scale, Binary, ...)
[์ฐ์ต๋ฌธ์ 6] MNIST ๋ถ๋ฅ CNN ๋ชจ๋ธ - ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
์ ๊ฒฝ๋ง์ ์ด์ฉํ ํ์ต์ ์์ํ ๋ ๋๋ถ๋ถ MNIST๋ฅผ ์ ํ๊ฒ ๋ฉ๋๋ค. MNIST๋ ์๊ธ์จ๋ก ๋ ์ฌ์ง์ ๋ชจ์ ๋ ๋ฐ์ดํฐ์ ๋๋ค. ์์ผ๋ก ์ด 0๋ถํฐ 9๊น์ง์ ๊ธ์๋ค์ด ์๊ณ , ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ์ ๊ฒฝ๋ง์ ํ์ต์ํค๊ณ , ํ์ต ๊ฒฐ๊ณผ๊ฐ ์๊ธ์จ๋ฅผ ์ธ์ํ ์ ์๋์ง ๊ฒ์ฆํฉ๋๋ค. ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ณ ๊ทธ ํํ๋ฅผ ํ์ธํ์ฌ CNN ๋ชจ๋ธ์ ์ ์ฉํ ์ ์๋๋ก ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
MNIST ๋ฐ์ดํฐ๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ด์ง๋ง ๊ฐ๋ก ๊ธธ์ด์ ์ธ๋ก ๊ธธ์ด๋ง ์กด์ฌํ๋ 2์ฐจ์ ๋ฐ์ดํฐ์ ๋๋ค. CNN ๋ชจ๋ธ์ ์ฑ๋(RGB ํน์ ํ๋ฐฑ)๊น์ง ๊ณ ๋ คํ 3์ฐจ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ๊ธฐ์ ์ฑ๋ ์ฐจ์์ ์ถ๊ฐํด ๋ฐ์ดํฐ์ ๋ชจ์(shape)์ ๋ฐ๊ฟ์ค๋๋ค. ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค.
[๋ฐ์ดํฐ ์, ๊ฐ๋ก ๊ธธ์ด, ์ธ๋ก ๊ธธ์ด]
-> [๋ฐ์ดํฐ ์, ๊ฐ๋ก ๊ธธ์ด, ์ธ๋ก ๊ธธ์ด, ์ฑ๋ ์]
์ฐจ์ ์ถ๊ฐ ํจ์ : tf.expand_dims(data, axis)
Tensor ๋ฐฐ์ด ๋ฐ์ดํฐ์์ ๋ง์ง๋ง ์ถ(axis)์ ํด๋นํ๋ ๊ณณ์ ์ฐจ์ ํ๋๋ฅผ ์ถ๊ฐํ ์ ์๋ ์ฝ๋์ ๋๋ค. ( axis์ -1์ ๋ฃ์ผ๋ฉด ์ด๋ค data๊ฐ ๋ค์ด์ค๋ ๋ง์ง๋ง ์ถ์ index๋ฅผ ์๋ฏธํฉ๋๋ค.)
1. ํ์ต์ฉ ๋ฐ ํ๊ฐ์ฉ ๋ฐ์ดํฐ๋ฅผ CNN ๋ชจ๋ธ์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก (์ํ๊ฐ์, ๊ฐ๋กํฝ์ , ์ธ๋กํฝ์ , 1) ํํ๋ก ๋ณํํฉ๋๋ค.
- tf.expand_dims ํจ์๋ฅผ ํ์ฉํ์ฌ train_images, test_images ๋ฐ์ดํฐ์ ํํ๋ฅผ ๋ณํํ๊ณ ๊ฐ๊ฐ train_images, test_images์ ์ ์ฅํฉ๋๋ค.
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
elice_utils = EliceUtils()
import logging, os
logging.disable(logging.WARNING)
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"
#๋์ผํ ์คํ ๊ฒฐ๊ณผ ํ์ธ์ ์ํ ์ฝ๋์
๋๋ค.
np.random.seed(123)
tf.random.set_seed(123)
#MNIST ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
mnist = tf.keras.datasets.mnist
#MNIST ๋ฐ์ดํฐ ์ธํธ๋ฅผ Train set๊ณผ Test set์ผ๋ก ๋๋์ด ์ค๋๋ค.
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
#Train ๋ฐ์ดํฐ 5000๊ฐ์ Test ๋ฐ์ดํฐ 1000๊ฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
train_images, train_labels = train_images[:5000], train_labels[:5000]
test_images, test_labels = test_images[:1000], test_labels[:1000]
print("์๋ณธ ํ์ต์ฉ ์ด๋ฏธ์ง ๋ฐ์ดํฐ ํํ: ",train_images.shape)
print("์๋ณธ ํ๊ฐ์ฉ ์ด๋ฏธ์ง ๋ฐ์ดํฐ ํํ: ",test_images.shape)
print("์๋ณธ ํ์ต์ฉ label ๋ฐ์ดํฐ: ",train_labels)
#์ฒซ ๋ฒ์งธ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
plt.figure(figsize=(10, 10))
plt.imshow(train_images[0], cmap=plt.cm.binary)
plt.colorbar()
plt.title("Training Data Sample")
plt.savefig("sample1.png")
elice_utils.send_image("sample1.png")
#9๊ฐ์ ํ์ต์ฉ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
class_names = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
for i in range(9):
plt.subplot(3,3,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_images[i], cmap=plt.cm.binary)
plt.xlabel(class_names[train_labels[i]])
plt.savefig("sample2.png")
elice_utils.send_image("sample2.png")
#1. CNN ๋ชจ๋ธ์ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก (์ํ๊ฐ์, ๊ฐ๋กํฝ์
, ์ธ๋กํฝ์
, 1) ํํ๋ก ๋ณํํฉ๋๋ค.
train_images = tf.expand_dims(train_images, -1)
test_images = tf.expand_dims(test_images, -1)
print("๋ณํํ ํ์ต์ฉ ์ด๋ฏธ์ง ๋ฐ์ดํฐ ํํ: ",train_images.shape)
print("๋ณํํ ํ๊ฐ์ฉ ์ด๋ฏธ์ง ๋ฐ์ดํฐ ํํ: ",test_images.shape)
๊ธฐ์กด ๋ค์ธต ํผ์ ํธ๋ก ๊ธฐ๋ฐ ์ ๊ฒฝ๋ง์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ฐฉ์
๊ทน๋๋ก ๋ง์ ์์ ํ๋ผ๋ฏธํฐ๊ฐ ํ์ํ๋ค.
๋ง์ฝ ์ด๋ฏธ์ง์ ๋ณํ๊ฐ ์๋ค๋ฉด? -> ๋ฐ์ดํฐ ๊ด์ ์์ ๋ณด๋ฉด ์๋ก์ด ์ด๋ฏธ์ง์ด๋ฏ๋ก ๋ถ๋ฅ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์๋ค.
ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง(Convolution Neural Network)
์์ ํํฐ๋ฅผ ์ํ์ํค๋ ๋ฐฉ์.
์ด๋ฏธ์ง์ ํจํด์ด ์๋ ํน์ง์ ์ค์ ์ผ๋ก ์ธ์ํ๋ค. -> ์ฑ๋ฅ ํฅ์
ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง์ ๊ตฌ์กฐ
CNN์ด ์ ๋ ฅ ์ด๋ฏธ์ง์ ํน์ง์ ์ถ์ถ, Fully-Connected Layer๊ฐ ๋ถ๋ฅํ๋ ๊ณผ์ ์ผ๋ก ๋์ํ๋ค
- CNN : Convolution Layer + Pooling Layer
- Fully-Connected Layer : ์ฌํ๊น์ง ๊ณต๋ถํ๋ ๋ฅ๋ฌ๋ ๋ชจ๋ธ (=Dense Layer)
์ด๋ฏธ์ง์์ ์ด๋ ํ ํน์ง์ด ์๋ ์ง๋ฅผ ๊ตฌํ๋ ๊ณผ์
ํํฐ๊ฐ ์ด๋ฏธ์ง๋ฅผ ์ด๋ํ๋ฉฐ ์๋ก์ด ์ด๋ฏธ์ง(ํผ์ณ๋งต)๋ฅผ ์์ฑ (๊ท, ์์ผ, ์ , ์๊น ํํฐ ๋ฑ๋ฑ์ ์ด๋ํ๋ฉฐ ํด๋น ์ด๋ฏธ์ง๊ฐ ์๋์ง ์๋์ง๋ฅผ ํ๋จํ๊ณ , ์ด๋ฏธ์ง๊ฐ ๋งค์น๋๋ฉด ๊ทธ ๊ฐ์ ๊ฐ์ฅ ํฌ๊ฒ๋ ๋ง๋ ๋ค)
ํผ์ณ๋งต์ ํฌ๊ธฐ ๋ณํ
Padding : ์๋ณธ๊ณผ ๋ค๋ฅธ ์ฌ์ด์ฆ์ ํํฐ ์์ฑ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ ๋ง๋ ๋ฐฉ์
Striding : ์ค์ ๊ฐ์ ๋ฐ๋ผ ๊ฒ์ฌ ๊ตฌ์ญ์ ์ง์ ํ ์ ์๋ค
Pooling Layer
์ด๋ฏธ์ง์ ์๊ณก์ด ์ํฅ(๋ ธ์ด์ฆ)๋ฅผ ์ถ์ํ๋ ๊ณผ์ .
์ ๋ณด ๋ํ ์์ถ๋๋ค.
ex) ํํฐ๋ฅผ ๊ฑฐ์ณ ์์ฑ๋ ํผ์ณ๋งต์ Max Pooling์ ์ฌ์ฉํ๋ฉด ๋์ ๊ฐ์ ๋ํ๊ฐ์ผ๋ก, ์์ ๊ฐ์ 0์ผ๋ก ํต์ผ์ํจ๋ค
Average Pooling์ ํ๊ท ๊ฐ์ผ๋ก ๋์ฒดํ๋ ๊ธฐ๋ฒ (๊ฑฐ์ ์ฌ์ฉํ์ง ์์)
Fully Connected Layer
์ถ์ถ๋ ํน์ง์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฅ
๋ถ๋ฅ๋ฅผ ์ํ Softmaxํ์ฑํ ํจ์
๋ง์ง๋ง ๊ณ์ธต์ Softmaxํ์ฑํ ํจ์ ์ฌ์ฉ
a + b + c + d + e + f = 1 (๊ฐ๊ฐ์ ๊ฐ์ ํ๋ฅ ๊ฐ)
a, b, c, d, e >= 0
Q. ๊ณ ์์ด๊ฐ ๋ง๋(1) ํ๋ฆฌ๋(0)๋ผ๋ ๋ฌธ์ ๋ฅผ ํ ๋ -> ๋ง์ง๋ง ๊ฐ์์ step function์ ๋ฃ์ผ๋ฉด ๋ต์ ๊ตฌํ ์ ์์์
Q. ๊ณ ์์ด, ๊ฐ์์ง, ํ ๋ผ ๊ฐ์ ๋ค์ํ label์ ์์ธกํด์ผ ํ ๋ -> ํ์ฑํํจ์ Softmax ์ฌ์ฉ, ๋ง์ง๋ง layer์ unit์ ๊ฐ์๋ ์์ธกํด์ผํ๋ label์ ๋ฒ์ฃผ์ ๊ฐ์๋งํผ์ผ๋ก ์ค์ ํด์ผ ํ๋ค
์ ๋ฆฌ
1. ํฉ์ฑ๊ณฑ : ํน์ง ์ถ์ถ
2. ํ๋ง : ์ฌ์ด์ฆ ์กฐ์ , ๋ ธ์ด์ฆ ์ฒ๋ฆฌ
* ์ด ๊ณผ์ ์ N๋ฒ ๋ฐ๋ณต -> ํน์ง ๋ณ ํํฐ๋ฅผ ๋ง์ด ์์ฑ (ํ๋ง ๋๋ถ์ ๋ฐ์ดํฐ ์ฌ์ด์ฆ๊ฐ ์๊ธฐ๋๋ฌธ์ ์ ์ฒด์ ์ธ ์์ด ๋์ง ์๋๋ค) = ๋ฐ๋ณตํ ๋๋ง๋ค ์ค์ด๋ ์์ญ์์์ ํน์ง์ ์ฐพ๊ฒ ๋๊ณ , ์์ญ์ ํฌ๊ธฐ๊ฐ ์์์ก๊ธฐ ๋๋ฌธ์ ๋น ๋ฅธ ํ์ต์ด ๊ฐ๋ฅํด์ง๋ค.
3. ํ์ฑํจ์ : ๋ถ๋ฅ
ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง ๊ธฐ๋ฐ ๋ค์ํ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๊ธฐ์
Object detection & segmentation : ๊ฐ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๊ตฌ๋ถํ ์ ์์
Super resolution (SR) : ํด์๋๊ฐ ๋ฎ์ ์ด๋ฏธ์ง์ ํด์๋๋ฅผ ๋์ผ ์ ์๋ค
[์ฐ์ต๋ฌธ์ 7] MNIST ๋ถ๋ฅ CNN ๋ชจ๋ธ - ๋ชจ๋ธ ๊ตฌํ
Keras์์ CNN ๋ชจ๋ธ์ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ํจ์/๋ฉ์๋
1. CNN ๋ ์ด์ด tf.keras.layers.Conv2D(filters, kernel_size, activation, padding) : ์ ๋ ฅ ์ด๋ฏธ์ง์ ํน์ง, ์ฆ ์ฒ๋ฆฌํ ํน์ง ๋งต(map)์ ์ถ์ถํ๋ ๋ ์ด์ด์ ๋๋ค.
- filters : ํํฐ(์ปค๋) ๊ฐ์
- kernel_size : ํํฐ(์ปค๋)์ ํฌ๊ธฐ
- activation : ํ์ฑํ ํจ์
- padding : ์ด๋ฏธ์ง๊ฐ ํํฐ๋ฅผ ๊ฑฐ์น ๋ ๊ทธ ํฌ๊ธฐ๊ฐ ์ค์ด๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ๊ฐ์ฅ์๋ฆฌ์ 0์ ๊ฐ์ ๊ฐ์ง๋ ํฝ์ ์ ๋ฃ์ ๊ฒ์ธ์ง ๋ง ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ณ์. ‘SAME’ ๋๋ ‘VALID’
2. Maxpool ๋ ์ด์ด tf.keras.layers.MaxPool2D(padding) : ์ฒ๋ฆฌํ ํน์ง ๋งต(map)์ ํฌ๊ธฐ๋ฅผ ์ค์ฌ์ฃผ๋ ๋ ์ด์ด์ ๋๋ค.
- padding : ‘SAME’ ๋๋ ‘VALID’
3. Flatten ๋ ์ด์ด tf.keras.layers.Flatten() : Convolution layer ๋๋ MaxPooling layer์ ๊ฒฐ๊ณผ๋ N์ฐจ์์ ํ ์ ํํ์ ๋๋ค. ์ด๋ฅผ 1์ฐจ์์ผ๋ก ํํํ๊ฒ ๋ง๋ค์ด์ค๋๋ค.
4. Dense ๋ ์ด์ด tf.keras.layers.Dense(node, activation)
- node : ๋ ธ๋(๋ด๋ฐ) ๊ฐ์
- activation : ํ์ฑํ ํจ์
1. keras๋ฅผ ํ์ฉํ์ฌ CNN ๋ชจ๋ธ์ ์ค์ ํฉ๋๋ค.
- ๋ถ๋ฅ ๋ชจ๋ธ์ ๋ง๊ฒ ๋ง์ง๋ง ๋ ์ด์ด์ ๋ ธ๋ ์๋ 10๊ฐ, activation ํจ์๋ ‘softmax’๋ก ์ค์ ํฉ๋๋ค.
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from visual import *
from elice_utils import EliceUtils
elice_utils = EliceUtils()
import logging, os
logging.disable(logging.WARNING)
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"
#๋์ผํ ์คํ ๊ฒฐ๊ณผ ํ์ธ์ ์ํ ์ฝ๋์
๋๋ค.
np.random.seed(123)
tf.random.set_seed(123)
# MNIST ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
mnist = tf.keras.datasets.mnist
#MNIST ๋ฐ์ดํฐ ์ธํธ๋ฅผ Train set๊ณผ Test set์ผ๋ก ๋๋์ด ์ค๋๋ค.
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
#Train ๋ฐ์ดํฐ 5000๊ฐ์ Test ๋ฐ์ดํฐ 1000๊ฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
train_images, train_labels = train_images[:5000], train_labels[:5000]
test_images, test_labels = test_images[:1000], test_labels[:1000]
#CNN ๋ชจ๋ธ์ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก (์ํ๊ฐ์, ๊ฐ๋กํฝ์
, ์ธ๋กํฝ์
, 1) ํํ๋ก ๋ณํํฉ๋๋ค.
train_images = tf.expand_dims(train_images, -1)
test_images = tf.expand_dims(test_images, -1)
#1. CNN ๋ชจ๋ธ์ ์ค์ ํฉ๋๋ค. ๋ถ๋ฅ ๋ชจ๋ธ์ ๋ง๊ฒ ๋ง์ง๋ง ๋ ์ด์ด์ ๋
ธ๋ ์๋ 10๊ฐ, activation ํจ์๋ 'softmax'๋ก ์ค์ ํฉ๋๋ค.
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(filters = 32, kernel_size = (3,3), activation = 'relu', padding = 'SAME', input_shape = (28,28,1)),
tf.keras.layers.MaxPool2D(padding = 'SAME'),
tf.keras.layers.Conv2D(filters = 32, kernel_size = (3,3), activation = 'relu', padding = 'SAME'),
tf.keras.layers.MaxPool2D(padding = 'SAME'),
tf.keras.layers.Conv2D(filters = 32, kernel_size = (3,3), activation = 'relu', padding = 'SAME'),
tf.keras.layers.MaxPool2D(padding = 'SAME'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation = 'relu'),
tf.keras.layers.Dense(10, activation = 'softmax')
])
#CNN ๋ชจ๋ธ ๊ตฌ์กฐ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print(model.summary())
#CNN ๋ชจ๋ธ์ ํ์ต ๋ฐฉ๋ฒ์ ์ค์ ํฉ๋๋ค.
model.compile(loss = 'sparse_categorical_crossentropy',
optimizer = 'adam',
metrics = ['accuracy'])
#ํ์ต์ ์ํํฉ๋๋ค.
history = model.fit(train_images, train_labels, epochs = 20, batch_size = 512)
#ํ์ต ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
Visulaize([('CNN', history)], 'loss')
[์ฐ์ต๋ฌธ์ 8] MNIST ๋ถ๋ฅ CNN ๋ชจ๋ธ - ํ๊ฐ ๋ฐ ์์ธก
Keras์์ CNN ๋ชจ๋ธ์ ํ๊ฐ ๋ฐ ์์ธก์ ์ํด ํ์ํ ํจ์/๋ฉ์๋
ํ๊ฐ ๋ฐฉ๋ฒ model.evaluate(X, Y) : evaluate() ๋ฉ์๋๋ ํ์ต๋ ๋ชจ๋ธ์ ๋ฐํ์ผ๋ก ์ ๋ ฅํ feature ๋ฐ์ดํฐ X์ label Y์ loss ๊ฐ๊ณผ metrics ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
์์ธก ๋ฐฉ๋ฒ model.predict_classes(X) : X ๋ฐ์ดํฐ์ ์์ธก label ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
1. evaluate ๋ฉ์๋์ ํ๊ฐ์ฉ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ํ๊ฐํฉ๋๋ค.
- loss์ accuracy๋ฅผ ๊ณ์ฐํ๊ณ loss, test_acc์ ์ ์ฅํฉ๋๋ค.
2. predict_classes ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ฐ์ฉ ๋ฐ์ดํฐ์ ๋ํ ์์ธก ๊ฒฐ๊ณผ๋ฅผ predictions์ ์ ์ฅํฉ๋๋ค.
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from visual import *
from plotter import *
from elice_utils import EliceUtils
elice_utils = EliceUtils()
import logging, os
logging.disable(logging.WARNING)
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"
# ๋์ผํ ์คํ ๊ฒฐ๊ณผ ํ์ธ์ ์ํ ์ฝ๋์
๋๋ค.
np.random.seed(123)
tf.random.set_seed(123)
# MNIST ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
mnist = tf.keras.datasets.mnist
# MNIST ๋ฐ์ดํฐ ์ธํธ๋ฅผ Train set๊ณผ Test set์ผ๋ก ๋๋์ด ์ค๋๋ค.
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# Train ๋ฐ์ดํฐ 5000๊ฐ์ Test ๋ฐ์ดํฐ 1000๊ฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
train_images, train_labels = train_images[:5000], train_labels[:5000]
test_images, test_labels = test_images[:1000], test_labels[:1000]
# CNN ๋ชจ๋ธ์ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก (์ํ๊ฐ์, ๊ฐ๋กํฝ์
, ์ธ๋กํฝ์
, 1) ํํ๋ก ๋ณํํฉ๋๋ค.
train_images = tf.expand_dims(train_images, -1)
test_images = tf.expand_dims(test_images, -1)
# CNN ๋ชจ๋ธ์ ์ค์ ํฉ๋๋ค.
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(filters = 32, kernel_size = (3,3), activation = 'relu', padding = 'SAME', input_shape = (28,28,1)),
tf.keras.layers.MaxPool2D(padding = 'SAME'),
tf.keras.layers.Conv2D(filters = 32, kernel_size = (3,3), activation = 'relu', padding = 'SAME'),
tf.keras.layers.MaxPool2D(padding = 'SAME'),
tf.keras.layers.Conv2D(filters = 32, kernel_size = (3,3), activation = 'relu', padding = 'SAME'),
tf.keras.layers.MaxPool2D(padding = 'SAME'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation = 'relu'),
tf.keras.layers.Dense(10, activation = 'softmax')
])
# CNN ๋ชจ๋ธ ๊ตฌ์กฐ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print(model.summary())
# CNN ๋ชจ๋ธ์ ํ์ต ๋ฐฉ๋ฒ์ ์ค์ ํฉ๋๋ค.
model.compile(loss = 'sparse_categorical_crossentropy',
optimizer = 'adam',
metrics = ['accuracy'])
# ํ์ต์ ์ํํฉ๋๋ค.
history = model.fit(train_images, train_labels, epochs = 10, batch_size = 128, verbose = 2)
Visulaize([('CNN', history)], 'loss')
"""
1. ํ๊ฐ์ฉ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ๋ชจ๋ธ์ ํ๊ฐํฉ๋๋ค.
loss์ accuracy๋ฅผ ๊ณ์ฐํ๊ณ loss, test_acc์ ์ ์ฅํฉ๋๋ค.
"""
loss, test_acc = model.evaluate(test_images, test_labels, verbose = 0)
"""
2. ํ๊ฐ์ฉ ๋ฐ์ดํฐ์ ๋ํ ์์ธก ๊ฒฐ๊ณผ๋ฅผ predictions์ ์ ์ฅํฉ๋๋ค.
"""
predictions = model.predict_classes(test_images)
# ๋ชจ๋ธ ํ๊ฐ ๋ฐ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print('\nTest Loss : {:.4f} | Test Accuracy : {}'.format(loss, test_acc))
print('์์ธกํ Test Data ํด๋์ค : ',predictions[:10])
# ํ๊ฐ์ฉ ๋ฐ์ดํฐ์ ๋ํ ๋ ์ด์ด ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํํฉ๋๋ค.
Plotter(test_images, model)
Test Loss : 0.1703 | Test Accuracy : 0.9490000009536743 ์์ธกํ Test Data ํด๋์ค : [7 2 1 0 4 1 4 9 6 9] ๋ ์ด์ด ์ด๋ฆ: conv2d
๋ ์ด์ด ์ด๋ฆ: max_pooling2d
๋ ์ด์ด ์ด๋ฆ: conv2d_1
๋ ์ด์ด ์ด๋ฆ: max_pooling2d_1
๋ ์ด์ด ์ด๋ฆ: conv2d_2
๋ ์ด์ด ์ด๋ฆ: max_pooling2d_2
์์ฐ์ด ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
์ฃผ๋ณ์ ์์ฐ์ด ์ฒ๋ฆฌ ex) ๊ธฐ๊ณ ๋ฒ์ญ ๋ชจ๋ธ, ์์ฑ์ธ์
์ฒ๋ฆฌ ๊ณผ์
1. ์์ฐ์ด ์ ์ฒ๋ฆฌ (Preprocessing)
2. ๋จ์ด ํํ (Word Embedding)
3. ๋ชจ๋ธ ์ ์ฉ (Modeling)
์ค๋ฅ ๊ต์ (Noise canceling)
"์๋ ํ ์ธ์. ๋ฐ๊ฐ ์ค๋๋ค."
↓
"์๋ ํ์ธ์. ๋ฐ๊ฐ์ต๋๋ค."
-> ์์ฐ์ด ๋ฌธ์ฅ์ ์คํ ๋ง ์ฒดํฌ ๋ฐ ๋์ด์ฐ๊ธฐ ์ค๋ฅ ๊ต์
ํ ํฐํ (Tokenizing)
"๋ฅ๋ฌ๋ ๊ธฐ์ด ๊ณผ๋ชฉ์ ์๊ฐํ๊ณ ์์ต๋๋ค."
↓
"['๋ฅ', '๋ฌ๋', '๊ธฐ์ด', '๊ณผ๋ชฉ', '์', '์๊ฐ', 'ํ๊ณ ', '์์ต๋๋ค'. '.']
-> ๋ฌธ์ฅ์ ํ ํฐ์ผ๋ก ๋๋๋ค. * ํ ํฐ : ์ด์ , ๋จ์ด ๋ฑ์ผ๋ก ๋ชฉ์ ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ ์
๋ถ์ฉ์ด ์ ๊ฑฐ(StopWord removal)
ํ๊ตญ์ด์์ ex) ์, ํด, ์์ด๊ตฌ, ์์ด์ฟ , ์์ด๊ณ , ์ฟ, ๊ทธ๋ฟ์ง ์์ผ๋ฉด, ๊ทธ๋ฌ๋, ๊ทธ๋ฐ๋ฐ, ํ์ง๋ง, ...
-> ๋ถํ์ํ ๋จ์ด ์ ๊ฑฐ
Bag of Words
์์ฐ์ด ๋ํฐ์ ํ๋์ฉ ๋ฝ์ index๋ฅผ ๋ถ์ฌํ๋ ์์
์์ฐ์ด ๋ฐ์ดํฐ
['์๋ ', '๋ง๋์', '๋ฐ๊ฐ์']
['์๋ ', '๋๋', '๋ฐ๊ฐ์']
↓ ์์นํ ๋ณํ
Bag of Words
['์๋ ' : 0, '๋ง๋์' : 1, '๋ฐ๊ฐ์' : 2, '๋๋' : 3]
ํ ํฐ ์ํ์ค
Bag of Words์์ ๋จ์ด์ ํด๋น๋๋ ์ธ๋ฑ์ค๋ก ๋ณํ.
๋ชจ๋ ๋ฌธ์ฅ์ ๊ธธ์ด๋ฅผ ๋ง์ถ๊ธฐ ์ํด ๊ธฐ์ค๋ณด๋ค ์งง์ ๋ฌธ์ฅ์๋ ํจ๋ฉ์ ์ํํ๋ค.
* ๊ธด ๋ฌธ์ฅ์ ๊ธฐ์ค์ผ๋ก ๊ธธ์ด๋ฅผ ํต์ผํ๋, ์ ๋ํ ๊ธด ๋ฌธ์ฅ์ ์ ์ธํ๊ณ ์์ ์ํ.
[์ฐ์ต๋ฌธ์ 9] ์ํ ๋ฆฌ๋ทฐ ๊ธ์ /๋ถ์ ๋ถ๋ฅ RNN ๋ชจ๋ธ - ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
์ํ ๋ฆฌ๋ทฐ์ ๊ฐ์ ์์ฐ์ด ์๋ฃ๋ ๊ณง ๋จ์ด์ ์ฐ์์ ์ธ ๋ฐฐ์ด๋ก์จ, ์๊ณ์ด ์๋ฃ๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค. ์ฆ, ์๊ณ์ด ์๋ฃ(์ฐ์๋ ๋จ์ด)๋ฅผ ์ด์ฉํด ๋ฆฌ๋ทฐ์ ๋ดํฌ๋ ๊ฐ์ (๊ธ์ , ๋ถ์ )์ ์์ธกํ๋ ๋ถ๋ฅ๊ธฐ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
1. ์ธ๋ฑ์ค๋ก ๋ณํ๋ X_train, X_test ์ํ์ค์ ํจ๋ฉ์ ์ํํ๊ณ ๊ฐ๊ฐ X_train, X_test์ ์ ์ฅํฉ๋๋ค.
- ์ํ์ค ์ต๋ ๊ธธ์ด๋ 300์ผ๋ก ์ค์ ํฉ๋๋ค.
import json
import numpy as np
import tensorflow as tf
import data_process
from keras.datasets import imdb
from keras.preprocessing import sequence
import logging, os
logging.disable(logging.WARNING)
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"
#ํ์ต์ฉ ๋ฐ ํ๊ฐ์ฉ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ํ ๋ฌธ์ฅ์ ์ถ๋ ฅํฉ๋๋ค.
X_train, y_train, X_test, y_test = data_process.imdb_data_load()
#1. ์ธ๋ฑ์ค๋ก ๋ณํ๋ X_train, X_test ์ํ์ค์ ํจ๋ฉ์ ์ํํ๊ณ ๊ฐ๊ฐ X_train, X_test์ ์ ์ฅํฉ๋๋ค. ์ํ์ค ์ต๋ ๊ธธ์ด๋ 300์ผ๋ก ์ค์ ํฉ๋๋ค.
X_train = sequence.pad_sequences(X_train, maxlen=300, padding='post')
X_test = sequence.pad_sequences(X_test, maxlen=300, padding='post')
print("\nํจ๋ฉ์ ์ถ๊ฐํ ์ฒซ ๋ฒ์งธ X_train ๋ฐ์ดํฐ ์ํ ํ ํฐ ์ธ๋ฑ์ค sequence: \n",X_train[0])
์๋ ์๋ฒ ๋ฉ Word Embedding
Bag of Words๋ ์๋ฏธ ์์ด ๋จ์ํ๊ฒ ์์๋ฅผ ๋ถ์ฌํ๋ค. Word Embedding์ ํตํด Bag of Words์ ์ธ๋ฑ์ค๋ก ์ ์๋ ํ ํฐ๋ค์๊ฒ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๋ค.
์ด์
๋ฒกํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ ํฐ์ ํน์ง์ ์ค๋ช (์ ์ฌ๋ ๊ตฌํ๊ธฐ, ์ฐ์ฐ ๊ฐ๋ฅ)
- ์ ์ฌ๋ : ์ด๋จธ๋์ ์๋ฒ์ง์ ์๋ฒ ๋ฉ[]์ ์ดํด๋ณด๋ฉด 0์ ๋ถ๋ถ์ด ๋๋ต์ ์ผ๋ก ๊ฒน์น๋ ๊ฒ์ ๋ณผ ์ ์๋ค. (์ ์ฌ๊ด๊ณ๋ฅผ ๊ฐ์ง ๋ฒกํฐ๋ค๋ผ๋ฆฌ๋ ์ ์ฌํ๊ฒ ํํ๋ฅผ ๋ง๋ ๋ค -> ๋จ์ด๋ค์ ์ฐ๊ด์ฑ์ ์ ์ ์๋ค.)
๊ธฐ์กด ๋ค์ธต ํผ์ ํธ๋ก ์ ๊ฒฝ๋ง์ ์์ฐ์ด ๋ถ๋ฅ ๋ฐฉ์
๋๊ดํธ๋ฅผ ์์ ๊ณ MLP๋ชจ๋ธ์ ๋ฃ์ด์ค์ผ ํ๋๋ฐ, ์ด ๊ฒฝ๊ณ๋ฅผ ํ๋ฌผ๋ฉด ํน์ง๋ค์ด ์ฌ๋ผ์ง๊ฒ ๋๋ค. ์๋ฒ ๋ฉ์ ํจ๊ณผ๊ฐ ์ฌ๋ผ์ง๊ณ , ๋ฌธ์ฅ๋ค ๊ฐ์ ๊ด๊ณ ๋ํ ๋ฌด๋์ง๋ค.
-> ์์ฐ์ด ๋ฌธ์ฅ์ ๊ธฐ์กด MLP๋ชจ๋ธ์ ์ ์ฉ์ํค๊ธฐ์๋ ํ๊ณ๊ฐ ์๋ค. ํ ํฐ ๊ฐ ์์์ ๊ด๊ณ๋ฅผ ์ ์ฉํ ์ ์๋ ๋ชจ๋ธ์ ์์๊น?
RNN model (Recurrent Neural Network)
X → RNN → Y
๊ธฐ์กด ํผ์ ํธ๋ก ๊ณ์ฐ๊ณผ ๋น์ทํ๊ฒ X์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ Y๋ฅผ ์ถ๋ ฅํ๋ค
์ํ ์ ๊ฒฝ๋ง์ ์ ์ถ๋ ฅ ๊ตฌ์กฐ
์ถ๋ ฅ ๊ฐ์ ๋ ๊ฐ๋๋ก ๋๋์ด ์ ๊ฒฝ๋ง์๊ฒ ๊ธฐ์ตํ๋ ๊ธฐ๋ฅ ๋ถ์ฌ
์ด์ ์ ์ฌ์ฉํ๋ ํ ํฐ์ ๋ํ ๊ธฐ์ต์ ๋ฐ์์์, ๋ค์ ํ ํฐ์ ๊ณ์ฐ์ ์ฌ์ฉํ๋ค.
์ํ ์ ๊ฒฝ๋ง ๊ธฐ๋ฐ ์์ฐ์ด ๋ถ๋ฅ ์์
[์์ ์ด], [์ด], [๋๋ฌด], [์ฌ๋ฐ์ด]๋ฅผ ๊ณ์ RNN๋ถ๋ฅ์ฒ๋ฆฌํ๋ค.
๋ง์ง๋ง์ ๋์จ ๊ฒฐ๊ณผ๋ฌผ Y๋ง Fully connected Layer์ ๋ฃ์ด 0์ธ์ง 1์ธ์ง๋ฅผ ํ๋จํ๋ค. (์ด์ output Y๋ ์ ๊ฒฝ์ฐ์ง ์๋๋ค)
์ ๋ฆฌ
1) ์๋ฒ ๋ฉ : ์ ์ฒ๋ฆฌ ๋ ๋ฐ์ดํฐ์ ํน์ง ์ถ์ถ
2) RNN : ๊ธฐ์ตํ๋ ๋ฅ๋ฌ๋ ๋ชจ๋ธ. ์์ ์ฌ์ฉ๋ ํ ํฐ๋ค์ด ํจ๊ป ํ์ต๋๋ฏ๋ก ์๋ก๊ฐ์ ์์ ๊ด๊ณ๋ ํฌํจ๋์ด ํ์ต
3) ํ์ฑํจ์ : ๋ถ๋ฅ์์ ์งํ ex) sigmoid, softmax
[์ฐ์ต๋ฌธ์ 10] ์ํ ๋ฆฌ๋ทฐ ๊ธ์ /๋ถ์ ๋ถ๋ฅ RNN ๋ชจ๋ธ - ๋ชจ๋ธ ํ์ต
Keras์์ RNN ๋ชจ๋ธ์ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ํจ์/๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ผ๋ฐ์ ์ผ๋ก RNN ๋ชจ๋ธ์ ์ ๋ ฅ์ธต์ผ๋ก Embedding ๋ ์ด์ด๋ฅผ ๋จผ์ ์๊ณ , RNN ๋ ์ด์ด๋ฅผ ๋ช ๊ฐ ์์ ๋ค์, ์ดํ Dense ๋ ์ด์ด๋ฅผ ๋ ์์ ์์ฑํฉ๋๋ค.
์๋ฒ ๋ฉ ๋ ์ด์ด tf.keras.layers.Embedding(input_dim, output_dim, input_length) : ๋ค์ด์จ ๋ฌธ์ฅ์ ๋จ์ด ์๋ฒ ๋ฉ(embedding)ํ๋ ๋ ์ด์ด
- input_dim: ๋ค์ด์ฌ ๋จ์ด์ ๊ฐ์
- output_dim: ๊ฒฐ๊ณผ๋ก ๋์ฌ ์๋ฒ ๋ฉ ๋ฒกํฐ์ ํฌ๊ธฐ(์ฐจ์)
- input_length: ๋ค์ด์ค๋ ๋จ์ด ๋ฒกํฐ์ ํฌ๊ธฐ
- RNN ๋ ์ด์ด
๋จ์ RNN ๋ ์ด์ด : tf.keras.layers.SimpleRNN(units)
- units: ๋ ์ด์ด์ ๋ ธ๋ ์
1. RNN ๋ชจ๋ธ์ ๊ตฌํํฉ๋๋ค.
- ์๋ฒ ๋ฉ ๋ ์ด์ด ๋ค์์ผ๋ก SimpleRNN์ ์ฌ์ฉํ์ฌ RNN ๋ ์ด์ด๋ฅผ ์๊ณ ๋ ธ๋์ ๊ฐ์๋ 5๊ฐ๋ก ์ค์ ํฉ๋๋ค.
import json
import numpy as np
import tensorflow as tf
import data_process
from keras.datasets import imdb
from keras.preprocessing import sequence
import logging, os
logging.disable(logging.WARNING)
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"
#๋์ผํ ์คํ ๊ฒฐ๊ณผ ํ์ธ์ ์ํ ์ฝ๋์
๋๋ค.
np.random.seed(123)
tf.random.set_seed(123)
#ํ์ต์ฉ ๋ฐ ํ๊ฐ์ฉ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ํ ๋ฌธ์ฅ์ ์ถ๋ ฅํฉ๋๋ค.
X_train, y_train, X_test, y_test = data_process.imdb_data_load()
max_review_length = 300
#ํจ๋ฉ์ ์ํํฉ๋๋ค.
X_train = sequence.pad_sequences(X_train, maxlen=max_review_length, padding='post')
X_test = sequence.pad_sequences(X_test, maxlen=max_review_length, padding='post')
embedding_vector_length = 32
"""
1. ๋ชจ๋ธ์ ๊ตฌํํฉ๋๋ค.
์๋ฒ ๋ฉ ๋ ์ด์ด ๋ค์์ผ๋ก `SimpleRNN`์ ์ฌ์ฉํ์ฌ RNN ๋ ์ด์ด๋ฅผ ์๊ณ ๋
ธ๋์ ๊ฐ์๋ 5๊ฐ๋ก ์ค์ ํฉ๋๋ค.
Dense ๋ ์ด์ด๋ 0, 1 ๋ถ๋ฅ์ด๊ธฐ์ ๋
ธ๋๋ฅผ 1๊ฐ๋ก ํ๊ณ activation์ 'sigmoid'๋ก ์ค์ ๋์ด ์์ต๋๋ค.
"""
model = tf.keras.models.Sequential([
tf.keras.layers.Embedding(1000, embedding_vector_length, input_length = max_review_length),
tf.keras.layers.SimpleRNN(5),
tf.keras.layers.Dense(1, activation='sigmoid')
])
#๋ชจ๋ธ์ ํ์ธํฉ๋๋ค.
print(model.summary())
#ํ์ต ๋ฐฉ๋ฒ์ ์ค์ ํฉ๋๋ค.
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
#ํ์ต์ ์ํํฉ๋๋ค.
model_history = model.fit(X_train, y_train, epochs = 3, verbose = 2)
[์ฐ์ต๋ฌธ์ 11] ์ํ ๋ฆฌ๋ทฐ ๊ธ์ /๋ถ์ ๋ถ๋ฅ RNN ๋ชจ๋ธ - ํ๊ฐ ๋ฐ ์์ธก
Keras์์ RNN ๋ชจ๋ธ์ ํ๊ฐ ๋ฐ ์์ธก์ ์ํด ํ์ํ ํจ์/๋ฉ์๋
ํ๊ฐ ๋ฐฉ๋ฒ model.evaluate(X, Y) : evaluate() ๋ฉ์๋๋ ํ์ต๋ ๋ชจ๋ธ์ ๋ฐํ์ผ๋ก ์ ๋ ฅํ feature ๋ฐ์ดํฐ X์ label Y์ loss ๊ฐ๊ณผ metrics ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
์์ธก ๋ฐฉ๋ฒ model.predict(X) : X ๋ฐ์ดํฐ์ ์์ธก label ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
1. evaluate ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ฐ์ฉ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ๋ชจ๋ธ์ ํ๊ฐํฉ๋๋ค.
- loss์ accuracy๋ฅผ ๊ณ์ฐํ๊ณ loss, test_acc์ ์ ์ฅํฉ๋๋ค.
2. predict ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ฐ์ฉ ๋ฐ์ดํฐ์ ๋ํ ์์ธก ๊ฒฐ๊ณผ๋ฅผ predictions์ ์ ์ฅํฉ๋๋ค.
import json
import numpy as np
import tensorflow as tf
import data_process
from keras.datasets import imdb
from keras.preprocessing import sequence
import logging, os
logging.disable(logging.WARNING)
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"
#๋์ผํ ์คํ ๊ฒฐ๊ณผ ํ์ธ์ ์ํ ์ฝ๋์
๋๋ค.
np.random.seed(123)
tf.random.set_seed(123)
#ํ์ต์ฉ ๋ฐ ํ๊ฐ์ฉ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ํ ๋ฌธ์ฅ์ ์ถ๋ ฅํฉ๋๋ค.
X_train, y_train, X_test, y_test = data_process.imdb_data_load()
max_review_length = 300
#ํจ๋ฉ์ ์ํํฉ๋๋ค.
X_train = sequence.pad_sequences(X_train, maxlen=max_review_length, padding='post')
X_test = sequence.pad_sequences(X_test, maxlen=max_review_length, padding='post')
embedding_vector_length = 32
#๋ชจ๋ธ์ ๊ตฌํํฉ๋๋ค.
model = tf.keras.models.Sequential([
tf.keras.layers.Embedding(1000, embedding_vector_length, input_length = max_review_length),
tf.keras.layers.SimpleRNN(5),
tf.keras.layers.Dense(1, activation='sigmoid')
])
#๋ชจ๋ธ์ ํ์ธํฉ๋๋ค.
print(model.summary())
#ํ์ต ๋ฐฉ๋ฒ์ ์ค์ ํฉ๋๋ค.
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
#ํ์ต์ ์ํํฉ๋๋ค.
model_history = model.fit(X_train, y_train, epochs = 5, verbose = 2)
#1. ํ๊ฐ์ฉ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ๋ชจ๋ธ์ ํ๊ฐํฉ๋๋ค. loss์ accuracy๋ฅผ ๊ณ์ฐํ๊ณ loss, test_acc์ ์ ์ฅํฉ๋๋ค.
loss, test_acc = model.evaluate(X_test, y_test, verbose = 0)
#2. ํ๊ฐ์ฉ ๋ฐ์ดํฐ์ ๋ํ ์์ธก ๊ฒฐ๊ณผ๋ฅผ predictions์ ์ ์ฅํฉ๋๋ค.
predictions = model.predict(X_test)
#๋ชจ๋ธ ํ๊ฐ ๋ฐ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print('\nTest Loss : {:.4f} | Test Accuracy : {}'.format(loss, test_acc))
print('์์ธกํ Test Data ํด๋์ค : ',1 if predictions[0]>=0.5 else 0)