版本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')