實驗10-使用keras完成線性迴歸

阿飞藏泪發表於2024-04-27

版本python3.7 tensorflow版本為tensorflow-gpu版本2.6

執行結果:

程式碼:

import numpy as np

np.random.seed(1337)
from keras.models import Sequential
from keras.layers import Dense
from sklearn.metrics import r2_score
import matplotlib.pyplot as plt

# 建立資料集
# 在[-1,1]的區間內等間隔建立200個樣本數
X = np.linspace(-1, 1, 200)
np.random.shuffle(X)  # 將資料集隨機化
# np.random.normal(0, 0.05, (200, ))為輸出服從均值為0,標準方差為0.05的200個正太分佈資料
Y = 0.5 * X + 2 + np.random.normal(0, 0.05, (200,))  # 假設我們真實模型為:Y=0.5X+2
# 繪製資料集plt.scatter(X, Y)
plt.show()

X_train, Y_train = X[:160], Y[:160]  # 把前160個資料放到訓練集
X_test, Y_test = X[160:], Y[160:]  # 把後40個點放到測試集

# 定義一個model,
model = Sequential()  # Keras有兩種型別的模型,序貫模型(Sequential)和函式式模型
# 比較常用的是Sequential,它是單輸入單輸出的
# model.add(Dense(output_dim=1, input_dim=1))
model.add(Dense(units=1, input_shape=(1,)))# 透過add()方法一層層新增模型
# Dense是全連線層,第一層需要定義輸入,
# 第二層無需指定輸入,一般第二層把第一層的輸出作為輸入

# 定義完模型就需要訓練了,不過訓練之前我們需要指定一些訓練引數
# 透過compile()方法選擇損失函式和最佳化器
# 這裡我們用均方誤差作為損失函式,隨機梯度下降作為最佳化方法
model.compile(loss='mse', optimizer='sgd')

# 開始訓練
print('Training -----------')
for step in range(301):
    cost = model.train_on_batch(X_train, Y_train)  # Keras有很多開始訓練的函式,這裡用train_on_batch()
    if step % 100 == 0:
        print('train cost: ', cost)

# 測試訓練好的模型
print('\nTesting ------------')
cost = model.evaluate(X_test, Y_test, batch_size=40)
print('test cost:', cost)
W, b = model.layers[0].get_weights()  # 檢視訓練出的網路引數
# 由於我們網路只有一層,且每次訓練的輸入只有一個,輸出只有一個
# 因此第一層訓練出Y=WX+B這個模型,其中W,b為訓練出的引數
print('Weights=', W, '\nbiases=', b)

# plotting the prediction
Y_pred = model.predict(X_test)
plt.scatter(X_test, Y_test)
plt.plot(X_test, Y_pred)
plt.show()

#使用r2 score評估準確度
pred_acc = r2_score(Y_test, Y_pred)
print('pred_acc',pred_acc)

#儲存模型
model.save('keras_linear.h5')

相關文章