人工智能如此簡單(2)—— 激活函數

1、關於激活函數

如果按照上一篇文章的思路,人工智能是無法模擬曲線方程的,比如拋物線方程,及時加入再多的參數值,也無法達到效果,所以需要引入激活函數。爲了方便這裏介紹一種最爲簡答的函數sigmoid函數,sigmoid函數的原型如下:


這個函數的的曲線圖如下所示:


sigmoid函數從一定程度上反應了二分類的思想,在可以將上圖的曲線,看成一個概率分佈函數,介於0和1之間,可以將0.5作爲閾值進行分類。當然在這裏我們只是用激活函數來將直線方程彎曲。

2、模型中的激活函數

在上面模型中將原來線性結果使用激活函數進行了曲線化處理,可以使用這個模型模擬一個拋物線函數試試效果。

3、準備訓練數據 

假定我們要模擬的曲線是  

可以用之前相同的方法來準備一下訓練數據

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
x = np.random.random(100)*100-50
y = x**2
plt.scatter(x,y)
plt.show()

曲線繪製效果如下


下面加入激活函數直接模擬曲線

# 訓練模型
# 生成測試數據
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
x = np.linspace(-1,1,300)[:,np.newaxis]
y = x**2
W = tf.Variable(.0,name='W',dtype=tf.float32)
b = tf.Variable(.0,name='b',dtype=tf.float32)
predict_y =W*x+b
cost = tf.reduce_mean(tf.square(predict_y-y),name='cost')
train = tf.train.GradientDescentOptimizer(0.1).minimize(cost)
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(500):
        sess.run(train)
        if epoch%50 == 0:
                print("%s epoch, W = %s , b= %s, loss = %s"%(str(epoch),sess.run(W),sess.run(b),sess.run(cost)))
    plt.plot(x,y,'bo',x,sess.run(predict_y),'r--')
    plt.show()    

最後效果如下圖所示:


可以看到並沒有很好的模擬曲線,原因是什麼呢,原因在於兩個特徵W,b是無法模擬出曲線的,可以把曲線看成很多小的線段的疊加,就像小時候畫畫一樣,那麼我們需要對模型增加特徵值採用10個神經元對x1特徵進行提取。被修正的模型如下圖所示


按照上面模型改寫程序

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
import sys
x_rand = np.linspace(-5,5,100)
x = x_rand[:,np.newaxis].astype(np.float32)
y = np.square(x)
W1 = tf.Variable(tf.truncated_normal([1,10],stddev=0.1),name='W1',dtype=tf.float32)
b1 = tf.Variable(tf.zeros([10]),dtype=tf.float32,name='b1')
z1 = tf.add(tf.matmul(x,W1),b1)
a1 = tf.nn.sigmoid(z1)
W2 = tf.Variable(tf.truncated_normal([10,1],stddev=0.1),name='W2',dtype=tf.float32)
b2 = tf.Variable(tf.zeros([1]),dtype=tf.float32,name='b2')
predict_y = tf.add(tf.matmul(a1,W2),b2)
cost = tf.reduce_mean(tf.square(predict_y-y),name='cost')
train = tf.train.GradientDescentOptimizer(0.1).minimize(cost)
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(1000):
        sess.run(train)
    plt.plot(x,y,'bo',x,sess.run(predict_y),'r-')

輸出效果如下圖所示:


這樣我們就可以模擬曲線了,可以做一個推廣不管多複雜的曲線,只要特徵值足夠都可以模擬出來。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章