Stochastic Gradient Descent By Tensorflow and Keras Framework
Gradient Descent คืออะไร
หากเราเปรียบเทียบ Gradient Descent กับการปีนเขา ให้ลองนึกดูว่า เรากำลังยืนอยู่บนยอดเขา แล้วต้องการจะลงไปที่บ่อน้ำที่อยู่ในจุดต่ำที่สุดของเขา แต่เรามองไม่เห็นว่าไอบ่อน้ำเนี่ย มันต้องเดินไปทางไหน มันอยู่ตรงไหนจากจุดที่เรายืนอยู่ หนำซ้ำความไม่เท่ากันของสันเขาที่บดบังการมองเห็น ทำให้เรามองไม่เห็นว่าไปทางไหนถึงจะลงไปถึงจุดต่ำสุดได้ สิ่งที่เราจะทำได้ก็คือ มองไปรอบ ๆ แล้ว พิจารณาหาจุดต่ำสุดเท่าที่เห็น แล้วเลือกเดินไปทางนั้นเรื่อย ๆ จนถึงบ่อน้ำในที่สุด
หากเรามองเป็นภาพสามมิติ ก็จะเป็นเหมือนกราฟด้านล่างนี้
เราจะมาดูการทำ Stochastic Gradient Descent ทั้ง 2 วิธี คือ
1.Tensorflow
2. Keras Framework
มาเริ่มกันเลยครับขั้นแรกก็ต้อง import library ที่จำเป็นมาก่อน
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as seabornInstance
from sklearn.model_selection import train_test_split
from sklearn import metrics
%matplotlib inline
def configure_plotly_browser_state():
import IPython
display(IPython.core.display.HTML(‘’’
<script src=”/static/components/requirejs/require.js”>
</script>
<script>
requirejs.config({
paths: {
base: ‘/static/base’,
plotly: ‘https://cdn.plot.ly/plotly-1.5.1.min.js?
noext’,},});
</script>’’’))
กำหนด seed และ Epoch ที่ใช้ในการ Train
เรียก Dataset มาใช้
dataset = pd.read_csv(“/content/weatherHistory.csv”)
dataset.shape
ทำการ Plot เพื่อดูลักษณะของข้อมูล
dataset.plot(x=’Apparent Temperature ©’, y=’Temperature ©’, style=’o’)
plt.title(‘Apparent Temperature vs Temperature’)
plt.xlabel(‘Apparent Temperature’)
plt.ylabel(‘Temperature’)
plt.show()
มาดูการกระจาย
plt.figure(figsize=(15,10))
plt.tight_layout()
seabornInstance.distplot(dataset[‘Temperature ©’])
แยก Dataset เป็นตัวแปร
X = dataset[‘Apparent Temperature ©’].values.reshape(-1,1)
y = dataset[‘Temperature ©’].values.reshape(-1,1)
X.shape
แบ่งข้อมูลออกเป็น 2 ชุด สำหรับ Train 80% และ Test 20%
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle= True)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
นิยาม Loss Function เป็นแบบ Mean Squared Error
กำหนด Optimizer และ Learning Rate
optimizer = tf.train.GradientDescentOptimizer(0.0001)
train = optimizer.minimize(loss)
เคลียร์ Tensorflow Variable
init = tf.global_variables_initializer()
เคลียร์ค่า Variable
sess = tf.Session()
sess.run(init)
Train Model
his=[]
wb = []
for step in range(Epoch):
sess.run(train)
his.append(sess.run(loss))
print(step, sess.run(W), sess.run(b), sess.run(loss))
wb.append([sess.run(W)[0], sess.run(b)[0], sess.run(loss)])
สร้าง Linear Regression Model
M = sess.run(W)
C = sess.run(b)
Predict
def predict(X, M, C):
y = M*X+C
return y[0]
แปลง Loss Value List เป็น DataFrame
df = pd.DataFrame(his, columns=[‘loss’])
Plot loss
import plotly
from plotly.offline import iplot
import plotly.graph_objs as go
configure_plotly_browser_state()
plotly.offline.init_notebook_mode(connected=True)
h1 = go.Scatter(y=df[‘loss’],
mode=”lines”, line=dict(
width=2,
color=’blue’),
name=”loss”)
data = [h1]
layout1 = go.Layout(title=’Loss’,
xaxis=dict(title=’epochs’),
yaxis=dict(title=’’))
fig1 = go.Figure(data, layout=layout1)
plotly.offline.iplot(fig1)
Predict
df = pd.DataFrame({‘Actual’: y_test, ‘Predicted’: y_pred})
df.head(10)
Plot กราฟเปรียบเทียบ
df1 = df.head(25)
df1.plot(kind=’bar’,figsize=(16,10))
plt.grid(which=’major’, linestyle=’-’, linewidth=’0.5', color=’green’)
plt.grid(which=’minor’, linestyle=’:’, linewidth=’0.5', color=’black’)
plt.show()
ดู Model ที่สร้างจากการ Train ใน Epoch แต่ละรอบ โดยดู Epoch ที่ 1,5,10 และ 500
y_pred = [predict(i, M[0], C[0]) for i in X_test]
plt.scatter(X_test, y_test, color=’green’)
plt.plot(X_test, y_pred, color=’red’, linewidth=2)
plt.show()
จะดูรอบที่เท่าไหร่ให้เปลี่ยนเลขในอาเรย์แล้ว -1 เอาเช่นรอบที่ 1 ก็ 1–1 ให้ใส่ 0 ในอาเรย์รอบที่ 5 ก็ 5–1 ให้ใส่ 4 ในอาเรย์
Loss Value เทียบกับค่า Weight
plt.scatter(M, L, color=’red’)
plt.savefig(‘weight.jpeg’, dpi=300)
plt.show()
Loss Value เทียบกับค่า Bias
plt.scatter(C, L, color=’green’)
plt.savefig(‘bias.jpeg’, dpi=300)
plt.show()
Loss Value เทียบกับค่า Weight และ Bias
configure_plotly_browser_state()
import plotly.express as px
configure_plotly_browser_state()
df = pd.DataFrame({‘W’: M, ‘Bias’: C, ‘Loss’: L})
fig = px.scatter_3d(df, x=’W’, y=’Bias’, z=’Loss’)
fig.show()
ดูประสิทธิภาพของ Model
print(‘Mean Absolute Error:’, metrics.mean_absolute_error(y_test, y_pred))
print(‘Mean Squared Error:’, metrics.mean_squared_error(y_test, y_pred))
print(‘Root Mean Squared Error:’, np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
- Keras -
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense
from keras import backend as K
import plotly
from plotly.offline import iplot
import plotly.graph_objs as go
Root Mean Squared Error
def rmse(y_true, y_pred):
return K.sqrt(K.mean(K.square(y_pred — y_true), axis=-1))
นิยาม Model
model = Sequential()
model.add(Dense(1, input_dim=1, kernel_initializer=’random_uniform’, activation=’linear’))
model.summary()
Compile Model
model.compile(loss=’mse’, optimizer=’adam’, metrics=[‘mae’, ‘mse’, rmse])
Train Model
history = model.fit(X_train, y_train, epochs=Epoch, batch_size=64, verbose=1, validation_split=0.2, shuffle=True)
Plot Loss และ Validate Loss
configure_plotly_browser_state()
h2 = go.Scatter(y=history.history[‘loss’],
mode=”lines”, line=dict(
width=2,
color=’blue’),
name=”loss”)
h3 = go.Scatter(y=history.history[‘val_loss’],
mode=”lines”, line=dict(
width=2,
color=’green’),
name=”val_loss”)
data = [h2, h3]
layout1 = go.Layout(title=’Loss’,
xaxis=dict(title=’epochs’),
yaxis=dict(title=’’))
fig1 = go.Figure(data, layout=layout1)
plotly.offline.iplot(fig1)
Predict
y_pred = model.predict(X_test)
แปลงเป็น DataFrame
y_pred = y_pred.flatten()
df = pd.DataFrame({‘Actual’: y_test, ‘Predicted’: y_pred})
df.head(10)
Plot กราฟเปรียบเทียบผลการทำนายกับค่าจริง
df1 = df.head(25)
df1.plot(kind=’bar’,figsize=(16,10))
plt.grid(which=’major’, linestyle=’-’, linewidth=’0.5', color=’green’)
plt.grid(which=’minor’, linestyle=’:’, linewidth=’0.5', color=’black’)
plt.show()
Plot จาก model ที่ Train 500 รอบ
plt.scatter(X_test, y_test, color=’green’)
plt.plot(X_test, y_pred, color=’red’, linewidth=2)
plt.savefig(‘keras_500_model.jpeg’, dpi=300)
plt.show()
มาดูประสิทธิภาพของ Model
print(‘Mean Absolute Error:’, metrics.mean_absolute_error(y_test, y_pred))
print(‘Mean Squared Error:’, metrics.mean_squared_error(y_test, y_pred))
print(‘Root Mean Squared Error:’, np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
สรุป
kelas น่าใช้กว่า เพราะมีค่า Mean Absolute error ที่น้อยกว่าแต่ใช้เวลาในการทำงานนานกว่า tensorfow สักพักนึงเลย
สำหรับวันนี้บทความก็จบลงเพียงเท่านี้ครับขอบคุณที่มาอ่านกันนะค้าบบ