深度學習筆記(4):使用Keras建立MLP和Linear Regression模型

Yanwei Liu
8 min readFeb 29, 2020

--

Keras支援兩種模型:
Sequential模型:單一輸入單一輸出,一層接著一層,不允許跨層
Functional API:共享神經層(Keras內建的有MLP、CNN、RNN)

MLP模型

https://colab.research.google.com/drive/1RjvgCt_QUPB7CQVTQ7DHL6qzfdfR1EYx

import numpy as npimport pandas as pdfrom keras.models import Sequentialfrom keras.layers import Densenp.random.seed(10)  # 指定亂數種子# 載入糖尿病資料集df = pd.read_csv("./diabetes.csv")dataset = df.valuesnp.random.shuffle(dataset)  # 使用亂數打亂資料# 分割成特徵資料和標籤資料X = dataset[:, 0:8]Y = dataset[:, 8]# 特徵標準化X -= X.mean(axis=0)X /= X.std(axis=0)# 分割訓練和測試資料集X_train, Y_train = X[:690], Y[:690]     # 訓練資料前690筆X_test, Y_test = X[690:], Y[690:]       # 測試資料後78筆# 定義模型model = Sequential()model.add(Dense(8, input_shape=(8,), activation="relu"))model.add(Dense(8, activation="relu"))model.add(Dense(1, activation="sigmoid"))# 編譯模型model.compile(loss="binary_crossentropy", optimizer="adam",metrics=["accuracy"])# 訓練模型model.fit(X_train, Y_train, epochs=10, batch_size=10, verbose=0)# 評估模型loss, accuracy = model.evaluate(X_train, Y_train)print("訓練資料集的準確度 = {:.2f}".format(accuracy))loss, accuracy = model.evaluate(X_test, Y_test)print("測試資料集的準確度 = {:.2f}".format(accuracy))# 測試資料集的預測值Y_pred = model.predict_classes(X_test, batch_size=10, verbose=0)print(Y_pred[0], Y_pred[1])  #第0筆不會得糖尿病、第1筆會得糖尿病

Linear Regression模型

K-fold交叉驗證:將資料集分割成2或多個分隔區,將每一個分隔區都一一作為驗證資料集,其餘的分割去則作為訓練資料集,為最常用的交叉驗證方法。可以讓我們使用資料集的所有樣本資料來訓練模型。

https://colab.research.google.com/drive/1P80VGHo3Z1pYgW_owwo-E3zWNFKHWZxG

#無交叉驗證import numpy as npimport pandas as pdfrom keras.models import Sequentialfrom keras.layers import Densenp.random.seed(7)  # 指定亂數種子# 載入波士頓房屋資料集df = pd.read_csv("./boston_housing.csv")dataset = df.valuesnp.random.shuffle(dataset)  # 使用亂數打亂資料# 分割成特徵資料和標籤資料X = dataset[:, 0:13]Y = dataset[:, 13]# 特徵標準化X -= X.mean(axis=0)X /= X.std(axis=0)# 分割訓練和測試資料集X_train, Y_train = X[:404], Y[:404]     # 訓練資料前404筆X_test, Y_test = X[404:], Y[404:]       # 測試資料後102筆# 定義模型model = Sequential()model.add(Dense(32, input_shape=(X_train.shape[1],), activation="relu"))model.add(Dense(32, activation="relu"))model.add(Dense(1))# 編譯模型model.compile(loss="mse", optimizer="adam",metrics=["mae"])# 訓練模型model.fit(X_train, Y_train, epochs=80, batch_size=16, verbose=0)# 使用測試資料評估模型mse, mae = model.evaluate(X_test, Y_test)print("MSE_test: ", mse)print("MAE_test: ", mae)
#交叉驗證import numpy as npimport pandas as pdfrom keras.models import Sequentialfrom keras.layers import Densenp.random.seed(7)  # 指定亂數種子# 載入波士頓房屋資料集df = pd.read_csv("./boston_housing.csv")dataset = df.valuesnp.random.shuffle(dataset)  # 使用亂數打亂資料# 分割成特徵資料和標籤資料X = dataset[:, 0:13]Y = dataset[:, 13]# 特徵標準化X -= X.mean(axis=0)X /= X.std(axis=0)# 分割訓練和測試資料集X_train, Y_train = X[:404], Y[:404]     # 訓練資料前404筆X_test, Y_test = X[404:], Y[404:]       # 測試資料後102筆# 定義模型def build_deep_model():model = Sequential()model.add(Dense(32, input_shape=(X_train.shape[1],), activation="relu"))model.add(Dense(16, activation="relu"))model.add(Dense(1))# 編譯模型model.compile(loss="mse", optimizer="adam",metrics=["mae"])return modelk = 4nb_val_samples = len(X_train) // knb_epochs = 80mse_scores = []mae_scores = []for i in range(k):print("Processing Fold #" + str(i))# 取出驗證資料集X_val = X_train[i*nb_val_samples: (i+1)*nb_val_samples]Y_val = Y_train[i*nb_val_samples: (i+1)*nb_val_samples]# 結合出訓練資料集X_train_p = np.concatenate([X_train[:i*nb_val_samples],X_train[(i+1)*nb_val_samples:]], axis=0)Y_train_p = np.concatenate([Y_train[:i*nb_val_samples],Y_train[(i+1)*nb_val_samples:]], axis=0)model = build_deep_model()# 訓練模型model.fit(X_train_p, Y_train_p, epochs=nb_epochs,batch_size=16, verbose=0)# 評估模型mse, mae = model.evaluate(X_val, Y_val)mse_scores.append(mse)mae_scores.append(mae)print("MSE_val: ", np.mean(mse_scores))print("MAE_val: ", np.mean(mae_scores))# 使用測試資料評估模型mse, mae = model.evaluate(X_test, Y_test)print("MSE_test: ", mse)print("MAE_test: ", mae)

--

--

Responses (2)