咱們以前提出了三個經典的問題,他們分別是:python
咱們解決了前兩個問題,今天咱們解決第三個問題,迴歸問題。網絡
無論是二分類問題仍是多分類問題,歸結起來都是分類問題,而回歸問題不同,他是一種迴歸問題,迴歸問題的訓練結果不是離散的狀況,而是連續的狀況,例如預測明天的氣溫、整年降水量等。app
這裏咱們引入的依舊是 Keras 內置的實際問題和數據集:預測波斯頓的房價。針對波士頓的不一樣房屋,咱們給出對每一個房屋咱們給出十三個數據指標,包括房間數、犯罪率和高速公路可達性等,他們的取值範圍不一致,0-一、1-12 或 1-100 等,訓練的目標是一個連續的值——房屋的價格。具體的步驟以下分別說明:函數
從數據集中讀取數據咱們已經很熟悉了,可是咱們觀察數據會發現,這些數據的取值範圍差異太大了,這會致使網絡訓練過程的失真,所以比較好的辦法是咱們先對數據進行預處理,預處理的方法是:(原數據 - 平均值) / 標準差,這就至關於對數據進行標準化,標準化後的數據平均值爲 0,標準差爲 1。mean 和 std 方法分別是求平均值和計算標準差。測試
由於咱們這一次的數據量只有五百多個,所以咱們採用較小的網絡,兩個隱藏層。這裏咱們須要注意的一點是數據量少,訓練容易產生過擬合,小型網絡更適合。ui
修改後的訓練網絡是一個能夠接受的網絡,咱們在測試集上進行驗證,總體基本能夠達到要求。lua
到此,咱們已經分別討論文章開始提到的三個問題(包括前兩篇文章),二分類問題、多分類問題和迴歸問題,這其中咱們也遇到和解決了一些問題,下面總結以下:code
神經網絡對數據的處理大多都須要轉化爲對數字的處理,所以對於文本等內容須要進行預處理;blog
對於數據集的大小、特徵的多少和特徵值之間的差異等,考慮數據網絡的大小,層數、數據的標準化和訓練的迭代次數,此類問題每每也須要畫圖去觀察和判斷,最後須要根據調整的參數最終獲得比較合適的網絡模型;get
訓練迭代次數不夠和過擬合都是常常遇到的問題,都是不夠好的訓練網絡,實際問題中須要對兩種狀況都進行評估和調整;
損失函數和反饋函數的選取,須要考慮實際問題,根據數據的要求,進行選擇;
接下來的文章,將進一步針對上面提到的這些問題進行更加系統的分析和研究。
#!/usr/bin/env python3 import time import numpy as np from keras import layers from keras import models from keras.datasets import boston_housing def housing(): global train_data (train_data, train_targets), (test_data, test_targets) = boston_housing.load_data() # (404, 13) # print(train_data.shape) # (102, 13) # print(test_data.shape) # [15.2 42.3 50. 21.1 17.7 18.5 11.3 ... 19.4 19.4 29.1] # print(train_targets) # 平均值 mean = train_data.mean(axis=0) train_data -= mean # 標準差 std = train_data.std(axis=0) train_data /= std test_data -= mean test_data /= std k = 4 num_val_samples = len(train_data) // k num_epochs = 500 all_mae_histories = [] for i in range(k): print('processing fold #', i) val_data = train_data[i * num_val_samples: (i + 1) * num_val_samples] val_targets = train_targets[i * num_val_samples: (i + 1) * num_val_samples] partial_train_data = np.concatenate( [train_data[:i * num_val_samples], train_data[(i + 1) * num_val_samples:]], axis=0) partial_train_targets = np.concatenate( [train_targets[:i * num_val_samples], train_targets[(i + 1) * num_val_samples:]], axis=0) model = build_model() model.fit(train_data, train_targets, epochs=80, batch_size=16, verbose=0) test_mse_score, test_mae_score = model.evaluate(test_data, test_targets) # history = model.fit(partial_train_data, partial_train_targets, # validation_data=(val_data, val_targets), # epochs=num_epochs, batch_size=1, verbose=0) # mae_history = history.history['val_mean_absolute_error'] # all_mae_histories.append(mae_history) # average_mae_history = [ # np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)] # # plt.plot(range(1, len(average_mae_history) + 1), average_mae_history) # plt.xlabel('Epochs') # plt.ylabel('Validation MAE') # plt.show() # # smooth_mae_history = smooth_curve(average_mae_history[10:]) # plt.plot(range(1, len(smooth_mae_history) + 1), smooth_mae_history) # plt.xlabel('Epochs') # plt.ylabel('Validation MAE') # plt.show() def build_model(): model = models.Sequential() model.add(layers.Dense(64, activation='relu', input_shape=(train_data.shape[1],))) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(1)) model.compile(optimizer='rmsprop', loss='mse', metrics=['mae']) return model def smooth_curve(points, factor=0.9): smoothed_points = [] for point in points: if smoothed_points: previous = smoothed_points[-1] smoothed_points.append(previous * factor + point * (1 - factor)) else: smoothed_points.append(point) return smoothed_points def smooth_curve(points, factor=0.9): smoothed_points = [] for point in points: if smoothed_points: previous = smoothed_points[-1] smoothed_points.append(previous * factor + point * (1 - factor)) else: smoothed_points.append(point) return smoothed_points if __name__ == "__main__": time_start = time.time() housing() time_end = time.time() print('Time Used: ', time_end - time_start)