Stochastic Gradient Descent By Tensorflow and Keras Framework

Pattharadet Vachirapuchai
6 min readSep 2, 2020

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

เรามีข้อมูล 96453 แถวและ 12 คอลัมน์

ทำการ 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)

ไปจนถึงรอบ 500

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 สักพักนึงเลย

สำหรับวันนี้บทความก็จบลงเพียงเท่านี้ครับขอบคุณที่มาอ่านกันนะค้าบบ

--

--