index ๋ฐํ ํจ์
argmin : ์ถ ๋ณ ์ต์ ๊ฐ์ index ๋ฐํ
argmax : ์ถ ๋ณ ์ต๋ ๊ฐ์ index ๋ฐํ
unique : ์ค๋ณต ์ ๊ฑฐ ๊ฒฐ๊ณผ index ๋ฐํ
kNN classifier
kNN ๋ถ๋ฅ๊ธฐ ํน์ง
- ์๋ ค์ง์ง ์์ ๋ฒ์ฃผ๋ฅผ ๋์์ผ๋ก ๊ฐ์ฅ ์ ์ฌํ ๋ฒ์ฃผ๋ก ๋ถ๋ฅ
- ๊ธฐ์กด ๋ฒ์ฃผ๊ฐ ์กด์ฌํด์ผ ํจ
- ์๋ฃํ(๊ณผ์ผ, ์ฑ์, ๋จ๋ฐฑ์ง ๋ฑ)
- ํ์ตํ์ง ์์ : ๊ฒ์ผ๋ฅธ ํ์ต
kNN classifier ์๊ณ ๋ฆฌ์ฆ
* X : ๊ธฐ์กด ๋ถ๋ฅ์ง๋จ Y : ์๋ก์ด ๋ถ๋ฅ๋์
1. tensorflow Euclidean ๊ฑฐ๋ ๊ณ์ฐ์
distance = tf.sqrt( tf.reduce_sum( tf.square(X-Y) ), axis=1))
2.์ค์ฐจ๊ฐ ์ต์์ธ index ๋ฐํ (Euclidean ๊ฑฐ๋ฆฌ๊ณ์ฐ์)
pred = tf.arg_min(distance, 0)
Model & Activation function
ํ๊ท๋ถ์(๋น์จ์ฒ๋) : Identity function
๋ถ๋ฅ๋ถ์(์ดํญ๋ถ๋ฅ) : Sigmoid function
๋ถ๋ฅ๋ถ์(๋คํญ๋ถ๋ฅ) : Softmax function
Identity function : ํญ๋ฑํจ์[์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ์ผ๋ก ํ์ฑํ]
Sigmoid function : 0~1 ์ฌ์ด ํ๋ฅ ๊ฐ(Sigmoid ๊ณ์ด : tanh, ReLU ๋ฑ)
Softmax function : 0~1 ์ฌ์ด ํ๋ฅ ๊ฐ, ์ ์ฒดํฉ=1
Tensorflow ์ฃผ์ Model
*w → weight / b → bias
1. linear regression ์๊ณ ๋ฆฌ์ฆ : ์์น ์์ธก
model = tf.matmul(X, w) + b #y ์์ธก์น
2. sigmoid classification ์๊ณ ๋ฆฌ์ฆ : ์ดํญ ๋ถ๋ฅ
model = tf.sigmoid(tf.matmul(X, w) + b) #y ์์ธก์น
3. softmax classification ์๊ณ ๋ฆฌ์ฆ : ๋คํญ๋ถ๋ฅ
model = tf.nn.softmax(tf.matmul(X, w) + b) #y ์์ธก์น
Linear Regression ์๊ณ ๋ฆฌ์ฆ : ์์น ์์ธก
Y = tf.placeholder(tf.float32) #y ์ค์ ๊ฐ
1. ํ๊ท๋ฐฉ์ ์ : ๊ธฐ๊ณํ์ต model y_pred = (X * w) + b #y ์์ธก์น
2. ์์ค(๋น์ฉ)ํจ์ : MSE Loss = tf.reduce_mean(tf.square(Y – y_pred)) #์์ค๊ฐ ๋ฐํ
3. ๊ฒฝ์ฌํ๊ฐ๋ฒ : ๋น์ฉํจ์ ์ต์ํ -> w(๊ฐ์ค์น), b(ํธํฅ) ์์ optimizer = tf.optimizers.Adam(lr=0.01)
Sigmoid classification ์๊ณ ๋ฆฌ์ฆ : ์ดํญ ๋ถ๋ฅ
Y = tf.placeholder(tf.float32) #y ์ค์ ๊ฐ
1. ํ๊ท๋ฐฉ์ ์+ sigmoid ํจ์
y_pred = tf.matmul(X, w) + b #ํ๊ท๋ฐฉ์ ์
sig = tf.nn.sigmoid(y_pred) #y ์์ธก์น
2. ์์ค(๋น์ฉ)ํจ์ : Cross Entropy
loss = -tf.reduce_mean(Y*tf.math.log(sig)+(1-Y)*tf.math.log(1-sig))
3. ๊ฒฝ์ฌํ๊ฐ๋ฒ ์๊ณ ๋ฆฌ์ฆ : ๋น์ฉํจ์ ์ต์ํ
optimizer = tf.optimizers.Adam(lr=0.01)
Softmax classification ์๊ณ ๋ฆฌ์ฆ : ๋คํญ๋ถ๋ฅ
Y = tf.placeholder('float', [None, 10]) # y ์ค์ ๊ฐ
1. model = ํ๊ท๋ฐฉ์ ์+ softmax ํจ์
model = tf.matmul(X, w) + b #ํ๊ท๋ฐฉ์ ์
soft = tf.nn.softmax(model) #y ์์ธก์น
2. ์์ค(๋น์ฉ)ํจ์ : Cross Entropy
loss = -tf.reduce_mean(Y*tf.math.log(soft)+(1-Y)*tf.math.log(1- soft))
3. ๊ฒฝ์ฌํ๊ฐ๋ฒ ์๊ณ ๋ฆฌ์ฆ : ๋น์ฉํจ์ ์ต์ํ
optimizer = tf.optimizers.Adam(lr=0.01)
Cross Entropy
Entropy | Cross Entropy |
๋ฌผ๋ฆฌํ ์ฉ์ด | ํต๊ณํ ์ฉ์ด |
ํ๋ฅ ๋ณ์ ๊ฐ์ ๋ถํ์ค์ฑ์ ๋ํ๋ด๋ ์์น | ๋ ํ๋ฅ ๋ณ์ x, y์์ x๋ฅผ ๊ด์ฐฐํ ํ y์ ๋ํ ๋ถํ์ค์ฑ์ ์ค์ธ๋ค. |
์ด ๊ฐ์ด ํด ์๋ก ์ผ์ ํ ๋ฐฉํฅ์ฑ๊ณผ ๊ท์น์ฑ์ด ์๋ ๋ฌด์ง์ (chaos) | ๋ฅ๋ฌ๋ ๋ถ๋ฅ๊ธฐ์์ loss ๊ณ์ฐ์ ์ด์ฉ (์ ๋ต๊ณผ ์์ธก์น ์ค์ฐจ ๊ณ์ฐ) |
์ = -sum(p * log(p)) | ์ = -tf.reduce_mean(Y * log(y_pred) + (1-Y) * log(1-y_pred)) |
Sigmoid classification
์ดํญ๋ถ๋ฅ
logistic ํ๊ท๋ถ์์ ํน์ง
๋ชฉ์ : ๋ ๋ฆฝ ๋ณ์๊ฐ [-∞,∞]์ ์ด๋ ์ซ์์ด๋ ์๊ด ์์ด ์ข ์ ๋ณ์ ๊ฐ์ด ํญ์ ๋ฒ์ [0,1] ์ฌ์ด์ ์๋๋ก ํ๋ค.
์ ํ ํ๊ท๋ถ์๊ณผ ์ฐจ์ด์ : ์ข ์๋ณ์ ๋ฒ์ฃผํ(binary) -> [0, 1] encoding
ANN, ๋ฅ ๋ฌ๋์ ์ค์ ์ปดํฌ๋ํธ
ํ์ฉ๋ถ์ผ
1. ๋ฉ์์ง ๋ถ๋ฅ → Spam(1)/ham(0)
2. ์ด๋ฏธ์ง๋ฅผ ๋ณด๊ณ ์ข ์(tumor) ์ง๋จ → ์ ์ฑ(1)/์์ฑ(0)
3. ์ด์ ์ ์์ฅ ๋ํฅ์ผ๋ก ํ์ต → ์ฃผ์ ๋งค๋งค(1)/๋น๋งค๋งค(0)
Sigmoid(Logistic) ํ์ฑํจ์ ์
Sigmoid classification ์๊ณ ๋ฆฌ์ฆ
Y = tf.placeholder(tf.float32) #y ์ค์ ๊ฐ
(1) model : ํ๊ท๋ฐฉ์ ์
model = tf.matmul(X, w) + b #-inf ~ + inf # sigmoid(model)
sig = tf.nn.sigmoid(model) # 0~1 ํ๋ฅ ๊ฐ
(2) loss function : Entropy ์ด์ฉ = -sum(Y * log(model))
loss = -tf.reduce_mean(Y * tf.log(sig) + (1 - Y) * tf.log(1 - sig))
(3) ๊ฒฝ์ฌํ๊ฐ๋ฒ ์๊ณ ๋ฆฌ์ฆ : ๋น์ฉํจ์ ์ต์ํ
optimizer = tf.optimizers.Adam (0.1)
Softmax Classification
๋คํญ ๋ถ๋ฅ(multi-classification)
์ฃผ์ด์ง ๋ฐ์ดํฐ ์งํฉ์ ์ด๋ฏธ ์ ์๋ ๋ช ๊ฐ์ ํด๋์ค๋ก ๊ตฌ๋ถํ๋ ๋ฌธ์
์ ๋ ฅ ๋ฐ์ดํฐ์ ๊ฐ ๋ฐ์ดํฐ์ ํด๋์ค ๋ผ๋ฒจ์ด ํจ๊ป ์ ๊ณต -> {xi, y(xi)}
y๋ณ์์ label์ ๋ฐ๋ผ์ ํ์ฑํจ์ ์ ์ฉ(์ดํญ๋ถ๋ฅ, ๋คํญ๋ถ๋ฅ)
Softmax ํ์ฑํจ์ ์
Y1 : 0.09003057 (9%)
Y2 : 0.24472847 (24%)
Y3: 0.66524096 (67% -> ๊ฐ๋ฅ์ฑ์ด ๊ฐ์ฅ ๋๋ค)
๋คํญ๋ถ๋ฅ ์
ํธ๊ณผ ๋ ๊ฐ๊ฐ ์๋์ง ์๋์ง์ ๋ฐ๋ผ, ํฌ์ ๋ฅ, ์กฐ๋ฅ, ๊ธฐํ๋ก ๋ถ๋ฅํ๋ ์ ๊ฒฝ๋ง ๋ชจ๋ธ
import tensorflow as tf
import numpy as np
#[ํธ, ๋ ๊ฐ]
x_data = np.array(
[[0, 0], [1, 0], [1, 1], [0, 0], [0, 1], [1, 1]])
#[๊ธฐํ, ํฌ์ ๋ฅ, ์กฐ๋ฅ]
y_data = np.array([
[1, 0, 0], # ๊ธฐํ
[0, 1, 0], # ํฌ์ ๋ฅ
[0, 0, 1], # ์กฐ๋ฅ
[1, 0, 0],
[1, 0, 0],
[0, 0, 1] ])
* one hot encoding : ์ ์ฒด ๋ฒกํฐ ๋ฐ์ดํฐ ์ค ํ๋๋ง 1์ด๊ณ , ๋๋จธ์ง๋ 0์ธ ์ธ์ฝ๋ฉ ๋ฐฉ์ โ dummy๋ n-1๊ฐ๋ก ๋ณ์ ์ฌ์ด์ฆ๊ฐ ์ค์
softmax classification ์๊ณ ๋ฆฌ์ฆ
Y = tf.placeholder('float', [None, 10]) # y ์ค์ ๊ฐ
(1) ํ๊ท๋ฐฉ์ ์ : ์์ธก์น
model = tf.matmul(X, w) + b # ํ๊ท๋ชจ๋ธ
softmax(์์ธก์น)
soft = tf.nn.softmax(model) # 0~1 ํ๋ฅ ๊ฐ(์ ์ฒด ํฉ=1)
(2) loss function : Entropy ์ด์ฉ : -sum(Y * log(model))
loss = -tf.reduce_mean(Y * tf.log(soft) + (1 - Y) * tf.log(1 - soft))
(3) ๊ฒฝ์ฌํ๊ฐ๋ฒ ์๊ณ ๋ฆฌ์ฆ : ๋น์ฉํจ์ ์ต์ํ
optimizer = tf.optimizers.Adam (0.1)
Tensorflow ๋คํญ๋ถ๋ฅ model
x_data = np.array( [[0, 0], [1, 0], [1, 1], [0, 0], [0, 1], [1, 1]])
y_data = np.array([ [1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 0, 0], [1, 0, 0], [0, 0, 1]])
X = tf.placeholder(tf.float32, [None, 2])
Y = tf.placeholder(tf.float32, [None, 3])
w = tf.Variable(tf.random_normal([2, 3])) # (2, 3)
b = tf.Variable(tf.zeros([3])) # (3)
model = tf.matmul(X, w) + b
# (None, 3)
[[ 0.74250543 -1.18412077 -0.74753278]
[ 0.10888183 -0.62678969 -0.88903713]
[ 0.486274 -1.19238925 -1.20663118]
...
softmax = tf.nn.softmax(model)
# (None, 3)
[[ 0.72939312 0.10622789 0.164379 ]
[ 0.54117554 0.25932243 0.19950208]
[ 0.72960341 0.13616098 0.13423553]
...
* ํ์ ํฉ = 1
index ๋ฆฌํด
1. argmin/argmax
- ์ต์/์ต๋ ๊ฐ์ index ๋ฐํ
tf.arg_min -> tf.arg_min
2. unique
- ์ค๋ณต์ ๊ฑฐ
import tensorflow as tf #ver2.3
1. argmin/argmax
a = tf.constant([5,2,1,4,3], dtype=tf.int32)
b = tf.constant([4,5,1,3,2])
c = tf.constant([[5,4,2], [3,2,4]]) #2์ฐจ์
print(c)
'''
[[5 4 2]
[3 2 4]]
'''
dimension : reduce ์ฐจ์(vector = 0)
min_index = tf.argmin(a, 0) #1์ฐจ์ ๋์
max_index = tf.argmax(b, 0) #1์ฐจ์ ๋์
print(tf.argsort(a, 0)) #[2 1 4 3 0]
max_index2 = tf.argmax(c, 1) #2์ฐจ์ ๋์
min_index2 = tf.argmin(c, 1) #2์ฐจ์ ๋์
print(min_index.numpy()) #2
print(max_index.numpy()) #1
print(max_index2.numpy()) #[0 2] - [1ํ, 2ํ]
print(min_index2.numpy()) #[2 1] - [1ํ, 2ํ]
2. unique
c = tf.constant(['a','b','a','c','b', 'c'])
cstr, cidx = tf.unique(c)
print(cstr.numpy()) #['a' 'b' 'c']
print(cidx.numpy()) #[0 1 0 2 1 2]
KNN(K-Nearest Neighbor) ์๊ณ ๋ฆฌ์ฆ
- ํ์ต๊ณผ์ ์์
- Euclidean ๊ฑฐ๋ฆฌ๊ณ์ฐ์
import numpy as np
import tensorflow as tf
x : ๋ถ๋ฅ์ง๋จ
p1 = [1.2, 1.1]
p2 = [1.0, 1.0]
p3 = [1.8, 0.8]
p4 = [2, 0.9]
x_data = np.array([p1, p2, p3, p4]) #์๋ ค์ง ๋ฒ์ฃผ
label = ['A','A','B','B'] #๋ถ๋ฅ๋ฒ์ฃผ(Y๋ณ์)
y_data = [1.6, 0.85] #y : ๋ถ๋ฅ๋์
x,y ๋ณ์ ์ ์ธ : tensor ์์ฑ
X = tf.constant(x_data, tf.float32) #์๋ ค์ง ์ง๋จ
Y = tf.constant(y_data, tf.float32) #์๋ ค์ง์ง ์์ ์ง๋จ(๋ถ๋ฅ๋์)
Euclidean ๊ฑฐ๋ฆฌ๊ณ์ฐ์
distance = tf.math.sqrt(tf.math.reduce_sum(tf.math.square(X-Y),axis=1))
'''
๋ธ๋ก๋์บ์คํ
์ฐ์ฐ : sqrt( sum( (x-y)^2 ) )
distance : ๊ฑฐ๋ฆฌ๊ณ์ฐ ๊ฒฐ๊ณผ 4๊ฐ ์์๋ฅผ ๊ฐ๋ vector
'''
print(distance) #[0.47169903 0.61846584 0.20615523 0.40311286]
๊ฐ์ฅ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ index ๋ฐํ
idx = tf.argmin(distance, 0) #input, dimension
print('๋ถ๋ฅ index :', idx.numpy())
print('๋ถ๋ฅ๊ฒฐ๊ณผ : ', label[idx]) #๋ถ๋ฅ๊ฒฐ๊ณผ : B
CrossEntropy
- ๋ ํ๋ฅ ๋ณ์ x, y์์ x๋ฅผ ๊ด์ฐฐํ ํ y์ ๋ํ ๋ถํ์ค์ฑ ์ธก์
- ๋ฅ๋ฌ๋ ๋ถ๋ฅ๊ธฐ : ์ ๋ต(Y) VS ์์ธก์น(y_pred)
-> ์ ๋ต(Y)๋ฅผ ๊ด์ฐฐํ ํ ์์ธก์น์ ์์ค(loss) ๊ณ์ฐ
* Cross์๋ฏธ : Y = 1, Y = 0์ผ ๋ ์๋ก ๊ต์ฐจํ์ฌ ์์ค(loss) ๊ณ์ฐ
- loss : -(Y * log*(y_pred) + (1-Y) * log(1-y_pred))
์ผ์ชฝ ์ : Y * log*(y_pred) -> Y = 1์ผ ๋ ์์ค๊ฐ
์ค๋ฅธ์ชฝ ์ : (1-Y) * log(1-y_pred)) -> Y = 0์ผ ๋ ์์ค๊ฐ
import tensorflow as tf
model_pred = [0.02, 0.98] #model ์์ธก์น
Y = 1 #์ ๋ต
for y_pred in model_pred :
loss_val = -(Y * tf.math.log(y_pred)) #-๋ฃ์์ผ๋ก์จ +๋ก ์ถ๋ ฅ๋๊ฒ๋ (logํจ์ ํธ์ฑ)
print(loss_val.numpy())
'''
3.912023 -> 1 vs 0.02 : ์์ค๊ฐ ์ปค์ง
0.020202687 -> 1 vs 0.98 : ์์ค๊ฐ ์์
'''
Y = 0 #์ ๋ต
for y_pred in model_pred :
loss_val = -((1-Y) * tf.math.log(1-y_pred)) #-๋ฃ์์ผ๋ก์จ +๋ก ์ถ๋ ฅ๋๊ฒ๋ (logํจ์ ํธ์ฑ)
print(loss_val.numpy())
'''
0.020202687 -> 0 vs 0.02 : ์์ค๊ฐ ์์
3.912023 -> 0 vs 0.98 : ์์ค๊ฐ ์ปค์ง
'''
Cross Entropy(Y=1 and Y=0)์ ์ํ ์์ค ๊ณ์ฐ ์
Y = 1 #์ ๋ต (Y=1 and Y=0)
for y_pred in model_pred :
loss_val = -tf.reduce_mean(Y * tf.math.log(y_pred) +(1-Y) * tf.math.log(1-y_pred))
print(loss_val.numpy())
'''
Y = 0์ผ ๋
0.020202687
3.912023
Y = 1์ผ ๋
3.912023
0.020202687
'''
sigmoid classifier
- ์ดํญ๋ถ๋ฅ๊ธฐ
ํ์ฑํจ์ : Sigmoidํจ์ - ์ดํญ๋ถ๋ฅ
์์คํจ์ : Cross Entropy ํจ์ - ์์ค๊ฐ ๋ฐํ
import tensorflow as tf
from sklearn.metrics import accuracy_score #ํ๊ฐ๋๊ตฌ
1. x, y ๊ณต๊ธ data
#x๋ณ์ : [hours, video]
x_data = [[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]] #[6,2]
#y๋ณ์ : binary data (fail or pass)
y_data = [[0], [0], [0], [1], [1], [1]] #์ดํญ๋ถ๋ฅ
2. X, y๋ณ์ ์ ์ : type์ผ์น - float32
X = tf.constant(value=x_data, dtype=tf.float32) #[๊ด์ธก์น, ์
๋ ฅ์]
y = tf.constant(value=y_data, dtype=tf.float32) #[๊ด์ธก์น, ์ถ๋ ฅ์]
3. w, b๋ณ์ ์ ์ : ์ด๊ธฐ๊ฐ(๋์) -> update๋์
w = tf.Variable(tf.random.normal(shape=[2, 1])) #[์
๋ ฅ์, ์ถ๋ ฅ์]
b = tf.Variable(tf.random.normal(shape=[1])) #[์ถ๋ ฅ์]
4. sigmoid(ํ๊ท๋ชจ๋ธ) ํจ์ : y ์์ธก์น ๋ฐํ
def sig_fun(X) :
model = tf.linalg.matmul(X, w) + b #ํ๊ท๋ฐฉ์ ์
y_pred = tf.nn.sigmoid(model) #sigmoid(model)
return y_pred #0~1 ํ๋ฅ ๊ฐ
5. ์์ค/๋น์ฉ ํจ์(loss/cost function) : ์์ค๊ฐ(Cross Entropy) ๋ฐํ
def loss_fn() : # ์ธ์ ์์
y_pred = sig_fun(X) # y ์์ธก์น
#Cross Entropy
loss = -tf.reduce_mean(y*tf.math.log(y_pred) + (1-y)*tf.math.log(1-y_pred))
return loss
6. ์ต์ ํ ๊ฐ์ฒด ์์ฑ
opt = tf.optimizers.Adam(learning_rate=0.5) #ํ์ต๋ฅ
7. ๋ฐ๋ณตํ์ต
for step in range(100) :
opt.minimize(loss=loss_fn, var_list=[w, b])
#10๋ฐฐ์ ๋จ์ ์ถ๋ ฅ
if (step+1) % 10 == 0 :
print('step =', (step+1), ', loss value=',loss_fn().numpy())
8. ์ต์ ํ๋ model ๊ฒ์ฆ
y_pred = sig_fun(X)
print(y_pred.numpy()) #ํ๋ฅ ๊ฐ ์์ธก์น
cut-off=0.5 : T/F -> 1.0/0.0
y_pred = tf.cast(sig_fun(X).numpy() > 0.5, dtype=tf.float32)
y_pred #class ์์ธก์น
model ํ๊ฐ
acc = accuracy_score(y, y_pred)
print('accuracy =',acc) #accuracy = 1.0
sigmoid classifier iris
dataset : iris
ํ์ฑํจ์ : Sigmoidํจ์ - ์ดํญ๋ถ๋ฅ
์์คํจ์ : Cross Entropyํจ์ -> ์์ค๊ฐ
import tensorflow as tf
from sklearn.metrics import accuracy_score, confusion_matrix #model ํ๊ฐ
from sklearn.datasets import load_iris #datase
from sklearn.preprocessing import minmax_scale #X๋ณ์ ์ ๊ทํ
1. [์์ ] x, y ๊ณต๊ธ data
X, y = load_iris(return_X_y=True)
x๋ณ์ : 100๊ฐ ๊ด์ธก์น
x_data = X[:100]
x_data.shape #(100, 4)
x๋ณ์ ์ ๊ทํ(0~1)
x_data = minmax_scale(x_data)
y๋ณ์ : 100๊ฐ ๊ด์ธก์น
y_data = y[:100]
y๋ณ์ : 1d -> 2d
y_data = y_data.reshape(100, 1)
y_data.shape #(100, 1)
2. X, y๋ณ์ ์ ์ : type ์ผ์น - float32
X = tf.constant(value=x_data, dtype=tf.float32) #[๊ด์ธก์น,์
๋ ฅ์]
y = tf.constant(value=y_data, dtype=tf.float32) #[๊ด์ธก์น,์ถ๋ ฅ์]
3. w, b๋ณ์ ์ ์ : ์ด๊ธฐ๊ฐ(๋์) -> update
w = tf.Variable(tf.random.normal(shape=[4, 1])) #[์์ ] : [์
๋ ฅ์,์ถ๋ ฅ์]
b = tf.Variable(tf.random.normal(shape=[1])) #[์ถ๋ ฅ์]
4. sigmoid(ํ๊ท๋ชจ๋ธ) ํจ์ : y ์์ธก์น ๋ฐํ
def sig_fun(X) :
model = tf.linalg.matmul(X, w) + b #ํ๊ท๋ฐฉ์ ์
y_pred = tf.nn.sigmoid(model) #sigmoid(model)
return y_pred #0~1 ํ๋ฅ ๊ฐ
5. ์์ค/๋น์ฉ ํจ์(loss/cost function) : ์์ค๊ฐ(Cross Entropy) ๋ฐํ
def loss_fn() : # ์ธ์ ์์
y_pred = sig_fun(X) #y ์์ธก์น
# Cross Entropy
loss = -tf.reduce_mean(y*tf.math.log(y_pred) + (1-y)*tf.math.log(1-y_pred))
return loss
6. ์ต์ ํ ๊ฐ์ฒด ์์ฑ
opt = tf.optimizers.Adam(learning_rate=0.1) #ํ์ต๋ฅ
7. ๋ฐ๋ณตํ์ต
for step in range(500) :
opt.minimize(loss=loss_fn, var_list=[w, b])
#10๋ฐฐ์ ๋จ์ ์ถ๋ ฅ
if (step+1) % 10 == 0 :
print('step =', (step+1), ', loss value=',loss_fn().numpy())
8. ์ต์ ํ๋ model ๊ฒ์ฆ
y_pred = sig_fun(X)
print(y_pred.numpy()) #ํ๋ฅ ๊ฐ ์์ธก์น
cut-off=0.5 : T/F -> 1.0/0.0
y_pred = tf.cast(sig_fun(X).numpy() > 0.5, dtype=tf.float32)
y_pred #class ์์ธก์น
model ํ๊ฐ
acc = accuracy_score(y, y_pred)
print('accuracy =',acc) #accuracy = 1.0
ํผ๋ํ๋ ฌ
con = confusion_matrix(y, y_pred)
print(con)
softmax classifier
- ๋คํญ๋ถ๋ฅ๊ธฐ
ํ์ฑํจ์ : softmaxํจ์
์์คํจ์ : cross entropyํจ์
y_data : one hot encodig
import tensorflow as tf
from sklearn.metrics import accuracy_score #modelํ๊ฐ
import numpy as np
1. x, y ๊ณต๊ธ data
[ํธ, ๋ ๊ฐ]
x_data = np.array(
[[0, 0], [1, 0], [1, 1], [0, 0], [0, 1], [1, 1]]) #[6, 2] -> ๊ด์ธก์น 6๊ฐ, ์
๋ ฅ๋ณ์ 2๊ฐ
[๊ธฐํ, ํฌ์ ๋ฅ, ์กฐ๋ฅ] : [6, 3]
y_data = np.array([ #one hot encoding
[1, 0, 0], #๊ธฐํ[0] -> ํธ๊ณผ ๋ ๊ฐ๊ฐ ๋ชจ๋ ์์
[0, 1, 0], #ํฌ์ ๋ฅ[1] -> ํธ์ ์๋๋ฐ ๋ ๊ฐ๊ฐ ์์
[0, 0, 1], #์กฐ๋ฅ[2] -> ํธ๊ณผ ๋ ๊ฐ๊ฐ ๋ชจ๋ ์กด์ฌ
[1, 0, 0],
[1, 0, 0],
[0, 0, 1]
]) #y๊ฐ์๊ฐ 3๊ฐ
* one hot encoding VS dummy
๊ณตํต์ : encoding(2์ง์๋ก ๋ณํ)
์ฐจ์ด์ : one-hot์ ๋ณ์size = class์, dummy๋ ๋ณ์size = class-1
x_data.shape #(6, 2) - (๊ด์ธก์น, ์
๋ ฅ์)
y_data.shape #(6, 3) - (๊ด์ธก์น, ์ถ๋ ฅ์)
2. X, y๋ณ์ ์ ์ : type float32๋ก ์ผ์น์ํค๊ธฐ
X = tf.constant(x_data, dtype=tf.float32)
y = tf.constant(y_data, dtype=tf.float32)
3. w, b๋ณ์ ์ ์ : ์ด๊ธฐ๊ฐ(๋์) -> update
w = tf.Variable(tf.random.normal([2, 3])) #[์
๋ ฅ์, ์ถ๋ ฅ์] -> ์ด 6๊ฐ์ w๊ฐ ์์ฑ๋จ
b = tf.Variable(tf.random.normal([3])) #[์ถ๋ ฅ์]
4. softmax(ํ๊ท๋ชจ๋ธ) ํจ์ : y ์์ธก์น ๋ฐํ
def soft_fn(X) :
model = tf.linalg.matmul(X, w) + b #ํ๊ท๋ฐฉ์ ์
y_pred = tf.nn.softmax(model) #softmax(model)
return y_pred #0~1 ํ๋ฅ ๊ฐ
5. ์์ค/๋น์ฉ ํจ์(loss/cost function) : ์์ค๊ฐ(Cross Entropy) ๋ฐํ
def loss_fn() : # ์ธ์ ์์
y_pred = soft_fn(X) #y ์์ธก์น
# Cross Entropy
loss = -tf.reduce_mean(y*tf.math.log(y_pred) + (1-y)*tf.math.log(1-y_pred))
return loss
6. ์ต์ ํ ๊ฐ์ฒด ์์ฑ
opt = tf.optimizers.Adam(learning_rate=0.1) #ํ์ต๋ฅ
7. ๋ฐ๋ณตํ์ต
for step in range(100) :
opt.minimize(loss=loss_fn, var_list=[w, b])
#10๋ฐฐ์ ๋จ์ ์ถ๋ ฅ
if (step+1) % 10 == 0 :
print('step =', (step+1), ', loss value=',loss_fn().numpy())
step = 10 , loss value= 0.2945415
step = 100 , loss value= 0.014622948
8. ์ต์ ํ๋ model ๊ฒ์ฆ
y_pred = soft_fn(X).numpy()
print(y_pred)
[[9.88110900e-01 9.25376546e-03 2.63541052e-03] -> 1๋ฒ ๊ด์ธก์น ์์ธก์น (97%, 0.15%, 0.4%)
[3.77652748e-03 9.63190913e-01 3.30325998e-02]
[1.07707642e-02 1.05104195e-02 9.78718817e-01]
[9.88110900e-01 9.25376546e-03 2.63541052e-03]
[9.73005116e-01 3.48643771e-05 2.69599613e-02]
[1.07707642e-02 1.05104195e-02 9.78718817e-01]] -> 6๋ฒ ๊ด์ธก์น ์์ธก์น
print(y_pred.shape) #(6, 3)
y_pred.sum(axis=1) #ํ ๋จ์ ํฉ๊ณ. 'axis=0' : ์ด ๋จ์
#[1., 1., 1., 1., 1., 1.]
y : one-hot-encoding(2์ง์) vs y_pred : prob
* y, y_pred -> 10์ง์๋ก ๋ณํ (=class ๋ณํ)
y_pred = tf.argmax(y_pred, axis=1) #๊ฐ์ฅ ๋์ ํ๋ฅ ์ ์์ธ์ผ๋ก ๋ฐํ
y_true = tf.argmax(y, axis=1)
acc = accuracy_score(y_true, y_pred)
print('accuracy = ', acc) #accuracy = 1.0 -> 100% ์ผ์น
print(y_pred) #[0 1 2 0 0 2]
print(y_true) #[0 1 2 0 0 2]
softmax classifier iris
- ๋คํญ๋ถ๋ฅ๊ธฐ
dataset : iris
ํ์ฑํจ์ : softmaxํจ์
์์คํจ์ : cross entropyํจ์
y_data : one hot encodig
import tensorflow as tf
from sklearn.datasets import load_iris #datset load
from sklearn.preprocessing import minmax_scale #x๋ณ์ ์ ๊ทํ
from sklearn.preprocessing import OneHotEncoder #y๋ณ์ 2์ง์ ์ธ์ฝ๋ฉ
from sklearn.metrics import accuracy_score #modelํ๊ฐ
1. x, y ๊ณต๊ธ data
X, y = load_iris(return_X_y=True)
y #0~2์ 3๊ฐ์ง ํด๋์ค(๊ฝ์ ์ข
)๋ก ์ด๋ฃจ์ด์ ธ ์์
x_data = X
y_data = y
x_data.shape #(150, 4) - (๊ด์ธก์น, ์
๋ ฅ์)
y_data.shape #(150,) - (๊ด์ธก์น, ์ถ๋ ฅ์)
๋ณ์ ์ ์ฒ๋ฆฌ
x_data = minmax_scale(x_data) #x๋ณ์ ์ ๊ทํ
1d, 10์ง์ -> 2d, 2์ง์
obj = OneHotEncoder()
y_data = obj.fit_transform(y_data.reshape(150, 1)).toarray() #์ธ์ฝ๋ฉ, 2์ฐจ์์ผ๋ก ๋ณ๊ฒฝ, array๋ก ๋ณ๊ฒฝ
print(y_data)
[[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]...
-> class๋ณ๋ก 1(=๊ฝ์ ์ข
)์ ๊ฐ์ด ๋ค๋ฅด๊ฒ ๋ํ๋๋ ๊ฒ์ ๋ณผ ์ ์์
2. X, y๋ณ์ ์ ์ : type float32๋ก ์ผ์น์ํค๊ธฐ
X = tf.constant(x_data, dtype=tf.float32)
y = tf.constant(y_data, dtype=tf.float32)
3. w, b๋ณ์ ์ ์ : ์ด๊ธฐ๊ฐ(๋์) -> update
x_data.shape #(150, 4) : ์
๋ ฅ์ 4๊ฐ
y_data.shape #(150, 3) : ์ถ๋ ฅ์ 3๊ฐ
w = tf.Variable(tf.random.normal([4, 3])) #[์
๋ ฅ์, ์ถ๋ ฅ์]
b = tf.Variable(tf.random.normal([3])) #[์ถ๋ ฅ์]
4. softmax(ํ๊ท๋ชจ๋ธ) ํจ์ : y ์์ธก์น ๋ฐํ
def soft_fn(X) :
model = tf.linalg.matmul(X, w) + b #ํ๊ท๋ฐฉ์ ์
y_pred = tf.nn.softmax(model) #softmax(model)
return y_pred #0~1 ํ๋ฅ ๊ฐ
5. ์์ค/๋น์ฉ ํจ์(loss/cost function) : ์์ค๊ฐ(Cross Entropy) ๋ฐํ
def loss_fn() : # ์ธ์ ์์
y_pred = soft_fn(X) #y ์์ธก์น
# Cross Entropy
loss = -tf.reduce_mean(y*tf.math.log(y_pred) + (1-y)*tf.math.log(1-y_pred))
return loss
6. ์ต์ ํ ๊ฐ์ฒด ์์ฑ
opt = tf.optimizers.Adam(learning_rate=0.1) #learning_rate : ํ์ต๋ฅ
7. ๋ฐ๋ณตํ์ต
for step in range(100) :
opt.minimize(loss=loss_fn, var_list=[w, b])
#10๋ฐฐ์ ๋จ์ ์ถ๋ ฅ
if (step+1) % 10 == 0 :
print('step =', (step+1), ', loss value=',loss_fn().numpy())
step = 10 , loss value= 0.2945415
step = 100 , loss value= 0.014622948
8. ์ต์ ํ๋ model ๊ฒ์ฆ
y_pred = soft_fn(X).numpy()
print(y_pred) : ์์ธกํ ํ๋ฅ ๊ฐ
y : one-hot-encoding(2์ง์) vs y_pred : prob
* y, y_pred -> 10์ง์๋ก ๋ณํ (=class ๋ณํ)
y_pred = tf.argmax(y_pred, axis=1) #๊ฐ์ฅ ๋์ ํ๋ฅ ์ ์์ธ์ผ๋ก ๋ฐํ
y_true = tf.argmax(y, axis=1)
acc = accuracy_score(y_true, y_pred)
print('accuracy = ', acc) #accuracy = 0.96 -> data์ ๋ณต์ก๋๊ฐ ๋์์ง๋ฉด์ ์์ธก๋๊ฐ ๋จ์ด์ก์ง๋ง, ์๋นํ ๋์ ์์ค์ ์์ธก๋ฅ
print(y_pred)
print(y_true)
'๋ฐ์ดํฐ๋ถ์๊ฐ ๊ณผ์ > Tensorflow' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DAY66. Tensorflow Keras model (2)Overfitting solution (0) | 2021.12.23 |
---|---|
DAY65. Tensorflow Keras model (1)dnn model (0) | 2021.12.22 |
DAY63. Tensorflow LinearRegression (3)keras dnn (0) | 2021.12.20 |
DAY62. Tensorflow LinearRegression (2)ํ๊ท๋ชจ๋ธ (0) | 2021.12.17 |
DAY61. Tensorflow LinearRegression (1)function basic (๊ธฐ๋ณธํจ์) (0) | 2021.12.16 |