keras學習(一)
阿新 • • 發佈:2020-07-29
最近在學習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,圖形如下: