□ 가장 쉽게 배우는 머신러닝 - 1주차
22.03.27(일) ~ 28(월)
임의의 직선 1개로 이 그래프를 비슷하게 표현할 수 있다고 가설을 세움
선형 모델의 가설(Hypothesis) :
손실 함수(Cost or Loss function) :
Training set
머신러닝 모델을 학습시키는 용도로 사용합니다. 전체 데이터셋의 약 80% 정도를 차지합니다.
Validation set
머신러닝 모델의 성능을 검증하고 튜닝하는 지표의 용도로 사용합니다. 이 데이터는 정답 라벨이 있고, 학습 단계에서 사용하기는 하지만, 모델에게 데이터를 직접 보여주지는 않으므로 모델의 성능에 영향을 미치지는 않습니다.
Test set
정답 라벨이 없는 실제 환경에서의 평가 데이터셋입니다. 실제 머신의 성능을 평가
TensorFlow : 기본 머신러닝 프레임워크
Keras: 상위 API (좀 더 사용하기 쉬운) - 앞으로 수업중 사용예정
import tensorflow as tf
# verson 1 사용
tf.compat.v1.disable_eager_execution()
x_data = [[1, 1], [2, 2], [3, 3]]
y_data = [[10], [20], [30]]
# placeholder: X,Y 데이터를 넣어줄 공간
# 데이터의 형태 32비트 소수점 (float32)
# shape=[None,2] // None: 배치 사이즈(딥러닝에서 공부함) / 2: variable 개수
X = tf.compat.v1.placeholder(tf.float32, shape=[None, 2]) # Multi-variable linear regression
Y = tf.compat.v1.placeholder(tf.float32, shape=[None, 1])
# H(x) = W*x + b // W: Weigt / b:bias : Variable로 지정함
# 초기화는 random하게 initialize함
W = tf.Variable(tf.random.normal(shape=(2, 1)), name='W') # W는 (2,1)의 행렬 / name 지정은 크게 상관없음
b = tf.Variable(tf.random.normal(shape=(1,)), name='b') # b는 (1,1)의 행렬
# 가설: 선형회귀(Linear Regrassion) / W*x + b
# matmul : matrix multiplication
hypothesis = tf.matmul(X, W) + b
# cosr function : mean squared error
# tf.square : 행렬의 제곱
# tf.reduce_mean : 산술평균
cost = tf.reduce_mean(tf.square(hypothesis - Y))
# GradientDescentOptimizer : GradientDescentMethod(경사하강법) 사용
# learning_rate : 0.01 // 결과가 안이쁘면 자주 변경해주어야 함
# minimize(cost): cost(편차 제곱의 평균)를 최소화하는 방향으로 간다.
optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)
# TensorFlow에서 Model을 학습시킬때는 Session이 필요함 (모든 변수들과 모든 그래프들을 다 저장하고 있는 저장소)
with tf.compat.v1.Session() as sess:
# 모든 변수들을 초기화하는 명령어
sess.run(tf.compat.v1.global_variables_initializer())
# 반복 학습 실시 (50회)
for step in range(50):
# feeding :데이터 셋을 넣어준다. X,Y: placehodler, x_data, y_data를 넣어줌
# 반환값: cost, weigt, bias를 계산함 // cost가 낮아야 학습이 잘 된 상태
c, W_, b_, _ = sess.run([cost, W, b, optimizer], feed_dict={X: x_data, Y: y_data})
# 각 step에 따라 cost를 출력하는 명령어
print('Step: %2d\t loss: %.2f\t' % (step, c))
print(sess.run(hypothesis, feed_dict={X: [[4, 4]]}))
import numpy as np
from tensorflow.keras.models import Sequential # 모델을 정의함
from tensorflow.keras.layers import Dense # 가설을 구현할 때 사용
from tensorflow.keras.optimizers import Adam, SGD
# Keras는 numpy.array 값을 받음
x_data = np.array([[1], [2], [3]])
y_data = np.array([[10], [20], [30]])
# 모델을 정의 / Sequential(순차적으로 모델을 쌓아나갈 수 있도록 만든 구조)
model = Sequential([
# 출력 1개임을 알림
Dense(1)
])
#모델 compile (모델을 구성함)
#loss function : mean_squared_error 사용 // 수식을 안써도 됨
# optimizer: STG(Stochastic Gradient Descent / 배치 크기가 1인 경사하강법 알고리즘 )
# https://everyday-deeplearning.tistory.com/entry/SGD-Stochastic-Gradient-Descent-%ED%99%95%EB%A5%A0%EC%A0%81-%EA%B2%BD%EC%82%AC%ED%95%98%EA%B0%95%EB%B2%95
model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.1))
# 학습시키는 명령어 fit
# fit: hypothesis 가설의 정답값을 맞춘다. / epochs(에폭) : 반복하는 횟수
model.fit(x_data, y_data, epochs=1000) # epochs 복수형으로 쓰기!
# 예측한 값을 보여줌
y_pred = model.predict([[5]])
print(y_pred)