#目的:讀入鳶尾花資料集,建立神經網絡模型,並輸入結構與權重檔案 #1.載入tensorflow(含keras)等函數庫 import numpy as np import pandas as pd import tensorflow as tf #在colaboratory的python讀入自己的個人電腦硬碟裡的iris_data.csv ####################################上傳iris_data.csv from google.colab import files uploaded = files.upload() for fn in uploaded.keys(): print('User uploaded file "{name}" with length {length} bytes'.format( name=fn, length=len(uploaded[fn]))) # 確認iris_data.csv是否已上載 !ls *.* -l ########################## #2.指定亂數種子參數=7(可自行指定不同的參數種子值) #目的:讓每次的執行結果,可以在相同亂數起始值下,進行比較 np.random.seed(7) #3.把csv檔案讀入成dataframe結構資料(use Pandas to read iris_data.csv) df = pd.read_csv("./iris_data.csv") #target:是第5個欄位的欄位名稱,原本csv的值是文字(例如:setosa) #所以,要把文字,轉換成數字(0,1,2) #方法:使用map()函數 target_mapping = {"setosa": 0, "versicolor": 1, "virginica": 2} df["target"] = df["target"].map(target_mapping) #Y = df["target"].map(target_mapping) #5.df.values指令,可以把dataframe轉成Numpy陣列資料(dataset) dataset = df.values #7.將資料分割成輸入的訓練資料X,和標籤資料Y #特徵資料集 = X = 前4個欄位(0~3) = 訓練資料用(並轉成float資料) #標籤資料集 = Y = 第5個欄位(4) = 目標值 X = dataset[:,0:4].astype(float) #8.特徵標準化 X -= X.mean(axis=0) X /= X.std(axis=0) #6.函數random.shuffle(dataset),可以把dataset陣列,打亂資料次序,成隨機次序(使用亂數打亂資料) np.random.shuffle(dataset) # One-hot編碼 #二元/多元分類問題(多個輸出向量),則其輸出向量的標籤,必須先進行one-hot編碼,才能與softmax計算的預測向量(機率向量),進行損失函數的計算 #from tensorflow.keras.utils import to_categorical #標籤資料集 = Y = 第5個欄位(4) = 目標值 #Y = tf.keras.utils.to_categorical(Y) Y = tf.keras.utils.to_categorical(dataset[:,4]) # 分割成訓練和測試資料集 X_train, Y_train = X[:120], Y[:120] # 訓練資料前120筆 X_test, Y_test = X[120:], Y[120:] # 測試資料後30筆 #9.定義模型(加入三層網絡) #(1)隱藏層: #在隱藏層的激勵函數:最常使用『ReLU函數』 #(2)輸出層: #在輸出層的激勵函數:最常使用『sigmoid函數,tanh函數,softmax函數』 #二元分類問題(單一輸出向量):使用『sigmoid函數,tanh函數』 #多元分類問題(多個輸出向量):使用『softmax函數』 model = tf.keras.models.Sequential() model.add(tf.keras.layers.Dense(6, input_shape=(4,), activation="relu")) model.add(tf.keras.layers.Dense(6, activation="relu")) model.add(tf.keras.layers.Dense(3, activation="softmax")) #10.顯示神經網絡模型的摘要資訊 model.summary() #11.編譯模型 #目的:把上面keras建立好的四層神經網絡,編譯成低階的tensorflow計算圖 #(1)損失函數loss: #☎分類問題:使用『交叉熵函數,Cross Entropy (categorical_crossentropy)函數』 #☎迴歸問題:使用『均方誤差函數,mean square error(mean_squared_error)』 #(2)優化函數(Optimizer):如果數據是稀疏的,,Adam 是最好的選擇。 #(3)評價標準(metrics=["..."]): #☎迴歸問題:通常使用Mean Absolute Error(MAE),例如:metrics=["mae"], #☎分類問題:通常使用accuracy,例如:metrics=["accuracy"] model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]) #12.訓練模型 model.fit(X_train, Y_train, epochs=100, batch_size=5) #13.評估模型的效能 print("\nTesting ...") loss, accuracy = model.evaluate(X_test, Y_test, verbose=0) print("準確度 = {:.2f}".format(accuracy)) # 儲存Keras模型 print("Saving Model: iris.h5 ...") model.save("iris.h5")