1. 程式人生 > 實用技巧 >keras學習(一)

keras學習(一)

  最近在學習keras,主要還是跟著網上大佬們的教程走的,程式碼也是跟著寫的,沒啥自己創新,算是記錄一下吧!第一次學習就是進行一個簡單的擬合,擬合一個一元一次方程吧(數學語言來說):y = 0.5x + 2。先放上程式碼吧!

import keras
import numpy as np 
import matplotlib.pyplot as plt
from keras.models import Sequential #模型這個用的多
from keras.layers import Dense #用到什麼層,就像這個形式匯入

x = np.linspace(-1, 1, 200)
np.random.shuffle(x)  #打亂陣列,指令操作,不是賦值操作,如果在前面加'x='會出錯

ai = np.random.normal(0, 0.05, (200,)) #這種是生成一些正態分佈的資料,均值是0,標準差是0.05
bi = np.linspace(-0.05, 0.05, 200) #這個就是單純的隨機生成,

y = x*0.5 + 2 + ai #根據函式關係式生成y
plt.scatter(x, y)  #scatter顯示散點圖,顯示x與y的關係散點圖
plt.show()

#劃分訓練集和驗證集
x_train, y_train = x[:160], y[:160] #前160訓練
x_test, y_test = x[160:], y[160:] #後160測試

#建立模型
model = Sequential()  #建立模型第一步就是這一個語句,建立一個順序模型
model.add(Dense(units=1, input_dim=1)) #然後慢慢一步一步的往模型裡面加層,這裡直接全連線層,輸入尺寸為1,輸 
                                       #出也是1,一個x對應一個y

model.compile(loss='mse',optimizer='sgd')  #上面是模型的結構搭建好了,接下來是編譯模型,使得他能夠使用

#開始訓練
print("#train--------------------------")
for step in range(601): #訓練601步,如果結果不是很接近0.5和2,可以自己設定多訓練一會
    cost = model.train_on_batch(x_train, y_train) #這個按照官方文件說的就是每次去batch個數據進行訓練,這裡 
                                                  #應該是每次選一個吧,然後返回一個測試誤差的值(或者一些 
                                                  #誤差值的列表,這裡沒有多個評價指標,所以就一個了)
    if step%100==0:
        print("cost%f" % cost) #每一百步輸出一下cost,可以自己設定,輸出500個都沒問題

print("#test---------------------------")
cost = model.evaluate(x_test, y_test, batch_size=40) #這個就是直接取40個測試資料進行預測,我的理解就是通過                                                                              
                                               #模型將輸入的x_test計算出y值,再跟y_test比較,得出誤差值
print("test cost:%f" % cost)
w,b = model.get_weights()  #這個我也不知道該咋說,就是獲得權重和偏置
print("w:%f,b:%f" % (w, b))

y_pred = model.predict(x_test) #顯而易見就是根據x_test獲得預測值
plt.scatter(x_test, y_test) #最後將x_test,y_test的散點圖顯示和預測出y_pred繪製的直線進行對比
# plt.show()
plt.plot(x_test, y_pred)
plt.show()

  程式碼就是上面的了,我也是萌新,大佬看了不要噴,有寫錯的地方希望指正。整體思路就是先得到訓練資料和測試資料,應該也可以匯入,但是通過numpy獲得比較快捷。然後就是搭建模型,編譯模型,再開始訓練,測試,最後看一些結果。為什麼要在y=0.5*x+2後面再加個ai呢(看程式碼),如果不加,那所有的資料點都在一條直線上了,就沒有訓練的目的了,直接根據兩個點就算出來了。然後處理ai是獲得正態分佈的數值,不用bi(程式碼),因為bi差不多是均勻分佈的,雖然是隨機生成的,所以整個資料可以類似看成是一個矩形了,下圖紅色框(我已經儘量把線畫直了:):

  然後訓練可能就會在這個矩形裡面進行,而採用正態分佈就會比這個效果好。最後得到的結果w=0.507225,b=1.999865,圖形如下: