### ex2-1 ### # Google Colaboratory 首頁 https://colab.research.google.com/ ### ex2-2 ### >>> print("Hello Python!") ### ex2-3 ### # 上傳與解壓縮 ex2-2.zip,並執行 Python 程式 ex2-2.py >>> !unzip /content/ex2-2.zip >>> !python3 /content/ex2-2.py ### ex2-4 ### # 匯入 Keras 的序列式模型類別 >>> from tensorflow.keras.models import Sequential # 匯入 Keras 的密集層類別 >>> from tensorflow.keras.layers import Dense # 建立神經網路 >>> model = Sequential() # 建立序列模型物件,並指定給 model 變數,這時的model 就是一個神經網路了,但內容是空 # 加入第一層 >>> model.add(Dense(4, activation='relu', input_shape= (4, ))) # 輸入層形狀 # 加入第二層 >>> model.add(Dense(3, activation='relu')) # 除第一層之外都不用指定 input_shape 參數 # 加入第三層 >>> model.add(Dense(1)) # 再加入一個密集層, 只有 1 個神經元, 並且不使用激活函數 # 顯示當前模型架構及參數 >>> model.summary() ### ex2-5 ### # 匯入「房屋txt檔」和 「第三方函式庫」到 Colab from google.colab import files uploaded = files.upload() # 匯入房屋 (.txt 檔) uploaded = files.upload() # 匯入 keras_lite_convertor 第三方函式庫 ### ex2-6 ### # 讀取 house.txt 檔案, 並得出特徵和標籤 import keras_lite_convertor as kc path_name = 'house.txt' # 檔案路徑 Data_reader = kc.Data_reader(path_name, mode='regression') # 指定讀檔模式 (regression 適用於迴歸預測) data, label = Data_reader.read(random_seed = 12) # 將檔案讀到的 5 種資料分為「特徵」和「標籤」,並設定亂數種子為 12 ### ex2-7 ### >>> string = "52python" # 字串容器:由字元組成 >>> string[2] # 以字串的索引方式取值,結果為字串 'p' >>> tuple = (1, (2, ), 3) # tuple 容器:由資料物件組成 >>> tuple[1] # 以 tuple 的索引方式取值,結果為 tuple (2, ) >>> list = [1, [2], 3] # 串列容器:由資料物件組成 >>> list[1] # 以串列的索引方式取值,結果為串列 [2] >>> set = {1, '2', 3} # 集合容器:由資料物件組成 # 集合為無序,沒有索引 >>> dick = {'A':1, 'B':'2', 'C':3} # 字典容器:由資料物件組成,以鍵:值表示 >>> dick['B'] ### ex2-8 ### import numpy as np a = np.array([10, 2, 45, 32, 24]) >>> len(a) # len() 會回傳容器內元素的數量 >>> a[2:4] # 索引取值 (位置 2 ~ 3) >>> a[:4] # 索引取值 (位置 0 ~ 3) ### ex2-9 ### # 資料預處理 # 取資料中的 90% 當作訓練集 split_num = int(len(data) * 0.9) train_data = data[:split_num] # 訓練用資料 (689 * 0.9 = 620 筆) train_label = label[:split_num] # 訓練用標籤 (689 * 0.9 = 620 筆) # 正規化 mean = train_data.mean() # 訓練資料的平均數 data -= mean # data 減掉平均值 std = train_data.std() # 訓練資料的標準差 data /= std # data 除以平均值 new_label = label/max(label) # 將 label 範圍落在 0 ~ 1 (label 正規化) ### ex2-10 ### # 訓練集、驗證集、測試集的資料形狀 # 訓練集 train_data = data[:split_num] # 訓練用資料 print(train_data.shape) train_label = new_label[:split_num] # 訓練用標籤 # 驗證集 validation_data = data[split_num:-30] # 驗證用資料 print(validation_data.shape) validation_label = new_label[split_num:-30] # 驗證用標籤 # 測試集 test_data = data[-30:] # 測試用資料,30筆 print(test_data.shape) test_label = new_label[-30:] # 測試用標籤 ### ex2-11 ### # 建立神經網路架構 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense model = Sequential() # 建構網路模型 model.add(Dense(20, activation = 'relu', input_shape = (4,))) # 增加一層神經層,使用 ReLU 激活函數,輸入層有4個輸入特徵 model.add(Dense(20, activation = 'relu')) # 增加一層神經層,使用 ReLU 激活函數 model.add(Dense(1)) # 增加輸出為 1 的輸出層 ### ex2-12 ### # 編譯及訓練模型 # 編譯模型 model.compile(optimizer = 'adam', loss = 'mse', metrics = ['mae']) history = model.fit(train_data, train_label, # 訓練集 validation_data = (validation_data, validation_label), # 驗證集 epochs = 200) # 訓練週期 ### ex2-13 ### # 查看損失值 import matplotlib.pyplot as plt plt.plot(history.history['loss'], "r", label = 'loss') # 訓練資料的損失值 plt.plot(history.history['val_loss'], "b", label = 'val loss') # 驗證資料的損失值 plt.legend() # 顯示標籤 plt.show() # 顯示圖片 ### ex2-14 ### # 資料比較圖 import numpy as np plt.figure(figsize = (10,8)) # 定義一個視窗 (10,8 為視窗大小) plt.subplots_adjust(hspace = 0.3) # 調整兩張圖的間距 error = test_label.reshape(30, 1) * max(label) - model.predict(test_data) * max(label) # 實際值 - 預測值 ( * max(label) 表示恢復原始值) step = (max(error) - min(error)) / 15 # 把誤差分成 15 等份, 求出每一等份的長度 interval = [i for i in range(int(min(error)), int(max(error))+int(step), int(step))] # 寫出每一等份的值 # 實際預測比較圖 width = 0.3 plt.subplot(2, 1, 1) # 第一張圖位於視窗裡的位置 (2列1行的第二個位置 - 上) plt.xlabel("test data") # x 軸名稱 plt.ylabel("money") # y 軸名稱 plt.bar(np.linspace(1, 30, 30) - width/2, (test_label * max(label)).reshape(30), width = width, label='actual') # 實際值 plt.bar(np.linspace(1, 30, 30) + width/2, (model.predict(test_data) * max(label)).reshape(30), width = width, label = 'predict') # 預測值 plt.legend() # 誤差分布圖 plt.subplot(2, 1, 2) # 第二張圖位於視窗裡的位置 (2列1行的第二個位置 - 下) plt.xlabel("error") # x軸名稱 plt.ylabel("quantity") # y軸名稱 plt.hist(error, interval, linewidth=1, edgecolor = 'black') # 顯示 plt.show() # 將圖片顯示出來 ### ex2-15 ### # 建立欲預測的資料 data = np.array([[10, 6, 1, 0], [10, 7, 1, 0], [12, 5, 1, 1], [7, -1, 0, 1]]) # 資料正規化與預測資料 data = data - mean # data 減掉平均數 data = data/std # data 除以標準差 tem = model.predict(data) # 得出預測值 tem = tem * max(label) # 還原標籤資料 print(tem) # 顯示標籤資料