chp8. keras簡介
目錄
1.keras簡介
2.Keras的神經網路訓練步驟
3.Keras每一步驟的指令與程式碼
4.keras提供三種快速搭建網路的方式
5.Sequential model
6.Functional API model
7.Model Subclassing
8.keras損失函數(Loss Function)的種類
9.Keras 激勵函數(Activation Function)的種類
10.Keras 優化函數(Optimizer)的種類
1
1.keras簡介
(1)Keras是一個開放原始碼,高階深度學習程式庫,使用Python編寫,能夠運行在TensorFlow或Theano之上。其主要作者維護者是Google工程師FrançoisChollet,以MIT開放原始碼授權。
以上內容節錄自這本書:TensorFlow+Keras深度學習人工智慧實務應用
2
1.Keras 是一個用來降低機器學習程式設計門檻的專案,Keras 也整合許多符合商業和研究需求的高階API。透過這些API只需要幾行程式碼就能建構和執行非常複雜的神經網路
2.Keras的神經網路訓練步驟
Step 1:準備訓練資料:
將資料分為訓練資料和預期輸出的標記答案
Step 2:搭建神經網路模型:
用來預測數值
Step 3:計算損失函數:
計算模型預測與答案之間的誤差
Step 4:設定優化器:
決定學習過程如何進行,常見分法有SGD、Adam、RMSprop等
Step 5:準備驗證資料和測試資料:
讓網路模型做預測,並透過指標函數來評估模型的好壞
3.Keras每一步驟的指令與程式碼:
(0)類神經網路(Neural Network)的處理流程與步驟: ☎三種快速搭建網路方式的示意圖:
(1)步驟1:建立模型(Model):
☎內容:用keras的model.add()函數,來設定類神經有幾層?設定每一層的神經元數目(units=10),以及激勵函數(activation='relu')
☎程式碼:
# 建立簡單的線性執行的模型
model = Sequential()
# Add Input layer, 隱藏層(hidden layer) 有 256個輸出變數
model.add(Dense(units=256, input_dim=784, kernel_initializer='normal', activation='relu'))
# Add output layer
model.add(Dense(units=10, kernel_initializer='normal', activation='softmax'))
(2)步驟2:確立求解的目標函數,設定求解方法:
☎內容:用keras的model.compile()函數,來定義:A.損失函數(loss)、B.優化函數(optimizer),C.成效衡量指標(mertrics)
☎程式碼:
# 編譯: 選擇損失函數、優化方法及成效衡量方式
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
(3)步驟3:用建立的模型來『訓練』已經存在的數據:
☎內容:以model.fit()函數進行訓練,必須先指定訓練的樣本資料(x, y)來源,並撥一部分資料作驗證(validation_split=0.2),還要設定訓練幾個週期(epochs=10)、訓練資料的抽樣方式。
☎程式碼:
# 進行訓練, 訓練過程會存在 train_history 變數中
train_history = model.fit(x=x_Train_norm, y=y_TrainOneHot, validation_split=0.2, epochs=10, batch_size=800, verbose=2)
(4)步驟4:『評估(Evaluation)』該模型的成效
☎內容:該模型經過訓練完後,用model.evaluate()函數,來計算成效分數,以評估模型好壞。
☎程式碼:
# 顯示訓練成果(分數)
scores = model.evaluate(x_Test_norm, y_TestOneHot)
(5)步驟5:『預測(Prediction)』新數據
☎內容::經過反覆訓練,有了可信模型後,就可以由新數據的x值,來預測對應的y值。
☎程式碼:
# 預測(prediction)
predictions = model.predict_classes(X)
(參考來源文章)
4.Keras的模型結構有三種方法
Keras提供三種快速搭建網路的方式:
(1)Sequential model:一層層順序執行的簡單模型,只有第一層要寫input的規格,其他層的input就是上一層的output。
(2)Functional API model:可以有多個 input 層或 output 層,結構可以有分叉,適合複雜的模型建立。
(3)Model Subclassing model:你可以透過建立一個類別來搭建一個神經網路的模板。類似PyTorch的寫法。在類別內有兩個函式,第一個是初始化的__init__類似建構子,它的功用是在呼叫類別時會幫你做變數的初始化。因此我們可以在這個函式內先設定好輸入層、隱藏藏以及輸出層。第二個函式是call這個函式是執行神經網路中的前饋(feedforward),也就是說資料會從輸入層流入隱藏層最後再流出輸出層完成一次的神經網路運算。
☎三種快速搭建網路方式的示意圖:
☎三種寫法各有優缺點使用時機也大不同,可以依據需求適當的利用上述三種建模方式。
(1)Sequential:寫法簡單明瞭適合初學者快速地搭建神經網路(Directed graph)。
(2)Functional:有技巧性的將網路包成一個函式且支援多個輸入與輸出,並且在神經網路傳遞過程中能夠動態的掌握資料流(Directed acyclic graph)。
(3)Subclassing:寫法屬於更進階,如果要包裝成產品或是自定義神經網路演算法時就建議使用這種方法
5.Sequential Model
一,Sequential mode 搭建方法簡單快速,並且可以解決大多簡單的問題,例如:手寫字辨識,房價預測或評論分類,基本上只要是回歸問題或是分類問題,都可以用sequential mode來解決,但建立有一個限制就是必須逐層搭建網路,而且網路模型必須是single input and output。
二.Sequential API:
(1)這個寫法 Keras 的用戶應該最為熟悉,我們一層一層有序的(Sequential)搭建神經網路架構。每一層你可以使用 Dense 並設定神經元個數以及 Activation 激發函數,最終變數model中就儲存了我們所設定的網路。
(2)建立Sequential model的程式片段如下:
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
(3)五層神經網絡的結構圖:
(4)適用場合:
☎Sequential mode 搭建方法簡單快速,並且可以解決大多簡單的問題,
☎例如:手寫字辨識,房價預測,或評論分類,
☎基本上只要是『回歸問題或,是分類問題』,都可以用sequential mode來解決。
(5)限制:
建立有一個限制:就是必須逐層搭建網路,而且網路模型必須是single input and output。
(6)範例1:keras官網的教學範例:
Sequential model教學範例 ,
(7)範例2:Sequential model神經模型
☎內容與目的:
A.輸入:為28x28的照片,將照片的2維向量拉平成784大小的一維向量
B.輸出:為大小10的一維向量(10個種類),輸出層的激活函數是Softmax
C.中間隱藏層有2層:各有64個神經元。隱藏層的激活函數是ReLU
☎網路模型示意圖:單層輸入,單層輸出(輸入層只有1層,輸出層也只有1層)
☎步驟1:匯入函數庫
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.utils import plot_model
from IPython.display import Image
☎步驟2:建立神經網路模型(有兩種方法)
☎方法一:
#建立一個名為my_sequential的model
model = keras.Sequential(name="my_sequential")
#使用model.add可以增加一層網路到model裡面,在第一層網絡要額外定義輸入大小(input_shape)
#每一層的第一個數字,代表該層神經元數目(就是該層的輸出數目)
model.add(layers.Dense(64, activation="relu", name="layer1", input_shape=(784,)))
model.add(layers.Dense(64, activation="relu", name="layer2"))
#最後一個model.add,就是該model的輸出層
model.add(layers.Dense(10, name="layer3",activation="softmax"))
☎方法二:
#可以將所有三層網路層都放到一個list[]裡面,這個List當作tf.keras.Sequential建模的參數
#list裡面的元素順序:第一個元素是第一層(第一隱藏層,但需要定義輸入層神經元數目),中間是定義隱藏層,最後一個是定義輸出層
#注意層數:輸入層是第0層,第一隱藏層是第1層,第二隱藏層是第2層,輸出層是第3層
#而在keras建模model時,不需要建立第0層(輸入層),但第0層(輸入層)的神經元數目,要在第1層(第一隱藏層)裡面定義
# Define Sequential model with 3 layers
model = tf.keras.Sequential(
[
layers.Dense(64, activation="relu", name="layer1", input_shape=(784,)),
layers.Dense(64, activation="relu", name="layer2"),
layers.Dense(10, activation="softmax", name="layer3"),
]
)
☎步驟3:顯示網絡模型圖
#產生網絡拓撲圖
plot_model(model, to_file="model1.png")
#顯示網絡拓撲圖
Image("model1.png")
結果:
(8)神經網絡層的種類:
A.Dense層:為上下緊密連結的神經網路層
又名『全連接層』:全連接層考慮的是全局的訊息,但在分類圖像中,重要的是物體本身的局部資訊
全連接層缺點:輸入影像資料時,會先將所有 data 通過 Flatten 層拉成一維,也就是說輸入的影像會被 reshape 成一維的 tensor。我們認為圖片中的像素與其鄰近的像素有一定的關聯程度,或是在不同的channel之間也可能具有某些關連性。而這樣的做法會失去圖像特徵之間的空間資訊
B.Conv2d層(卷積層,Convolution Layer):卷積層的用意是來提取圖片中的特徵(feature)
包括:一維(Conv1D)、二維(Conv2D)、三維(Conv3D),分別處理時序資料、2D 圖形及每一點含其他資訊的2D 圖形
C.Flatten層(扁平層,平坦層,Flatten Layer):把多維的輸入壓扁為一維輸出,常用在從卷積層到全連接層的過渡,無參數
D.池化層 (Pooling Layer)
E.Dense層(全連接層):搭建『全連接層』的指令
6.Functional API model:
(1)此寫法利用函式自定義模型並提供了更靈活的方法。每一層的輸入即為上一層的輸出。這種方法可以更彈性的設定每一層的 input,或是可以自由的修改神經網路的資料流。
(2)建立Functional API model的程式片段如下:
# 建立模型
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Model
InputTensor = tf.keras.Input(shape=(100,))
H1 = Dense(10, activation='relu')(InputTensor)
H2 = Dense(20, activation='relu')(H1)
Output = Dense(1, activation='softmax')(H2)
model_API = Model(inputs=InputTensor, outputs=Output)
model_API.summary()
from keras.utils import plot_model
tf.keras.utils.plot_model(model_API, to_file='Functional_API_model.png')
])
(3)四層神經網絡的結構圖:
7.Model Subclassing:
(1)可以透過建立一個類別來搭建一個神經網路的模板。
可發現在類別內有兩個函式:
A.第一個是初始化的__init__類似建構子,它的功用是在呼叫類別時會幫你做變數的初始化。因此我們可以在這個函式內先設定好輸入層、隱藏藏以及輸出層。
B.第二個函式是call這個函式是執行神經網路中的前饋(feedforward),也就是說資料會從輸入層流入隱藏層最後再流出輸出層完成一次的神經網路運算
(2)建立Model Subclassing的程式片段如下:
from tensorflow import keras
from tensorflow.keras import layers
class network(keras.Model):
def __init__(self):
super(network,self).__init__()
self.layer_1 = layers.Dense(8 , activation='relu')
self.layer_2 = layers.Dense(16 , activation='relu')
self.output_layer = layers.Dense(3 , activation='softmax')
def call(self,x):
x_1 = self.layer_1(x)
x_2 = self.layer_2(x_1)
predict = self.output_layer(x_2)
return predict
(3)呼叫類別的方式:model = network()
8.Keras 損失函數(Loss Function)的種類:
(1)建立模型後的目標:
keras建立模型後,要開始求解目標函數,模型的目標乃是下午預測與實際的數據之間的誤差越來越小,所以目標函數,就是算損失函數(loss function)。
(2)keras常用的損失函數,有以下幾種:
(2-1)均方誤差(mean_squared_error):也就是最小平方法(Least Square)
☎目標函數 = mean_squared_error = 均方誤差函數 = 預測值與實際值的差距之平均值。
☎範例:model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
☎其他相關的改良版目標函數:mean_absolute_error、mean_absolute_percentage_error、mean_squared_logarithmic_error。
(2-2)Hinge Error (hinge):
☎說明:這是一種單邊誤差,不考慮負值,適用於『支援向量機』(SVM)的最大間隔分類法(maximum-margin classification)
☎目標函數 = hinge
☎範例:model.compile(loss='hinge', optimizer='adam', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
☎其他相關的改良版目標函數:squared_hinge、categorical_hinge
(2-3)Cross Entropy (categorical_crossentropy):
☎說明:當預測值與實際值愈相近,損失函數就愈小,反之差距很大,就會更影響損失函數的值
☎目標函數 = categorical_crossentropy
☎範例:model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
☎其他相關的改良版目標函數:sparse_categorical_crossentropy、binary_crossentropy
(2-4)其它目標函數:
☎目標函數 =logcosh、kullback_leibler_divergence、poisson、cosine_proximity
☎範例:model.compile(loss='logcosh', optimizer='adam', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
(參考來源文章)
9.Keras 激勵函數(Activation Function)的種類:
(1)激勵函數(Activation Function)的功能:
A.可提供非線性函數的轉換
B.是一種門檻(Threshold)的過濾,例如,sigmoid,將預測值(W * X) 轉為 [0,1] 之間,只有預測值大於0,才會傳導至下一層的神經元
(2)keras常用的激勵函數(Activation Function),有以下幾種:
(2-1)softmax函數:
☎說明:這個函數的值介於 [0,1] 之間,且機率總和等於 1,所以適合多分類使用
☎範例:model.add(Dense(units=10, kernel_initializer='normal', activation='softmax'))
(2-2)sigmoid函數:
☎sigmoid:值介於 [0,1] 之間,且分布兩極化,大部分不是 0,就是 1,適合二分法。
☎範例:model.add(Dense(units=10, kernel_initializer='normal', activation='sigmoid'))
(2-3)Relu函數:
☎說明:Relu (Rectified Linear Units):忽略負值,介於 [0,∞] 之間
☎範例:model.add(Dense(units=10, kernel_initializer='normal', activation='Relu'))
(2-4)tanh函數:
☎tanh:與sigmoid類似,但值介於[-1,1]之間,即傳導有負值
☎範例:model.add(Dense(units=10, kernel_initializer='normal', activation='tanh'))
(參考來源文章)
10.Keras 優化函數(Optimizer)的種類:
(1)優化函數(Optimizer)的功能:
A.類神經網絡在求解過程中,需要不斷調整參數(w,b)來讓誤差函數的值最小,故需要在各種參數組合中找出最佳的一組參數,這個過程稱為最佳化過程(optiomization process)
B.優化函數(Optimizer),就是讓模型找出最佳參數的方法,能讓誤差值最小
C.有各種各樣的優化函數(Optimizer)可以使用
D.梯度法是常用找出最佳參數的方法,包括多種梯度法可以選擇:最速下降梯度,牛頓(newton's method),隨機梯度下降法(SGD:stochastic gradient descent)
(2)優化函數(Optimizer)的種類:
A.種類:在keras有多種優化函數(Optimizer):Adam,SGD,RMSprop,Adagrad,Adadelta,Adam 等
B.梯度下降最常見種類:梯度下降最常見的三種變形:BGD,SGD,MBGD
C.各種優化函數(Optimizer)的效率比較圖:
(3)keras常用的優化函數(Optimizer),有以下幾種:
(3-1)梯度下降法的分類:
從訓練樣本數量的角度來看,梯度下降法可分爲三種
(3-1-a)批量梯度下降(BGD):
☎說明:這個函數乃是在整個訓練集上,計算損失函數對於參數的梯度
☎優點:(1)疊代次數少;(2)若損失函數爲凸函數,能夠保證收斂到全局最優解;若爲非凸函數,能夠收斂到局部最優值(結果的準確度)。
☎缺點:(1)速度很慢;(2)對內存資源要求高;(3)不能在線學習,即無法在訓練過程中增加新的樣本。
☎範例:model.compile(loss='categorical_crossentropy', optimizer='bgd', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
(3-1-b)隨機梯度下降(Stochastic Gradient Descent, SGD):
☎說明:隨機梯度下降法:乃是利用偏微分,逐步按著下降的方向,尋找最佳解。
☎它包括以下參數:
(A)Learning Rate (lr):逼近最佳解的學習速率,速率訂的太小,計算最佳解的時間花費較長,訂的太大,可能會在最佳解兩旁擺盪,找不到最佳解。
(B)momentum:更新的動能,一開始學習速率可以大一點,接近最佳解時,學習速率步幅就要小一點,一般訂為0.5,不要那麼大時,可改為 0.9。
(C)decay:每次更新後,學習速率隨之衰減的比率。
☎優點:(1)訓練速度快;(2)支持在線更新;(3)有機率跳出局部最優解。
☎缺點:(1)容易收斂到局部最優,並且容易被困在鞍點;(2)疊代次數多。
☎範例:model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
(3-1-c)小批量梯度下降(MBGD):
☎說明:在每次更新時使用n個小批量訓練樣本
☎優點:(1)減少參數更新的方差,可以得到更加穩定的收斂結果;(2)通過矩陣優化方法可以高效地求解每個小批量數據的梯度。
☎範例:model.compile(loss='categorical_crossentropy', optimizer='mbgd', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
(3-2)梯度下降優化算法:
從梯度下降優化算法一般分爲兩種:
☎(1)固定學習率的方法(SGD,Momentum,NAG)
☎(2)學習率自適應的方法(Adagrad,Adadelta,RMSprop,Adam,AdaMax,Nadam)
(3-3)固定學習率的方法(SGD,Momentum,NAG)
(3-3-a)SGD:
☎說明:這是最初始的梯度下降算法
☎範例:model.compile(loss='categorical_crossentropy', optimizer='SGD', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
(3-3-b)Momentum:
☎說明:Momentum旨在加速學習,特別是處理高曲率或帶噪音的梯度。Momentum算法會觀 察歷史梯度(動量),若當前梯度的方向與歷史梯度一致(表明當前樣本不太可能爲異常點),則會增強這個方向的梯度,若當前梯度與歷史梯方向不一致,則梯度會衰減。
☎範例:model.compile(loss='categorical_crossentropy', optimizer='Momentum', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
(3-4)自適應學習率(Adagrad,Adadelta,RMSprop,Adam,AdaMax,Nadam)
(**建議使用這個)
(3-4-a)Adagrad:
☎說明:通過記錄每次疊代過程中的前進方向和距離,從而使得針對不同問題,有一套自適應調整學習率的方法,對於出現頻率較低參數採用較大的α更新;相反,對於出現頻率較高的參數採用較小的α更新。非常適合處理稀疏數據,極大提高了SGD的魯棒性,但是存在學習率單調遞減以至於最終會接近無限小的問題
☎範例:model.compile(loss='categorical_crossentropy', optimizer='Adagrad', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
(3-4-b)Adadelta:
☎說明:在一個窗口期內中對梯度進行求和,而不是對梯度一直累加。
☎範例:model.compile(loss='categorical_crossentropy', optimizer='Adadelta', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
(3-4-c)RMSprop:
☎說明:Adagrad會累加之前所有的梯度平方,而RMSprop僅僅是計算對應的平均值,因此可緩解Adagrad算法學習率下降較快的問題。
☎範例:model.compile(loss='categorical_crossentropy', optimizer='RMSprop', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
(3-4-d)Adam(**建議使用這個):
☎說明:以SGD作爲最初的算法,Momentum在其基礎上加入了一階動量(歷史梯度的累計),AdaGrad和RMSProp在其基礎上加入了二階動量(歷史梯度的平方累計),Adam就是結合了一階動量和二階動量算法。
☎說明:Adam:一般而言,比SGD模型訓練成本較低,請參考『Adam - A Method for Stochastic Optimization』,
☎Adam包含下參數,與建議值範圍:
lr:逼近最佳解的學習速率,預設值為0.001。
beta_1:一階矩估計的指數衰減因子,預設值為0.9。
beta_2:二階矩估計的指數衰減因子,預設值為0.999。
epsilon:為一大於但接近 0 的數,放在分母,避免產生除以 0 的錯誤,預設值為1e-08。
decay:每次更新後,學習速率隨之衰減的比率。
☎範例:model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
(3-5-e)AdaMax:
☎說明:基於無窮範數的Adam方法的變體。
☎範例:model.compile(loss='categorical_crossentropy', optimizer='AdaMax', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
(3-6-f)Nadam:
☎說明:Nadam = Adam + NAG。
☎範例:model.compile(loss='categorical_crossentropy', optimizer='Nadam', metrics=['accuracy'])
(# 編譯模型:設定:選擇損失函數loss、優化方法optimizer,成效衡量方式metrics
(4)keras常用的優化函數(Optimizer) vs 對應的梯度下降演算法:
(5)如何選擇哪一種優化函數(Optimizer)?
(5-1)如果數據是稀疏的,
☎建議選用『自適應方法』:即Adagrad, Adadelta, RMSprop, Adam。RMSprop, Adadelta, Adam
☎在很多情況下的效果是相似的,
☎隨著梯度變的稀疏,Adam 比 RMSprop 效果會好。
☎整體來講,Adam 是最好的選擇。
(5-2)現在很多論文裡都會使用不加momentum 的 SGD。
☎SGD 雖然在一大多數情況下都能達到極小值,但是比其它算法用的時間長且依賴於魯棒的初始化和退火策略,
☎另外SGD可能會被困在鞍點而無法逃脫。
(5-3)所以,如果需要更快的收斂,或者是訓練更深更複雜的神經網絡,建議選用『自適應的學習率』的方法。
(參考來源文章1) ,
(參考來源文章2)
chp9. 由keras的4個範例(簡易版)來認識人工智慧
目錄
1.TensorFlow官網的教學範例1:用1層神經網絡來做迴歸分析
2.TensorFlow官網的教學範例2:基本神經網絡深度學習模型
3.TensorFlow官網的教學範例3:卷積神經網絡模型
4.TensorFlow官網的教學範例4:識別剪刀石頭布Rock,Paper,Scissors
1.從一個範例來認識人工智慧(TensorFlow官網的教學範例1):用1層神經網絡來做迴歸分析
☎人工智慧的最常見用途:分類,迴歸
☎目的:從一堆xy對應數據,找出迴歸線(歸納找出趨勢)
☎參考教學影片:教學影片 (中文)
教學影片(英文)
(1)如何找出輸入x,與輸出y的關係(迴歸法,分類法,類神經網路法)
(2)TensorFlow官網的教學文件1:
☎TensorFlow官網的教學範例1:找出數據的趨勢線
(9-1-1)練習範例(1):學習線性趨勢線(直線),預測x=10的y值?
數據點:
xs = [-1.0, 0.0, 1.0, 2.0, 3.0, 4.0]
ys = [-3.0, -1.0, 1.0, 3.0, 5.0, 7.0]
☎題目:找出這堆數據的迴歸(歸納找出趨勢線):
☎執行類神經網路的求解步驟示意圖:
☎方法:使用神經網絡模型,單層神經,一個神經元units=1
#建立1層神經網絡
☎成果:
成果圖片
程式碼
專案成果檔案.py ,
專案成果檔案.ipynb
(4)補充觀念:python的副檔名有兩種:.py 或 .ipynb
A.用Python語言編寫的原始碼檔案,其檔案字尾是 「.py」 或 「.ipynb」。用Python語言編寫的原始碼檔案,其檔案字尾是 「.py」 或 「.ipynb」。
B.「.py」檔案:是標準的Python原始碼檔案,可以用Spyder、Visual Studio Code、PyCharm編輯並執行.py檔案。也可以用notepad++或者sublime免費的編輯器進行.py檔案的編輯。
C.「.ipynb」檔案:是使用 Jupyter Notebook 來編寫Python程式時的檔案
(9-1-2)練習範例(2):學習線性趨勢線(直線),畫出數據點與預測點
數據點:
xs = [-1.0, 0.0, 1.0, 2.0, 3.0, 4.0]
ys = [-3.0, -1.0, 1.0, 3.0, 5.0, 7.0]
AI的7步驟流程 ,
程式碼解答
(9-1-3)練習範例(3):學習非線性趨勢線(雙曲線),預測x=1.0的y值,畫出數據點與預測點
數據點:
xs = [-0.5, -0.44736842, -0.39473684, -0.34210526, -0.28947368, -0.23684211,
-0.18421053, -0.13157895, -0.07894737, -0.02631579, 0.02631579, 0.07894737,
0.13157895, 0.18421053, 0.23684211, 0.28947368, 0.34210526, 0.39473684,
0.44736842, 0.5]
ys = [0.24595018, 0.19992016, 0.11848622, 0.09924376, 0.08173275, 0.0596075,
0.02737021, 0.01544445, 0.02764277, 0.00527432,-0.00814974,-0.01725386,
0.0489, 0.02935983, 0.04428556, 0.08552249, 0.12389014, 0.15113714,
0.20734122, 0.23009059]
☎注意:每一層的激勵函數activation="relu"
☎注意:優化函數optimizer = Adam()
☎可以成功執行的神經層(6,4,4,4,1)
☎可以成功執行的神經層(8,4,4,4,1)
☎可以成功執行的神經層(10,8,8,8,1)
AI的7步驟流程 ,
程式碼解答
(9-1-4)練習範例(4):學習非線性趨勢線(拋物線),預測x=12的y值,畫出數據點與預測點
數據點:
xs = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
ys = [0.105, 0.105, 0.148, 0.210, 0.349, 0.540, 0.840, 1.251, 1.799, 2.483]
☎注意:每一層的激勵函數activation="relu"
☎注意:優化函數optimizer = Adam()
☎可以成功執行的神經層(6,4,4,4,1),epochs=1000
☎可以成功執行的神經層(10,8,8,8,1),epochs=1000
☎可以成功執行的神經層(12,8,8,8,8,8,8,8,1)
AI的7步驟流程 ,
程式碼解答
2.TensorFlow官網的教學範例2:基本神經網絡深度學習模型
☎人工智慧的最常見用途:分類,迴歸
☎目的:如何由鞋子圖片,自動識別是什麼鞋子款式編號
☎參考教學影片:教學影片(中文)
教學影片(英文)
(1)如何由鞋子圖片,自動識別是什麼鞋子款式
(2)TensorFlow官網的教學文件2:
☎TensorFlow官網的教學範例2:識別鞋子
☎官網教學: Classify images of clothing
(3)練習範例:
☎題目:如何由鞋子圖片,自動識別是什麼鞋子款式:
☎鞋子圖片來源:讀取鞋子資料集dataset(tensorflow裡面已經內建有fashion_mnist的資料集)
鞋子資料集(fashion_mnist),裡面的鞋子種類有10類,圖片有7萬張(每一類鞋子有7千張),每張圖片28x28像素
☎指令:mnist = tf.keras.datasets.fashion_mnist
☎執行類神經網路的求解步驟示意圖:
☎成果:
成果圖片 ,
成果圖片
程式碼
專案成果檔案.py ,
專案成果檔案.ipynb
☎預測結果:
(4)注意:這個範例的鞋子圖片都是規律的(28x28,灰階,鞋子都在圖片正中央)
A.如果:圖片是像普通的照片,物體不規律(物體在邊角,多物體混雜....),本方法就無法正確的學習與預測
B.不規律的圖片,必須用辨別特徵的類神經方法:卷積神經法
3.TensorFlow官網的教學範例3:卷積神經網絡模型的簡介(Introduction to Convolutions)
☎人工智慧的最常見用途:分類,迴歸
☎目的:簡介卷積神經網絡(Introduction to Convolutions),識別不規律圖片的特徵
(1)參考教學影片:教學影片 (中文)
教學影片(英文)
(2)TensorFlow官網的教學文件3:
Learn Tensorflow 3: Introduction to Convolutions
☎TensorFlow官網的教學範例2:識別鞋子
(3)如何識別混雜一起的鞋子圖片:
方法:必須使用卷積神經網絡
(4)卷積神經網絡的原理:
A必須先把圖像『過濾』(過濾的功用:可以凸顯圖像的特徵)
B然後再進行『深度學習』
(5)什麼是過濾器:
☎過濾器就是『乘法器』
例如:紅色3x3矩陣就是乘法器,
使用方法:每一個像素點(例如192)x過濾器=新的數值
圖片每個像素被過濾後,就會凸顯出特徵了(如下圖)
效果1:這個過濾器可以塗掉大部分的像素,只留下豎直的線條特徵
效果2:若要圖片經過第二個過濾器的過濾,就可以只留下水平的線條特徵
(6)什麼是最大池化(max pooling):
A.把4x4像素,分解成4個2x2的子項目,
B.然後找出每個子項目(2x2)的最大值
C.於是把原本的4x4像素 → 池化(pooling) → 找出局部最大值 → 簡化成 2x2像素
D.把原本圖像縮小成1/4(但卻可以保留所有的特徵點)
E.經過『過濾+最大池化max pooling』轉化後的示意圖:(不但保留原本圖片特徵,還壓縮圖檔大小)
(換言之,圖片檔案size縮小了,卻還能夠清楚辨識 )
(7)如何才能得到最佳的『過濾器』:
觀念:卷積神經網絡會自動產生過濾器
A.圖片輸入後,傳送到卷積神經層
B.『卷積神經層』會自動產生『過濾器』,並將過濾器覆蓋到每個圖片的像素上
C.再傳到下一層,進行深度學習計算
D.學習計算後,過濾器會把最好的結果記錄下來(特徵提取)
E.所以『過濾器』是被『卷積神經層』反复學習計算後所自動得到的參數,不是人為設定的
(8)卷積神經層透過『過濾器』所『特徵提取』的結果圖:
A.第一列就是結果卷積神經『特徵提取』的結果:看到『鞋底』的特徵,看到『鞋子外圍輪廓』的特徵
(8)下列影片演示了卷積神經網路運作之原理 :
(1).How Convolutional Neural Networks work
(2).How Deep Neural Networks Work(youtube 影片)
VIDEO
(9)卷積神經層產生『過濾器』的程式碼:
A.第1層(卷積神經層),會產生64個過濾器,輸入向量是28x28
B.這64個過濾器,卷積神經層會自動反复學習,得到最佳的參數解(就類似深度學習的方法)
C.MaxPooling2D(2, 2)乃是執行最大池化壓縮圖片檔案大小,但保留特徵
model = tf.keras.models.Sequential([
# Note the input shape is the desired size of the image 28x28 with 1 bytes color
# This is the first convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(2, 2),
# Flatten the results to feed into a DNN
tf.keras.layers.Flatten(),
# 128 neuron hidden layer
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
(9)多個卷積神經層反复過濾,壓縮的程式碼:
A.多個卷積神經層反复過濾,壓縮,就可以提取出多種特徵
B.優點:
☎前一個範例(一般神經網絡),是根據『像素』來進行學習
☎這個範例(卷積神經層),卷積神經網絡可以根據『像素,特徵』來進行學習
C.例如:神經網絡看到『兩個袖子』的特徵,就可以判斷這個是『襯衣,短袖』,而不是鞋子
看到『鞋底,鞋帶』,就可以判斷這是『短靴,雨鞋』,而不是襯衣
model = tf.keras.models.Sequential([
# Note the input shape is the desired size of the image 28x28 with 1 bytes color
# This is the first convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(2, 2),
# The second convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# The third convolution
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# The fourth convolution
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# Flatten the results to feed into a DNN
tf.keras.layers.Flatten(),
# 128 neuron hidden layer
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
☎執行類神經網路的求解步驟示意圖:
(10)資料來源(fashion_mnist資料集)
☎鞋子衣服圖片來源:讀取鞋子衣服資料集dataset(tensorflow裡面已經內建有fashion_mnist的資料集)
☎鞋子衣服資料集(fashion_mnist),裡面的樣式種類有10類,圖片有7萬張(每一類鞋子有7千張),每張圖片28x28像素
☎指令:mnist = tf.keras.datasets.fashion_mnist
(11)成果:
程式碼
專案成果檔案.py ,
專案成果檔案.ipynb
4.TensorFlow官網的教學範例4:識別剪刀石頭布Rock,Paper,Scissors
☎人工智慧的最常見用途:分類,迴歸
☎目的:如何由鞋子圖片,自動識別是什麼鞋子款式編號
☎參考教學影片:教學影片 (中文)
教學影片(英文)
(1)自動識別識別剪刀石頭布
(2)TensorFlow官網的教學文件4:
Learn Tensorflow 4: Build an image classifier
☎TensorFlow官網的教學範例4:識別剪刀石頭布Rock,Paper,Scissors
☎Build convolutional neural networks (CNNs) to enhance computer vision
(3)下載『剪刀石頭布』的資料集(Rock, paper, scissors dataset )
(4)練習範例:
☎題目:自動識別識別剪刀石頭布
(4-1)如何下載數據檔案
#1-1:訓練所需的數據
!wget --no-check-certificate \
https://storage.googleapis.com/laurencemoroney-blog.appspot.com/rps.zip \
-O /tmp/rps.zip
#1-2:測試與驗證所需的數據
!wget --no-check-certificate \
https://storage.googleapis.com/laurencemoroney-blog.appspot.com/rps-test-set.zip \
-O /tmp/rps-test-set.zip
(4-2)如何解壓缩下載的檔案
☎解壓縮到程式碼:
import os
import zipfile
local_zip = '/tmp/rps.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp/')
zip_ref.close()
local_zip = '/tmp/rps-test-set.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp/')
zip_ref.close()
☎解壓縮產生的目錄:images-Training-Rock, Paper, Scissors
☎並且會幫你自動把圖片編號
☎注意:解壓縮後,所產生的訓練用圖檔為train_generator,測試用圖檔為validation_generator
(4-3)使用卷積神經網絡建立深度學習模型:
☎為什麼要建立4層的卷積神經層:因為數據較複雜(圖片比較大(150x150),顏色比較多(黑人,白人,黃種人))
model = tf.keras.models.Sequential([
# Note the input shape is the desired size of the image 150x150 with 3 bytes color
# This is the first convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
# The second convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# The third convolution
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# The fourth convolution
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
# Flatten the results to feed into a DNN
tf.keras.layers.Flatten(),
tf.keras.layers.Dropout(0.5),
# 512 neuron hidden layer
tf.keras.layers.Dense(512, activation='relu'),
#最後輸出成:1層,三個神經元的網絡(輸出的答案有三種)
tf.keras.layers.Dense(3, activation='softmax')
])
(4-4)如何由自己電腦上傳圖片,進行測試
#測試上傳的圖片,看看預測結果是否正確(布,石頭,剪刀)
#例如:布=(1,0,0),石頭=(0,1,0),剪刀=(0,0,1)
import numpy as np
from google.colab import files
from keras.preprocessing import image
uploaded = files.upload()
for fn in uploaded.keys():
# predicting images
path = fn
img = image.load_img(path, target_size=(150, 150))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
images = np.vstack([x])
classes = model.predict(images, batch_size=10)
print("這個照片是:",fn)
print("識別這個照片是:",classes)
print("布=(1,0,0),石頭=(0,1,0),剪刀=(0,0,1)")
(4-5)成果:
下載測試用的布石頭剪刀的圖片
卷積神經網絡程式碼 ,
上傳圖片程式碼
專案成果檔案.py ,
專案成果檔案.ipynb
☎預測結果:
chp10. keras多層感知器(MLP)
目錄
1.什麼是多層感知機 Multilayer perceptron, MLP
2.神經網絡隱藏層的神經元要設定多少
3.深度學習神經網絡的運作核心原理:找出最佳的參數(權重值w)
4.神經網絡的訓練每次迴圈的三步驟:前向傳遞,評估損失,反向傳遞
5.訓練迴圈是否越多越好:過度擬合/低度擬合(Overfit/underfit)
6.為什麼深度學習的神經元要用激勵函數/啟動函數/Activation
7.該使用哪一種激勵函數/Activation function?
8.該使用哪一種損失函數/Loss function?
9.樣本與標籤(samples/labels)
10.樣本要做哪些預處理
11.樣本的正規化與標準化(Normalization/Standardization)
12.樣本要切割成三份:『訓練用,驗證用,測試用』樣本
13.迴圈的設定:訓練週期Epochs,批次Batch,批次尺寸Batch Size,迭代數Iterations
14.Keras常用的2種深度學習模型models
15.常用的3種神經網絡類型types:MLP,CNN,RNN
範例10-1:基本圖片分類:Basic classification: Classify images of clothing
1.感知器(perceptron):就是神經元(neuron)
2.單一感知機的缺點:無法處理『線性不可分』的問題(就是無法用一條線就進行分類)
3.多層感知機:可以處理『線性不可分』的問題
4.什麼是多層感知機 Multilayer perceptron, MLP
(1)MLP在以前就有了,不是因為深度學習網路模型之後才有的。
(2)MLP:其實就是類神經網路。
(3)MLP的傳統定義:MLP多層感知機是一種前向傳遞類神經網路,至少包含三層結構(輸入層、隱藏層和輸出層),並且利用到「倒傳遞」的技術達到學習(model learning)的監督式學習
(4)由現代深度學習DNN的視角來看MLP:MLP多層感知機是深度神經網路(deep neural network, DNN)的一種特殊案例special case,
☎換言之,MLP與DNN,其基本概念是一樣的,
☎DNN只是在學習過程中,多了一些手法,和更多的層數。
☎三層結構MLP示意圖:
(5)四層以上MLP:就是深度學習神經網路(輸入層,第1隱藏層,第2隱藏層,輸出層)
5.多層感知機MLP,就是類神經網絡模型(深度學習)的基本款
☎所以,若要學習類神經網絡模型(深度學習),就要從基本款開始學。
☎所以,深度學習的入門,就從『多層感知機MLP』開始
6.密集神經層Dense layer:
上圖的每一層神經元都會連接到下一層的每個神經元頂點
(1)這種稱為『全連接, Full Connectd』
(2)這種神經層稱為『密集層, Dense layer』
6.建構神經網絡的一個重要問題:隱藏層的神經元要設定多少?
(1)沒有標準答案,只有參考準則
(2)隱藏層的神經元數量:介於輸入層,與輸出層之間
(3)隱藏層的神經元數量:小於2倍輸入層
(4)隱藏層的神經元數量:可以是,(2/3輸入層+輸出層)神經元數量
7.深度學習神經網絡的幾何物理意義:
(1)若隱藏層有2個神經元:y=f(x),是一個平面坐標轉換
(2)若隱藏層有3個神經元:y=f(x),是一個3D空間坐標轉換
8.深度學習神經網絡的運作核心原理:找出最佳的參數(權重值w)
8-1.深度學習神經網絡的運作原理:
(1)深度學習,是在學習什麼呢?
☎神經網絡模型能夠找到最佳解的關鍵:就是能夠經由學習,找出最佳的調整權重值w
(2)所以,整個神經網絡模型的核心關鍵:就是在不斷的測試『調整權重值w』,來降低誤差值(loss function損失函數)
(3)調整神經網絡模型的參數:參數就是『權重值w,偏差值b』
(4)一旦計算出誤差值(loss function損失函數)後,就可以經由『優化器optimizer』來調整更新權重值w
☎影片教學:深度学习基础课程07 - 神经网络的损失函数 loss function
8-2.基本的人工神經元的組成: (Components of the basic Artificial Neuron:)
1. Inputs: Inputs are the set of values for which we need to predict the output value. They can be viewed as features or attributes in a dataset.
輸入 :輸入是我們需要為其預測輸出值的一組值。 可以將它們視為資料集中的要素或屬性。
2. Weights: weights are the real values that are associated with each feature which tells the importance of that feature in predicting the final value. (we will know more about in this article)
權重:權重是與每個要素關聯的實際值,表明了該要素在預測最終值中的重要性。 (我們將在本文中瞭解更多資訊)
3. Bias: Bias is used for shifting the activation function towards left or right, it can be referred to as a y-intercept in the line equation. (we will know more about this in this article)
偏差:偏差用於將啟動函數向左或向右移動,在線性方程式中可以稱為y截距。 (我們將在本文中對此有更多瞭解)
4. Summation Function: The work of the summation function is to bind the weights and inputs together and find their sum.
求和函數:求和函數的作用是將權重和輸入綁定在一起,以求和。
5. Activation Function: It is used to introduce non-linearity in the model.
激勵函數(啟動函數):用於在模型中引入非線性。
10.神經網絡的訓練每次迴圈的三步驟:前向傳遞,評估損失,反向傳遞
10-1.深度學習神經網絡的訓練迴圈:
(1)要讓神經網絡模型,不斷學習,不斷調整這些參數(權重值w,偏差值b),不是只做一次
☎所以整個神經網絡的訓練學習,都是圍繞著調整『權重值w』,這是整個深度學習的關鍵核心探討主題所在
☎深度學習:就是在學習如何『調整權重值w』
(2)而是要做很多次(迴圈Loop),也稱為迭代iteation
(3)神經網絡的訓練迴圈的三步驟(三階段):
☎前向傳遞 (Forward propagation):輸入層到隱藏層
☎評估損失 (Estimate Loss):一般來說都是用誤差均方和(mean square error)當作目標函數
☎反向傳遞 (Backward propagation):輸出層到隱藏層
10-2.keras深度學習訓練迴圈的5個step:
(1)step1:一開始,使用亂數設定random,設定每一神經元的權重值w
(2)step2:使用前向傳遞 (Forward propagation)法,計算預測值y
☎y=f(wx+b)
f是激勵函數
w是權重值,b是偏差值
y是預測值,x是輸入值
☎注意:因為訓練的資料集很大,不太可能一次全部計算,而是採用小量分批(Batch)的方式,每一批次的樣本數稱為Batch size
(3)step3:計算損失函數(目標函數,就是預測值與正確值的誤差)
(4)step4:反向傳遞 (Backward propagation),更新權重值w
☎反向計算(由輸出層->隱藏層),使用偏微分方法,計算每一層權重值w的梯度(grdient)
(5)step5:使用『梯度下降法,Gradient Descent』更新權重值w,然後重複step2~5,不斷迭代迴圈計算(iteration,loop)
☎注意:做一次step2~step5,稱為一個訓練週期(Epoch)
11.訓練迴圈次數是否越多越好:過度擬合/低度擬合(Overfit/underfit)
(1)訓練迴圈是否越多越好?
☎不是
☎訓練迴圈次數太少,造成預測失真(低度擬合/underfit)
☎訓練迴圈次數剛剛好,造成預測最接近正確解(最佳解/Optimum)
☎訓練迴圈次數太多,造成預測失真(過度擬合/Overfit)
(2)過度學習(訓練迴圈太多)的缺點
☎如果過度學習(訓練迴圈太多),就會造成模型缺少『泛化性,Generalization』
☎『泛化性』:對於沒有學習過的資料來源/圖片,也能成功地預測出正確答案
☎訓練迴圈太多➜過度學習➜缺少『泛化性』➜對於沒有見過的數據,預測率很低
12.為什麼深度學習的神經元要用激勵函數/啟動函數/Activation
☎使用激勵函數的目的:讓神經網絡模型可以處理『非線性的資料轉換』
(1)沒有使用激勵函數/Activation的神經網絡模型:
☎神經網絡模型的每個神經元,都是由前一層神經元輸入值×權重值w的總和summation(Σ,sigma)
☎因為是計算summation,所以是線性組合,所以轉換後,y=f(x)也是個線性函數,
☎y=f(x)是線性函數,最後就只能夠處理線性問題
(2)若使用激勵函數/Activation function的神經網絡模型:
☎因為激勵函數/Activation function是一種非線性函數,就可以把原本summation的線性關係,轉換成『非線性關係』
☎y=Activation(f(x)),可以把線性函數轉換成:非線性問題(就像把原本的一條直線,變成曲線了)
☎激勵函數/Activation function,可以把原本只能擬合『直線』問題,變成,可以擬合『曲線』問題了
13.該使用哪一種:激勵函數/Activation function?
(1)傳統『單一感知器』使用的激勵函數/Activation function是什麼
☎傳統使用『階梯函數/step function』
(2)現代『MLP,深度學習神經網絡』使用的激勵函數/Activation function是什麼
4-1:在隱藏層:最常使用『ReLU函數』
4-2:在輸出層:最常使用『sigmoid函數,tanh函數,softmax函數』
☎二元分類問題:使用『sigmoid函數,tanh函數』
☎多元分類問題:使用『softmax函數』
(3)輸出層的激勵函數:
(3-1)sigmoid函數:
☎sigmoid:值介於 [0,1] 之間,且分布兩極化,大部分不是 0,就是 1,適合二分法。
☎sigmoid的缺點:sigmoid函數的微分,會讓在反向傳播過程,只需要3~5層的summation後,就讓梯度=0,造成梯度消失問題。
這種會讓反向傳播過程中,梯度消失的問題,讓sigmoid函數不適合放在隱藏層,只能放在輸出層。
所以,這是為什麼在隱藏層,一般都用ReLU函數。
☎範例:model.add(Dense(units=10, kernel_initializer='normal', activation='sigmoid'))
(3-2)tanh函數:
☎tanh:與sigmoid類似,但值介於[-1,1]之間,即傳導有負值
☎tanh函數的優點:雙曲函數是一種三角函數,對於神經網絡模型而言,它的優點是若有處理負值。
注意:sigmoid函數,與ReLU函數,都沒有負值
☎範例:model.add(Dense(units=10, kernel_initializer='normal', activation='tanh'))
(3-3)softmax函數:
☎說明:這個函數的值介於 [0,1] 之間,且機率總和等於 1,所以適合多分類使用
☎範例:model.add(Dense(units=10, kernel_initializer='normal', activation='softmax'))
(4)隱藏層的激勵函數:
(4-1)ReLU函數:
☎說明:ReLU (Rectified Linear Units):忽略負值,介於 [0,∞] 之間
☎ReLU的重要性:深度學習能夠重新被重視,重新引領風潮,就是因為當初AlexNet神經網絡,使用ReLU函數取代sigmoid函數,讓模型對圖片的識別率提高了15%。
所以ReLU函數非常重要,尤其在隱藏層,尤其是對圖片的識別
☎ReLU在>0區域的微分=1,不會有sigmoid函數的梯度消失問題:
☎範例:model.add(Dense(units=10, kernel_initializer='normal', activation='Relu'))
13.該使用哪一種損失函數/Loss function?
(13-1)損失函數/Loss function是什麼
☎深度學習的目標函數object function,就是損失函數/Loss function
☎損失函數/Loss function:計算『預測值』與『真實值』之間的差距
☎所以,損失函數是一個『非負值』
☎代表意義:損失函數越小,表示深度學習模型越正確,能夠精準預測
(13-2)該使用哪一種損失函數/Loss function?
☎分類問題:使用『交叉熵函數,Cross Entropy (categorical_crossentropy)函數』
☎迴歸問題:使用『均方誤差函數,mean square error(mean_squared_error)』
(13-3)均方誤差函數(mean_squared_error):也就是最小平方法(Least Square)
☎目標函數 = mean_squared_error = 均方誤差函數 = 預測值與實際值的差距之平均值。
☎範例:model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
(13-4)交叉熵函數Cross Entropy (categorical_crossentropy):
☎說明:當預測值與實際值愈相近,損失函數就愈小,反之差距很大,就會更影響損失函數的值
☎目標函數 = categorical_crossentropy
☎範例:model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
☎說明:『交叉熵』函數乃是使用『資訊熵』來評估兩組機率向量之間的差異程度,當交叉熵越小,則表示兩組機率向量間的差異越接近。
☎說明:所以若『交叉熵』越小,就表示越接近目標值。
☎因此:可以把『交叉熵』函數,當作評估神經網絡模型的目標object。
(13-5)什麼是『資訊熵』(Information Entropy)?
☎功用:『資訊熵』主要是用來評估『資訊混亂的程度』
☎若『資訊熵』越小:表示資訊確定,不混亂
☎若『資訊熵』越大:表示資訊不確定,混亂
14.什麼是樣本與標籤(samples/labels)
(14-1)什麼是樣本與標籤(samples/labels)
☎樣本samples:就是神經網絡模型所輸入的資料集dataset
☎標籤labels:就是每個『樣本』,所對應的『目標值/答案』
☎注意:樣本與標籤(samples/labels)都是張量/向量/陣列
(13-2)該使用哪一種損失函數/Loss function?
☎分類問題:使用『交叉熵函數,Cross Entropy (categorical_crossentropy)函數』
☎迴歸問題:使用『均方誤差函數,mean square error(mean_squared_error)』
(13-3)均方誤差函數(mean_squared_error):也就是最小平方法(Least Square)
☎目標函數 = mean_squared_error = 均方誤差函數 = 預測值與實際值的差距之平均值。
☎範例:model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
(13-4)交叉熵函數Cross Entropy (categorical_crossentropy):
☎說明:當預測值與實際值愈相近,損失函數就愈小,反之差距很大,就會更影響損失函數的值
☎目標函數 = categorical_crossentropy
☎範例:model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
☎說明:『交叉熵』函數乃是使用『資訊熵』來評估兩組機率向量之間的差異程度,當交叉熵越小,則表示兩組機率向量間的差異越接近。
☎說明:所以若『交叉熵』越小,就表示越接近目標值。
☎因此:可以把『交叉熵』函數,當作評估神經網絡模型的目標object。
(13-5)什麼是『資訊熵』(Information Entropy)?
☎功用:『資訊熵』主要是用來評估『資訊混亂的程度』
☎若『資訊熵』越小:表示資訊確定,不混亂
☎若『資訊熵』越大:表示資訊不確定,混亂
15.樣本要做哪些預處理:
(15-1)樣本要做哪些預處理?
神經網絡模型在開始讀入資料訓練前,要先做數據的預處理,包括:
☎先把樣本進行『特徵標準化』
☎把樣本切割成三部分:訓練用樣本,驗證用樣本,預測用樣本
☎設定『訓練週期Epoch,批次Batch,批次尺寸Batch Size』
注意:因為訓練的資料集很大,不太可能一次全部計算,而是採用小量分批(Batch)的方式,每一批次的樣本數稱為Batch size
注意:做一次step2~step5,稱為一個訓練週期(Epoch)
(15-2)為什麼要做『特徵標準化』?
☎當樣本的兩個特徵AB,彼此的數據數值差距很大(例如:特徵A數值為955555,特徵B為0.01)
差距這麼大的特徵值,讓神經網絡模型去訓練,將導致目標函數無法收斂
☎所以要先把樣本進行『特徵標準化』,平衡特徵值的貢獻度與影響程度
(15-3)『特徵標準化』的兩種可行方法:
☎第一種方法:正規化/Normalization
方法:把樣本的數值,都轉換成『0~1』
使用時機:若樣本的數據平均,沒有極端峰值,就用『正規化/Normalization』方法,來平衡特徵值
☎第二種方法:標準化/Standardization
方法:把樣本的『平均值』調整成0,『標準差』調整成1
使用時機:若樣本的數據雜亂,有很多極端峰值,就用『標準化/Standardization』方法,來平衡特徵值
16.『特徵標準化』的兩種可行方法:正規化/Normalization,標準化/Standardization
(16-1)『特徵標準化』的兩種可行方法:
☎第一種方法:正規化/Normalization
方法:把樣本的數值,都轉換成『0~1』
使用時機:若樣本的數據平均,沒有極端峰值,就用『正規化/Normalization』方法,來平衡特徵值
☎第二種方法:標準化/Standardization
方法:把樣本的『平均值』調整成0,『標準差』調整成1
使用時機:若樣本的數據雜亂,有很多極端峰值,就用『標準化/Standardization』方法,來平衡特徵值
(16-2)正規化/Normalization:
☎原理:把樣本數據的範圍,依照比例縮放,例如:縮小成(0~1)的範圍內
(16-3)標準化/Standardization:
☎原理:python可以使用scipy.stats模組的一個函數:zscore(),來執行標準化
☎範例:
from scipy.stats import zscore
import numpy as np
x = np.array([255,128,45,0])
print('標準化後的張量=', zscore(x))
17.樣本要切割成三份:『訓練用,驗證用,測試用』樣本
(17-1)樣本要切割成三份:
☎第1種:訓練用資料集/training Dataset
用途:訓練神經網絡模型的參數(權重值w)
☎第2種:驗證用資料集/Validation Dataset
用途1:用來『評估Evaluate』模型的準確率
用途2:用來『優化Optimize』模型(使過度擬合overfitting的情況最小化)
注意:若訓練準確率高,但驗證時準確率低,這表示過度擬合overfitting了。
改善方法:停止訓練,增加隱藏層數目,測試看看,是否能夠改善過度擬合overfitting
☎第3種:測試用資料集/Testing Dataset
用途1:用來『預測Predict』
(17-2)樣本切割成三份的比例:
☎原理:『訓練,驗證,測試』資料集的比例為:70%,20%,10%
18.迴圈的設定:訓練週期Epochs,批次Batch,批次尺寸Batch Size,迭代數Iterations
(18-1)神經網絡模型的訓練:
☎指令:train_history = model.fit(x=x_Train_norm, y=y_TrainOneHot, validation_split=0.2, epochs=10, batch_size=800, verbose=2)
☎內容:以model.fit()函數進行訓練,必須先指定訓練的樣本資料(x, y)來源,並撥一部分資料作驗證(validation_split=0.2),還要設定訓練幾個週期(epochs=10)、訓練資料的抽樣方式。
☎訓練過程5步驟:step1~step5
(18-2)訓練週期Epochs:
☎用途:訓練過程5步驟,每次執行step2~step5,稱為一個訓練週期(Epoch)
(18-3)批次Batch,批次尺寸Batch Size:
☎用途:因為訓練的資料集很大,不太可能一次全部計算,而是採用小量分批(Batch)的方式,每一批次的樣本數稱為Batch size
(18-4)迭代數Iterations:
☎內容:迭代數 = 需要多少批次Batch,才能夠完成一個訓練週期Epochs
☎範例:某個神經網絡模型:
訓練樣本數有:2000筆
小樣本訓練的批次尺寸為:500筆
Question:請問,需要多少的迭代數,才能完成一次的訓練週期?
Answer:
迭代數Iterations = (訓練樣本數/批次尺寸)= 4 次
19.Keras常用的2種深度學習模型models
(19-1)第1種models:Sequential Model
☎用途:Sequential mode 搭建方法簡單快速,並且可以解決大多簡單的問題,例如:手寫字辨識,房價預測或評論分類,基本上只要是回歸問題或是分類問題,都可以用sequential mode來解決
☎限制1:必須逐層搭建網路,也就是每一層接著下一層,不允許跨層連接
☎限制2:而且網路模型必須是single input and output
☎範例:建立Sequential model的程式片段如下:
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
☎五層神經網絡的結構圖:
(19-2)第2種models:Functional API model
☎用途1:如果是複雜的『多輸入,多輸出』,就可以用Functional API model
☎用途1:如果模型會使用到『共享神經層』,就可以用Functional API model
☎範例:建立Functional API model的程式片段如下:
# 建立模型
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Model
InputTensor = tf.keras.Input(shape=(100,))
H1 = Dense(10, activation='relu')(InputTensor)
H2 = Dense(20, activation='relu')(H1)
Output = Dense(1, activation='softmax')(H2)
model_API = Model(inputs=InputTensor, outputs=Output)
model_API.summary()
from keras.utils import plot_model
tf.keras.utils.plot_model(model_API, to_file='Functional_API_model.png')
])
☎四層神經網絡的結構圖:
20.常用的3種神經網絡類型types:MLP,CNN,RNN
(20-1)第1種types:MLP/多層感知器
☎內容1:多層感知器,簡稱MLP,是神經網絡的經典類型。
☎內容2:它是由一層或多層神經元組成。數據被饋送到輸入層,可能存在一個或多個提供抽象級別的隱藏層,並且在輸出層(也稱爲可見層)上進行預測
☎用途1:MLP適用於分類預測問題,其中輸入被分配一個類或標籤。
☎用途2:也適用於迴歸預測問題,其中給定一組輸入對實值量進行預測。數據通常以表格格式提供,例如:CSV文件或電子表格中看到的那樣。
☎用途3:適合於『表格式數據集,分類預測問題,迴歸預測問題』
☎用途4:MLP非常靈活,通常可用於學習從輸入到輸出的映射。
(20-2)第2種types:CNN/卷積神經網絡
☎用途1:CNN 專門解決『影像識別』問題的,可用把它看作特徵提取層,放在輸入層上,最後用MLP 做分類
☎用途2:卷積神經網絡(CNN)被設計成,將圖像數據,映射到輸出變量。
☎用途3:對於涉及圖像數據作爲輸入的任何類型的預測問題,它們都是可行的方法。
☎用途4:適合於『圖像數據,分類預測問題,迴歸預測問題』
☎用途5:CNN能夠很好地處理具有空間關係的數據。
☎用途6:CNN輸入傳統上是二維的,字段或矩陣,但也可以改變爲一維,允許它開發一維序列的內部表示。
☎用途7:CNN 卷積擅長從『區域性』特徵,逼近『整體』特徵
☎用途8:CNN應該側重空間對映,影象資料尤為貼合此場景。
(20-3)第3種types:RNN/循環神經網絡,遞歸神經網絡
☎特點1:遞歸神經網絡(RNNs)被設計成,處理『序列』預測問題。
序列預測問題有多種形式,最好用所支持的輸入和輸出類型來描述。
序列預測問題的一些示例包括:
一對多:作爲輸入的觀察映射到多個步驟的輸出序列。(也就是用一步觀測值往後預測多步)
多對一:作爲輸入映射到類或數量預測的多個步驟的序列。(多步觀測值預測一個類別或一步)
多對多:作爲輸入的多個步驟的序列,映射到具有多個步驟作爲輸出的序列。(多步觀測值預測多步)
☎特點2:傳統上,遞歸神經網絡很難訓練。
☎特點3:長短期記憶網絡,或者LSTM網絡可能是最成功的RNN,因爲它克服了訓練循環網絡的問題,並且反過來已經在廣泛的應用中使用。
☎特點4:一般來說,RNN和LSTM在處理單詞和段落序列(通常稱爲自然語言處理)時獲得了最大的成功。
☎特點5:這包括文本序列和以時間序列表示的口語序列。它們也被用作需要序列輸出的生成模型,不僅用於文本,還用於生成手寫等應用程序。
☎特點6:RNN 專門解決時間序列問題的,用來提取時間序列資訊,放在特徵提取層(如CNN)之後。
☎特點7:RNN,遞迴型網路,用於序列資料,並且有了一定的記憶效應,輔之以lstm。
☎特點8:RNN 擅長對付時間序列。
☎用途1:適合於『文本數據,語音數據』
☎用途2:適合於『分類預測問題,迴歸預測問題』
☎限制1:不要使用RNN用於:『表格數據,圖像數據』
1.基本圖片分類:Basic classification: Classify images of clothing
☎人工智慧的最常見用途:分類,迴歸
☎目的:從一堆圖片,學習找出圖片的分類規律
(1)官網的教學文件:
☎官網的教學範例:基本圖片分類:Basic classification: Classify images of clothing
(3)練習範例:
☎題目:uses the Fashion MNIST dataset which contains 70,000 grayscale images in 10 categories. The images show individual articles of clothing at low resolution (28 by 28 pixels), as seen here:
☎執行類神經網路的求解步驟示意圖:
(3-1)使用神經網絡模型,三層神經網絡(第1層把2D陣列轉成1D陣列(Flatten),第2-3層dendse層)
☎使用:tf.keras.layers.Flatten指令來轉換維度, transforms the format of the images from a two-dimensional array (of 28 by 28 pixels) to a one-dimensional array (of 28 * 28 = 784 pixels)
☎The first Dense layer: has 128 nodes (or neurons).
☎The second (and last) layer(輸出層): returns a logits array with length of 10
model = tf.keras.Sequential(
[
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10)
])
(3-2)Compile the model
These are added during the model's compile step:
☎Loss function:his measures how accurate the model is during training. You want to minimize this function to "steer" the model in the right direction.
☎Optimizer:This is how the model is updated based on the data it sees and its loss function.
☎Metrics:Used to monitor the training and testing steps. The following example uses accuracy, the fraction of the images that are correctly classified.
(3-3)Train the model
As the model trains, the loss and accuracy metrics are displayed. This model reaches an accuracy of about 0.91 (or 91%) on the training data.
model.fit(train_images, train_labels, epochs=10)
(3-4)評估準確率:Evaluate accuracy
compare how the model performs on the test dataset:
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print('\nTest accuracy:', test_acc)
(3-5)什麼是Overfitting model:
☎Overfitting:測試的準確率<訓練的準確率
☎Overfitting的model:無法精準預測新的數據(unseen)
It turns out that the accuracy on the test dataset is a little less than the accuracy on the training dataset.
This gap between training accuracy and test accuracy represents overfitting.
Overfitting happens when a machine learning model performs worse on new, previously unseen inputs than it does on the training data.
An overfitted model "memorizes" the noise and details in the training dataset to a point where it negatively impacts the performance of the model on the new data.
(3-6)預測新的數據:Make predictions
☎With the model trained, you can use it to make predictions about some images.
pred_classifications = model.predict(test_images)
☎take a look at the first prediction:
echo predictions[0];
array([2.9212106e-07, 1.6208847e-10, 1.3363140e-08, 2.7341349e-09,
5.5379962e-10, 4.5457238e-04, 4.2226111e-06, 4.4925120e-03,
5.8868943e-07, 9.9504781e-01], dtype=float32)
(3-7)用圖形驗證預測結果對不對:Verify predictions
i = 0
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions[i], test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions[i], test_labels)
plt.show()
(3-8)成果:
程式碼
專案成果檔案.py ,
專案成果檔案.ipynb
chp11. keras多層感知器(MLP)的各種範例
目錄
範例11-1-a:糖尿病的識別與預測:讀入資料集檔案
範例11-1-b:建立糖尿病的神經網絡模型
範例11-1-c:把訓練資料先進行特徵標準化Standardization
範例11-1-d:在神經層使用權重初始器initializer
範例11-1-e:輸出向量改成2個(yes,no)
範例11-1-f:使用adam優化器optimizer試看看可否提高準確率
範例11-1-g:若樣本數不多,可縮小神經網絡尺寸,以提高準確率
範例11-1-h:把資料集分割成訓練資料集,測試資料集
範例11-1-i:如何找到最佳訓練週期epochs(看驗證資料的history圖)
範例11-1-j:使用validation_split=0.2參數,來自動分割驗證用資料集
範例11-1-k:顯示模型的預測值
目錄
範例11-2-a:預測波士頓房價Boston Housing price regression:讀入csv資料集
範例11-2-b:建立模型來訓練波士頓房價資料集
範例11-2-c:使用定義函數來『建立模型+編譯模型』:model=def bulid_mode()
範例11-2-d:當資料集數目少時可用k-摺疊交叉驗證法(k fold cross validation)
範例11-2-e:使用四層神經網絡,來降低誤差
範例11-2-f:由『驗證資料集』找出避免overfitting的『最佳週期』後,就只用『訓練資料集,測試資料集』重新訓練模型
範例11-2-g:同時一次儲存已經訓練好的模型『結構,權重』
範例11-2-h:一次讀入已經訓練好的模型『結構,權重』
範例11-2-i:分開儲存已經訓練好的模型『結構,權重』
範例11-2-j:分開讀入已經訓練好的模型『結構,權重』
目錄
範例11-3-a:鳶尾花資料集(The iris dataset)的多元分類:讀入csv資料集
範例11-3-b:繪圖(散佈圖,seabron繪圖庫):鳶尾花資料集
範例11-3-c:建立鳶尾花資料集(The iris dataset)的神經網絡模型
範例11-2-a:糖尿病的識別與預測:讀入資料集檔案
☎人工智慧的最常見用途:分類,迴歸
☎本範例方法:讀入csv,用Keras預測糖尿病
☎目的:分類問題(讀入美國糖尿病最高的皮馬印第安人pima indians資料集,學習,並預測)
(11-1a-1)教學文件:
☎利用python機器學習庫進行Kaggle皮馬印第安人糖尿病預測分析
☎Your First Deep Learning Project in Python with Keras Step-By-Step
☎Using a Keras based neural network to predict diabetes
☎Practical Deep Neural Network in Keras on PIMA Diabetes Data set
☎[ML] 用 Keras 預測糖尿病
(11-1a-2)讀入csv的方法:
(1)在anaconda讀入csv:
import pandas as pd
df = pd.read_csv("./diabetes.csv")
☎程式碼:程式碼(使用anaconda讀入資料集)
(2)在colaboratory讀入csv:方法1
☎注意:diabetes.csv已經上傳到google drive裡面了
在colaboratory的python讀入google drive裡面的diabetes.csv
from google.colab import drive
drive.mount('/content/drive')
df = pd.read_csv("./diabetes.csv")
☎程式碼:程式碼(在colaboratory的python讀入google drive裡的資料集)
(3)在colaboratory讀入csv:方法2
☎注意:diabetes.csv在自己的個人電腦硬碟裡
#上傳diabetes.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])))
# 確認diabetes.csv是否已上載
!ls *.* -l
# use Pandas to read diabetes.csv
df = pd.read_csv("./diabetes.csv")
print(df)
☎程式碼:程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
(11-1a-3)下載pima印第安人糖尿病資料集:
(1)下載pima印第安人糖尿病資料集
(2)糖尿病資料集結構分析:
☎該資料集源至美國國家糖尿病、消化及腎臟疾病研究所。
☎資料集的目的:可以根據已有診斷資訊,來預測患者是否患有糖尿病。
但該資料庫存在一定局限性,特別是資料集中的患者都是年齡大於等於21歲的皮馬印第安女性。
☎資料來源:https://www.kaggle.com/uciml/pima-indians-diabetes-database
☎資料集共9個欄位(8個預測變數,和1個目標變數Outcome)。
☎預測變數包括:患者的懷孕次數,BMI,胰島素水準,年齡等。如下圖所示:
(11-1a-4)讀入csv檔案,印出前5筆,印出資料集的size(row,column)=(筆數,欄位數)
☎成果:
1.程式碼(使用anaconda讀入資料集)
2.程式碼(在colaboratory的python讀入google drive裡的資料集)
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-1-b:建立糖尿病的神經網絡模型
☎目的:接續上題(11-1-a),建立糖尿病神經網絡模型,學習,並預測
(11-1b-1)教學文件:
☎利用python機器學習庫進行Kaggle皮馬印第安人糖尿病預測分析
☎Your First Deep Learning Project in Python with Keras Step-By-Step
☎Using a Keras based neural network to predict diabetes
☎Practical Deep Neural Network in Keras on PIMA Diabetes Data set
☎[ML] 用 Keras 預測糖尿病
(11-1b-1)import函數庫的寫法有兩種:
(1)方法1:
import tensorflow as tf
....
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(10, input_shape=(8,), activation="relu"))
model.add(tf.keras.layers.Dense(8, activation="relu"))
model.add(tf.keras.layers.Dense(1, activation="sigmoid"))
(2)方法2:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
.....
model = Sequential()
model.add(Dense(10, input_shape=(8,), activation="relu"))
model.add(Dense(8, activation="relu"))
model.add(Dense(1, activation="sigmoid"))
(11-1b-2)建立深度學習神經網絡模型(四層):
☎輸入層:8種特徵資料
☎隱藏層1:10個神經元
☎隱藏層2:8個神經元
☎輸出層:這是個分類問題(是否得病:yes,no)
所以,輸出可以說一個神經元(true,false)
或是,輸出可以說二個神經元
(11-1b-3)建立三層神經層:
keras使用Sequential來建立神經層:
☎建立model指令:model = Sequential()
☎加入三層網絡:
範例:
model = Sequential()
model.add(Dense(10, input_shape=(8,), activation="relu"))
model.add(Dense(8, activation="relu"))
model.add(Dense(1, activation="sigmoid"))
☎參數說明:
(1)第0層:輸入層,不需要建立
(2)第1層:隱藏層,model.add(Dense(設定參數))
☎參數units:神經元數目
☎參數input_shape:設定輸入層的形狀 =(樣本數,輸出維度)
例如:input_shape=(8,)=使用(*,8)的輸入資料,*為樣本數,8為8個特徵數
☎也可以用參數input_dim=8,設定輸入的特徵數
☎參數activation:設定激勵函數,例如:activation="relu",設定ReLU函數
☎範例1:model.add(Dense(units=10, input_shape=(8,), activation="relu"))
☎範例2:model.add(Dense(10, input_shape=(8,), activation="relu"))
(3)第2層:隱藏層,model.add(Dense(設定參數))
☎範例:model.add(Dense(8, activation="relu"))
(4)第3層:輸出層,model.add(Dense(設定參數))
☎範例:model.add(Dense(1, activation="sigmoid"))
建立一個輸出層,設定一個神經元,設定激勵函數=sigmoid
(11-1b-4)顯示神經網絡模型的摘要資訊:
☎指令:model.summary()
(11-1b-5)編譯模型:
☎目的:把上面keras建立好的四層神經網絡,編譯成低階的tensorflow計算圖
☎指令:model.compile(設定參數)
☎範例:model.compile(loss="binary_crossentropy", optimizer="sgd",metrics=["accuracy"])
☎參數說明:
(1).loss參數:損失函數的名稱,一般常用的函數,例如:均方誤差(mse),交叉熵(crossentropy)
下表是『激勵函數 vs 損失函數對應表』
☎這個糖尿病資料的判斷,是二元分類,
所以『激勵函數/啟動函數 = sigmoid』,
所以『損失函數 = binary_crossentropy』
(2).optimizer參數:優化器,就是所使用的『梯度下降法 gradient descent』,keras可以設定多種類的梯度下降法
☎範例:optimizer="sgd",設定使用『隨機梯度下降法』
(3).metrics參數:設定『訓練模型』,『評估模型』的評估標準,所以這個是個list清單[....]
通常使用『accuracy』
☎範例:metrics=["accuracy"]
(11-1b-6)訓練模型:
☎目的:把特徵資料數據,放入上面模型來訓練
☎指令:model.fit(設定參數)
☎範例:model.fit(X, Y, epochs=150, batch_size=10)
☎參數說明:
(1).X, Y參數:X是輸入資料(特徵資料),Y是輸出資料(目標值,標籤資料)
(2).epochs參數:epochs是訓練週期的次數,epochs=150代表總共訓練150次
(3).batch_size參數:batch_size是批次尺寸
☎訓練過程的輸出資訊:
☎epoch=1/150,代表第一次訓練
☎77/77,77是樣本數
☎loss是損失函數,acc是準確度
(11-1b-7)評估模型的效能:
☎指令:model.evaluate(設定參數)
☎範例:loss, accuracy = model.evaluate(X, Y, verbose=0)
☎參數說明:
(1).X, Y參數:X是輸入資料(特徵資料),Y是輸出資料(目標值,標籤資料)
(2).verbose參數:訓練過程輸出方式,若verbose=0則不輸出資訊,若verbose=1則輸出資訊
(11-1b-8)印出模型的準確度:
☎指令:print("準確度 = {:.2f}".format(accuracy))
小數點2位的浮點數
☎成果:
☎注意:因為一開始使用亂數打亂資料,所以每個人run的結果會不一樣
1.程式碼(使用anaconda讀入資料集)
2.程式碼(在colaboratory的python讀入google drive裡的資料集)
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-1-c:把訓練資料先進行特徵標準化Standardization
☎目的:希望能夠提高上面神經網絡模型的訓練,讓模型的準確率更高
☎方法:因為的csv訓練資料,數值大小差距大,
(11-1c-1)『特徵標準化』的兩種可行方法:
☎第一種方法:正規化/Normalization
方法:把樣本的數值,都轉換成『0~1』
使用時機:若樣本的數據平均,沒有極端峰值,就用『正規化/Normalization』方法,來平衡特徵值
☎第二種方法:標準化/Standardization
方法:把樣本的『平均值』調整成0,『標準差』調整成1
使用時機:若樣本的數據雜亂,有很多極端峰值,就用『標準化/Standardization』方法,來平衡特徵值
(11-1c-2)『特徵標準化』的程式寫法:
目的:把樣本的『平均值』調整成0,『標準差』調整成1
(1)X先減去平均值mean():先把整個平均值往下拉,拉到平均值=0
(2)X再除以標準差std():X再除以標準差,造成標準差=1
X -= X.mean(axis=0)
X /= X.std(axis=0)
(11-1c-3)import函數庫的寫法有兩種:
(1)方法1:
import tensorflow as tf
....
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(10, input_shape=(8,), activation="relu"))
model.add(tf.keras.layers.Dense(8, activation="relu"))
model.add(tf.keras.layers.Dense(1, activation="sigmoid"))
(2)方法2:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
.....
model = Sequential()
model.add(Dense(10, input_shape=(8,), activation="relu"))
model.add(Dense(8, activation="relu"))
model.add(Dense(1, activation="sigmoid"))
☎成果:
☎注意:因為一開始使用亂數打亂資料,所以每個人run的結果會不一樣
☎結果:模型的準確率有提高(0.7->0.8)
1.程式碼(使用anaconda讀入資料集)
2.程式碼(在colaboratory的python讀入google drive裡的資料集)
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-1-d:在神經層使用權重初始器initializer
☎目的:希望能夠提高上面神經網絡模型的訓練,讓模型的準確率更高
☎方法:在神經層使用權重初始器initializer(設定權重陣列w,偏差向量b),若沒有設定就是用預設值
☎可以設定的參數:
kernel_initializer='Zeros':全零初始化
kernel_initializer='Ones':全1初始化
kernel_initializer='random_normal':常態分佈的隨機亂數
kernel_initializer='random_uniform':均勻分佈的隨機亂數
bias_initializer='Zeros':全零初始化
bias_initializer='Ones':全1初始化
bias_initializer='random_normal':常態分佈的隨機亂數
bias_initializer='random_uniform':均勻分佈的隨機亂數
(1)在神經層設定『權重w,偏差向量b』的初始值:
☎程式碼指令:
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(10, input_shape=(8,),
kernel_initializer="random_uniform",
bias_initializer="ones",
activation="relu"))
model.add(tf.keras.layers.Dense(8, kernel_initializer="random_uniform",
bias_initializer="ones",
activation="relu"))
model.add(tf.keras.layers.Dense(1, kernel_initializer="random_uniform",
bias_initializer="ones",
activation="sigmoid"))
(2)成果:
☎結果:模型的準確率沒有提高太多(0.75->0.78)
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-1-e:輸出向量改成2個(yes,no)
(1)觀念:判別是否得到糖尿病,輸出向量有兩種方式:
(A).一個輸出向量y:(y=0,或y=1),y=1得病
(B).二個輸出向量y1,y2:(y1=0,y2=1),或(y1=1,y2=0),y2=1得病
☎前面範例:一個輸出向量y:(y=0,或y=1),y=1得病
☎本題範例目的:二個輸出向量y1,y2
(y1=0,y2=1),或(y1=1,y2=0),y2=1得病
(2)程式碼重點:一個輸出向量y:(y=0,或y=1),y=1得病:
☎重點1:神經層的最後一層,要設定units=1
☎重點2:神經層的最後一層,要設定激勵函數為sigmoid(activation="sigmoid")
sigmoid激勵函數的對應損失函數= binary_crossentropy
☎準則:
二元分類問題(單一輸出向量):使用『sigmoid函數,tanh函數』
多元分類問題(多個輸出向量):使用『softmax函數』
☎這個糖尿病資料的判斷,是二元分類(單一輸出向量)
所以『激勵函數/啟動函數 = sigmoid』,
所以『損失函數 = binary_crossentropy』
☎程式碼指令:
model.add(tf.keras.layers.Dense(units=1, kernel_initializer="random_uniform",
bias_initializer="ones",
activation="sigmoid"))
☎成果:
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
(3)程式碼重點:二個輸出向量y1,y2:(y1=0,y2=1),或(y1=1,y2=0),y2=1得病:
☎重點1:神經層的最後一層,要設定units=2
☎重點2:神經層的最後一層,要設定激勵函數為softmax(activation="softmax")
sigmoid激勵函數的對應損失函數= categorical_crossentropy
☎重點3:二元/多元分類問題(多個輸出向量),則其輸出向量的標籤,必須先進行one-hot編碼,才能與softmax計算的預測向量(機率向量),進行損失函數的計算
☎程式碼:如何把輸出向量y進行one-hot編碼
# One-hot編碼
from tensorflow.keras.utils import to_categorical
Y = to_categorical(Y)
或是
# One-hot編碼
Y = tf.keras.utils.to_categorical(Y)
☎準則:
二元分類問題(單一輸出向量):使用『sigmoid函數,tanh函數』
多元分類問題(多個輸出向量):使用『softmax函數』
☎這個糖尿病資料的判斷,是多元分類問題(多個輸出向量)
所以『激勵函數/啟動函數 = softmax』,
所以『損失函數 = categorical_crossentropy』
☎程式碼指令:
model.add(tf.keras.layers.Dense(units=2, kernel_initializer="random_uniform",
bias_initializer="ones",
activation="softmax"))
☎成果:
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-1-f:使用adam優化器optimizer試看看可否提高準確率
(1)觀念:設定優化器optimizer的種類,是影響神經網絡模型效能的重要因素之一
☎優化器optimizer:就是各種改良版本的『梯度下降法Gradient Descent』
(2)keras常用的優化函數(Optimizer) vs 對應的梯度下降演算法:
(3)如何選擇哪一種優化函數(Optimizer)?
(3-1).如果數據是稀疏的,
☎建議選用『自適應方法』:即Adagrad, Adadelta, RMSprop, Adam。RMSprop, Adadelta, Adam
☎整體來講,Adam 是最好的選擇。
(3-2).如果使用循環神經網絡模型RNN,
☎則優化函數選擇: rmsprop的效能是最好的
(4)程式:延續範例11-1-c(沒有加上優化器optimizer)
(5)程式碼重點:使用adam優化器
☎程式碼:
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
☎成果:
☎結果:模型的準確率有提高(0.75->0.85)
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-1-g:若樣本數不多,可縮小神經網絡尺寸,以提高準確率
(1)觀念:若樣本數不多,可縮小神經網絡尺寸(減小神經網絡的參數量),可以提高準確率
(2)方法:把第二層隱藏層的神經元數目,由8->6個
(4)程式:延續範例11-1-f
(5)程式碼重點:
☎程式碼:
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(10, input_shape=(8,), activation="relu"))
model.add(tf.keras.layers.Dense(6, activation="relu"))
model.add(tf.keras.layers.Dense(1, activation="sigmoid"))
☎成果:
☎結果:模型的準確率->0.83
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-1-h:把資料集分割成訓練資料集,測試資料集
(1)觀念:前面範例是用同一批資料來做『訓練,與測試』,正確的做法是,要把資料集分割成『訓練資料集,測試資料集』
(2)方法:把768筆資料,分割成『690筆訓練用資料,78筆測試用資料』
(3)程式:延續範例11-1-g
(4)程式碼重點:
☎把768筆資料,分割成『690筆訓練用資料,78筆測試用資料』:
#前690筆,是訓練用資料
X_train, Y_train = X[:690], Y[:690]
#最後78筆(690以後筆數),是測試用資料
X_test, Y_test = X[690:], Y[690:]
☎用X_train, Y_train來做訓練
#12.訓練模型(用X_train, Y_train來做訓練)
model.fit(X_train, Y_train, epochs=150, 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))
☎成果:
☎結果:訓練用資料集的準確度比較高,測試資料集的準確度的準確率比較低,這是因為測試用的資料沒有遇見過
☎原因:這是泛化性不足,可能是因為『過度擬合over fitting』所造成的
☎改善方法:可能是因為訓練週期太多,造成過度學習,所以必須找出最佳訓練週期,所以必須在『訓練資料集,再分割出部分資料集當作驗證用』=『驗證用資料集』
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-1-i:如何找到最佳訓練週期epochs(看驗證資料的history圖)
(1)觀念:過度擬合overfitting的改善方法:
☎現象:訓練用資料集的準確度比較高,測試資料集的準確度的準確率比較低,這是因為測試用的資料沒有遇見過
☎原因:這是泛化性不足,可能是因為『過度擬合over fitting』所造成的
☎改善方法:可能是因為訓練週期太多,造成過度學習,所以必須找出最佳訓練週期,所以必須在『訓練資料集,再分割出部分資料集當作驗證用』=『驗證用資料集』
(2)為什麼除了『訓練資料集,測試資料集』外,還要有『驗證資料集』?
☎(1)因為:若只用『訓練資料集,測試資料集』,往往會出現『過度擬合overfitting,泛化不足』,這可能是因為過度學習導致的
☎(2)所以,必須用『驗證資料集』,找出『最佳的訓練週期』
☎(3)若是已經找出『最佳的訓練週期』了,就可以在此週期下,重新只用『訓練資料集,測試資料集』來訓練模型
(3)方法:如何找到最佳訓練週期epochs
☎在history = model.fit(參數)裡面,加上參數validation_data=(X_test,Y_test)
☎然後觀察history歷史圖,畫出val_loss(validation loss)歷史圖,當val_loss最低點就是最佳訓練週期
☎最佳訓練週期在epochs = 30左右,這時val_loss的誤差值是最低的,之後val_loss就會逐漸上升(若繼續訓練,就會造成overfitting過度擬合)
☎或是,畫出val_accuracy(validation accuracy)歷史圖,當val_accuracy最高點就是最佳訓練週期
☎最佳訓練週期在epochs = 30左右,這時validation accuracy的準確率是最高的,之後validation accuracy就會逐漸降低(若繼續訓練,就會造成overfitting過度擬合)
(3)程式:延續範例11-1-h
(4)程式碼重點:
☎.訓練模型(用X_test,Y_test來做訓練)(加上參數validation_data=(X_test,Y_test)):
#輸出訊息,多了兩個:val_loss驗證資料的損失,val_accuracy驗證資料的準確率
history = model.fit(X_train, Y_train, epochs=150, validation_data=(X_test,Y_test), batch_size=10, verbose=1)
#14.評估模型的效能(比較用『訓練用資料集,測試資料集』的模型準確率)
loss, accuracy = model.evaluate(X_train, Y_train)
print("訓練用資料集的準確度 = {:.2f}".format(accuracy))
loss, accuracy = model.evaluate(X_test, Y_test)
print("測試資料集的準確度 = {:.2f}".format(accuracy))
☎畫出val_loss(validation loss)歷史圖,當val_loss最低點就是最佳訓練週期
import matplotlib.pyplot as plt
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1,len(loss)+1)
plt.plot(epochs, loss, "bo", label="Training_loss")
plt.plot(epochs, val_loss, "r", label="Validation_loss")
plt.title("Training_loss vs Validation_loss")
plt.xlabel("epochs")
plt.ylabel("loss")
plt.legend()
plt.show()
☎比較用『訓練用資料集,測試資料集』的模型準確率
loss, accuracy = model.evaluate(X_train, Y_train)
print("訓練用資料集的準確度 = {:.2f}".format(accuracy))
loss, accuracy = model.evaluate(X_test, Y_test)
print("測試資料集的準確度 = {:.2f}".format(accuracy))
☎成果:
☎修改:最佳訓練週期在epochs = 20~30左右
☎結果:沒有過度擬合overfitting現象,驗證資料集的誤差值0.76沒有明顯增高(0.79)
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-1-j:使用validation_split=0.2參數,來自動分割驗證用資料集
(1)觀念:過度擬合overfitting的改善方法:
☎現象:訓練用資料集的準確度比較高,測試資料集的準確度的準確率比較低,這是因為測試用的資料沒有遇見過
☎原因:這是泛化性不足,可能是因為『過度擬合over fitting』所造成的
☎改善方法:可能是因為訓練週期太多,造成過度學習,所以必須找出最佳訓練週期,所以必須在『訓練資料集,再分割出部分資料集當作驗證用』=『驗證用資料集』
(2)方法:如何找到最佳訓練週期epochs
☎在history = model.fit(參數)裡面,加上參數validation_split=0.2參數,就會把X_train, Y_train訓練資料集中,自動分割出20%當作驗證資料集
☎然後觀察history歷史圖,畫出val_loss(validation loss)歷史圖,當val_loss最低點就是最佳訓練週期
☎最佳訓練週期在epochs = 10左右,這時val_loss的誤差值是最低的,之後val_loss就會逐漸上升(若繼續訓練,就會造成overfitting過度擬合)
☎或是,畫出val_accuracy(validation accuracy)歷史圖,當val_accuracy最高點就是最佳訓練週期
☎最佳訓練週期在epochs = 10左右,這時validation accuracy的準確率是最高的,之後validation accuracy就會逐漸降低(若繼續訓練,就會造成overfitting過度擬合)
(3)程式:延續範例11-1-i
(4)程式碼重點:
☎.訓練模型(用X_test,Y_test來做訓練)(加上參數validation_data=(X_test,Y_test)):
#輸出訊息,多了兩個:val_loss驗證資料的損失,val_accuracy驗證資料的準確率
history = model.fit(X_train, Y_train, epochs=150, validation_split=0.2, batch_size=10, verbose=1)
#14.評估模型的效能(比較用『訓練用資料集,測試資料集』的模型準確率)
loss, accuracy = model.evaluate(X_train, Y_train)
print("訓練用資料集的準確度 = {:.2f}".format(accuracy))
loss, accuracy = model.evaluate(X_test, Y_test)
print("測試資料集的準確度 = {:.2f}".format(accuracy))
☎成果:
☎修改:最佳訓練週期在epochs = 10左右
☎結果:沒有過度擬合overfitting現象,驗證資料集的誤差值0.76沒有明顯增高(0.79)
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-1-k:顯示模型的預測值
(1)觀念:神經網絡明顯經過訓練學習後,就可以進行預測:
(2)預測指令:使用y1 = model.predict(x1, batch_size=10)來進行預測
☎使用X_test,預測Y_pred
Y_pred = model.predict(X_test, batch_size=10)
(3)☎注意:這個糖尿病預測,輸出向量可以說一個輸出向量,或二個輸出向量
所以,模型的預測值有兩種可能(一個向量,或兩個向量)
(4)程式碼:處理1個輸出向量的神經網絡模型:
#1.將資料分割成輸入的訓練資料X,和標籤資料Y
#特徵資料集 = X = 前8個欄位(0~7) = 訓練資料用
#標籤資料集 = Y = 第9個欄位(8) = 目標值
X = dataset[:, 0:8]
Y = dataset[:, 8]
#特徵標準化
X -= X.mean(axis=0)
X /= X.std(axis=0)
#2.把資料集分割成訓練資料集,測試資料集
#前690筆,是訓練用資料
X_train, Y_train = X[:690], Y[:690]
#最後78筆(690以後筆數),是測試用資料
X_test, Y_test = X[690:], Y[690:]
#3.定義模型
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(10, input_shape=(8,), activation="relu"))
model.add(tf.keras.layers.Dense(6, activation="relu"))
model.add(tf.keras.layers.Dense(1, activation="sigmoid"))
#4.編譯模型
#目的:把上面keras建立好的四層神經網絡,編譯成低階的tensorflow計算圖
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
#5.訓練模型(用X_test,Y_test來做訓練)
history = model.fit(X_train, Y_train, epochs=20, validation_split=0.2, batch_size=10, verbose=0)
#6.進行預測(使用X_test,預測Y_pred)
Y_pred = model.predict(X_test, batch_size=10)
(5)程式碼:處理2個輸出向量的神經網絡模型:
#1.將資料分割成輸入的訓練資料X,和標籤資料Y
#特徵資料集 = X = 前8個欄位(0~7) = 訓練資料用
#標籤資料集 = Y = 第9個欄位(8) = 目標值
X = dataset[:, 0:8]
Y = dataset[:, 8]
#特徵標準化
X -= X.mean(axis=0)
X /= X.std(axis=0)
#2. One-hot編碼
Y = tf.keras.utils.to_categorical(Y)
#3.把資料集分割成訓練資料集,測試資料集
#前690筆,是訓練用資料
X_train, Y_train = X[:690], Y[:690]
#最後78筆(690以後筆數),是測試用資料
X_test, Y_test = X[690:], Y[690:]
#4.定義模型
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(10, input_shape=(8,), activation="relu"))
model.add(tf.keras.layers.Dense(6, activation="relu"))
model.add(tf.keras.layers.Dense(2, activation="softmax"))
#5.編譯模型
#目的:把上面keras建立好的四層神經網絡,編譯成低階的tensorflow計算圖
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
#6.訓練模型(用X_test,Y_test來做訓練)
history = model.fit(X_train, Y_train, epochs=20, validation_split=0.2, batch_size=10, verbose=0)
#7.進行預測(使用X_test,預測Y_pred)
Y_pred = model.predict(X_test, batch_size=10)
(6)程式:延續範例11-1-j
(7)成果:
☎結果1:單一輸出向量,預測值接近0,表示預測不會得到糖尿病
☎結果2:兩個輸出向量,預測值接近[1,0],第一個值=1表示預測不會得到糖尿病,第二個值=1表示預測會得到糖尿病
(8)模型預測糖尿病(比較,輸出一個向量,輸出二個向量)的程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
(9)模型預測糖尿病(輸出二個向量)的程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-2-a:預測波士頓房價/Boston Housing price regression:讀入csv資料集
☎人工智慧的最常見用途:分類,迴歸
☎本範例方法:讀入csv,用Keras預測預測波士頓房價/Boston Housing price regression
☎目的:迴歸問題(找出波士頓房價的趨勢線)
(11-2a-1)教學文件:
☎Regression with Keras
☎回归问题(boston_housing数据为例)
☎Tutorial: Basic Regression
☎TENSORFLOW 2 – REGRESSION ON THE BOSTON HOUSING DATASET. PART 2 – KERAS CALLBACKS
☎浅入浅出用Keras实现波士顿房价预测
☎【keras實戰】波士頓房價預測
☎从零开始学keras之预测房价
(11-2a-2)讀入csv的方法:
(1)在anconda讀入csv:
import pandas as pd
df = pd.read_csv("./diabetes.csv")
(2)在colaboratory讀入csv:方法1
☎注意:diabetes.csv已經上傳到google drive裡面了
在colaboratory的python讀入google drive裡面的diabetes.csv
from google.colab import drive
drive.mount('/content/drive')
df = pd.read_csv("./diabetes.csv")
(3)在colaboratory讀入csv:方法2
☎注意:diabetes.csv在自己的個人電腦硬碟裡
#上傳diabetes.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])))
# 確認diabetes.csv是否已上載
!ls *.* -l
# use Pandas to read diabetes.csv
df = pd.read_csv("./diabetes.csv")
print(df)
(11-2a-3)下載波士頓房價資料集/Boston Housing price dataset:
(1)下載波士頓房價資料集
(2)波士頓房價資料集結構分析:
☎該資料集包含美國人口普查局收集的美國麻塞諸塞州波士頓住房價格的有關資訊, 資料集很小,只有506個案例。
☎boston_housing資料集對房價資料進行回歸分析,資料來自1970年代,波斯頓周邊地區的房價,是用於機器學習的經典資料集。
☎注意:這個資料集很小,共計506條資料,分為404個訓練樣本和102個測試樣本,因此需要採用K-Fold交叉驗證法(把資料集折成很多折,分區訓練與驗證),這裡取K=4。
☎資料集都有以下14個屬性:
☎資料集來源:https://www.heywhale.com/mw/dataset/590bd595812ede32b73f55f2
☎資料集來源:https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_boston.html
☎資料集共14個欄位(前面13個特徵變數,最後1個是目標變數Outcome)。
☎預測變數包括:患者的懷孕次數,BMI,胰島素水準,年齡等。如下圖所示:
No
属性
数据类型
字段描述
1
CRIM
Float
城镇人均犯罪率
2
ZN
Float
占地面积超过2.5万平方英尺的住宅用地比例
3
INDUS
Float
城镇非零售业务地区的比例
4
CHAS
Integer
查尔斯河虚拟变量 (= 1 如果土地在河边;否则是0)
5
NOX
Float
一氧化氮浓度(每1000万份)
6
RM
Float
平均每居民房数
7
AGE
Float
在1940年之前建成的所有者占用单位的比例
8
DIS
Float
与五个波士顿就业中心的加权距离
9
RAD
Integer
辐射状公路的可达性指数
10
TAX
Float
每10,000美元的全额物业税率
11
PTRATIO
Float
城镇师生比例
12
B
Float
1000(Bk - 0.63)^ 2其中Bk是城镇黑人的比例
13
LSTAT
Float
人口中地位较低人群的百分数
14
MEDV
Float
(目标变量/类别属性)以1000美元计算的自有住房的中位数
(11-2a-4)讀入csv檔案,印出前5筆,印出資料集的size(row,column)=(筆數,欄位數)
☎成果:
☎程式碼:
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-2-b:建立模型來訓練波士頓房價資料集
☎人工智慧的最常見用途:分類,迴歸
☎本範例方法:讀入csv,用Keras預測預測波士頓房價/Boston Housing price regression
☎目的:迴歸問題(找出波士頓房價的趨勢線)
(11-2a-1)教學文件:
☎Regression with Keras
☎回归问题(boston_housing数据为例)
☎Tutorial: Basic Regression
☎TENSORFLOW 2 – REGRESSION ON THE BOSTON HOUSING DATASET. PART 2 – KERAS CALLBACKS
☎浅入浅出用Keras实现波士顿房价预测
☎【keras實戰】波士頓房價預測
☎从零开始学keras之预测房价
(11-2b-2)建立深度學習神經網絡模型(三層):
☎輸入層:13個神經元(訓練特徵值的數目)
☎dense隱藏層:32個神經元
☎輸出層:這是個預測房價問題,目標標籤y=房價
所以,輸出是一個神經元(數字)
(11-2b-3)建立三層神經層:
keras使用Sequential來建立神經層:
☎建立model指令:model = Sequential()
☎加入三層網絡:
範例:
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(32, input_shape=(X_train.shape[1],), activation="relu"))
model.add(tf.keras.layers.Dense(1))
☎參數說明:
(1)第1層:輸入層,不需要建立
(2)第2層:隱藏層,model.add(Dense(設定參數))
☎參數units:神經元數目
☎參數input_shape:設定輸入層的形狀 =(樣本數,輸出維度)
例如:輸入向量size = 13 = X_train.shape[1],為13個特徵數
☎參數activation:設定激勵函數,例如:activation="relu",設定ReLU函數
(4)第3層:輸出層,model.add(Dense(設定參數))
☎範例:model.add(Dense(1))
建立一個輸出層,設定一個神經元
(11-2b-4)顯示神經網絡模型的摘要資訊:
☎指令:model.summary()
(11-2b-5)編譯模型:
☎目的:把上面keras建立好的三層神經網絡,編譯成低階的tensorflow計算圖
☎指令:model.compile(設定參數)
☎範例:model.compile(loss="mse", optimizer="adam", metrics=["mae"])
☎參數說明:
(1).loss參數:損失函數的名稱,迴歸常用的函數,例如:均方誤差(mse)
下表是『激勵函數 vs 損失函數對應表』
☎二元分類,
所以『激勵函數/啟動函數 = sigmoid』,
所以『損失函數 = binary_crossentropy』
(2).迴歸問題損失函數:
☎迴歸和分類,必須使用不同的損失函數,
☎在迴歸中的損失函數:
通常使用:Mean Square Error(MSE)
☎範例:model.compile(loss="mse", optimizer="adam", metrics=["mae"])
(3).在迴歸問題任務(對連續值的預測)中,常見的評估指標(Metric)有:
☎平均絕對誤差(Mean Absolute Error,MAE),例如:metrics=["mae"]
☎均方誤差(Mean Square Error,MSE),例如:metrics=["mse"]
☎均方根誤差(Root Mean Square Error,RMSE),例如:metrics=["rmse"]
☎平均絕對百分比誤差(Mean Absolute Percentage Error,MAPE),例如:metrics=["mape"]
☎其中用得最為廣泛的就是:MAE和MSE。
☎範例:model.compile(loss="mse", optimizer="adam", metrics=["mae"])
(4).比較:迴歸 vs 分類問題的『評價標準』(metrics=["..."]):
☎迴歸問題:通常使用Mean Absolute Error(MAE),例如:metrics=["mae"],
☎分類問題:通常使用accuracy,例如:metrics=["accuracy"]
☎當樣本資料量小的時候,通常使用K-Fold方法使訓練的模型,才會更可靠
☎分類-範例:model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
☎迴歸-範例:model.compile(loss="mse", optimizer="adam", metrics=["mae"])
(5).誤差名詞的定義:
☎mse 損失函數,即均方誤差(MSE,mean squared error),預測值與目標值之差的平方。這是回歸問題常用的損失函數。
☎平均絕對誤差(MAE,mean absolute error)。它是預測值與目標值之差的絕對值。
☎我們評估標準是MAE越小,即預測值與真實值越接近,模型效果越好。
(2).optimizer參數:優化器,就是所使用的『梯度下降法 gradient descent』,keras可以設定多種類的梯度下降法
☎範例:optimizer="adam"
(3).metrics參數:設定『訓練模型』,『評估模型』的評估標準,所以這個是個list清單[....]
迴歸問題通常使用『mae』
☎範例:metrics=["mae"]
☎平均絕對誤差(MAE,mean absolute error)。它是預測值與目標值之差的絕對值。
☎我們評估標準是MAE越小,即預測值與真實值越接近,模型效果越好。
(11-2b-6)訓練模型:
☎目的:把特徵資料數據,放入上面模型來訓練
☎指令:model.fit(設定參數)
☎範例:history = model.fit(X_train, Y_train, epochs=150, batch_size=10, verbose=0)
☎參數說明:
(1).X, Y參數:X是輸入資料(特徵資料),Y是輸出資料(目標值,標籤資料)
(2).epochs參數:epochs是訓練週期的次數,epochs=150代表總共訓練150次
(3).batch_size參數:batch_size是批次尺寸
(11-2b-7)評估模型的效能:
☎指令:model.evaluate(設定參數)
☎範例:mse,mae = model.evaluate(X_train, Y_train)
☎參數說明:
(1).X, Y參數:X是輸入資料(特徵資料),Y是輸出資料(目標值,標籤資料)
(2).verbose參數:訓練過程輸出方式,若verbose=0則不輸出資訊,若verbose=1則輸出資訊
☎訓練用資料集的損失函數 = 均方誤差(mse) = mse越小越好,代表誤差越小
☎訓練用資料集的評估效率 = 平均絕對誤差(mae) = mae越小越好,代表越接近標準答案
(11-2b-8)若要畫圖,則編譯模型的評估函數必須用全名(mean_absolute_error),不用簡稱(mae)
#16.編譯模型
model.compile(loss="mse", optimizer="adam", metrics=['mean_squared_error','mean_absolute_error'])
#17.訓練模型(用X_train, Y_train來做訓練)
history = model.fit(X_train, Y_train, epochs=500, batch_size=10, verbose=0)
#18.畫出val_loss(validation loss)歷史圖,當val_loss最低點就是最佳訓練週期
import matplotlib.pyplot as plt
loss = history.history['mean_squared_error']
epochs = range(1,len(loss)+1)
plt.plot(epochs, loss, "r", label="mse")
plt.title("Training_Loss(mse)")
plt.xlabel("epochs")
plt.ylabel("Accuracy")
plt.legend()
plt.show()
(11-2b-9)成果:
(11-2b-10)程式碼:
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-2c:使用定義函數來建立模型+編譯模型:model=def bulid_mode()
☎人工智慧的最常見用途:分類,迴歸
☎本範例方法:讀入csv,用Keras預測預測波士頓房價/Boston Housing price regression
☎目的:迴歸問題(找出波士頓房價的趨勢線)
(11-2c-1)使用定義函數來建立模型:model=def bulid_mode():
☎程式碼:
#10.定義模型(加入三層網絡:輸入層,隱藏層,輸出層)
def build_model():
# 建立模型+編譯模型:
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(32, input_shape=(X_train.shape[1],), activation="relu"))
model.add(tf.keras.layers.Dense(1))
model.summary()
model.compile(loss="mse", optimizer="adam", metrics=["mae"])
return model
☎注意:最後要加上『return model』
(11-2c-2)宣告模型變數:model=def bulid_mode():
☎程式碼:
# 宣告一個模型變數
model = build_model()
# 訓練模型(用X_train, Y_train來做訓練)
history = model.fit(X_train, Y_train, epochs=150, batch_size=10, verbose=0)
(11-2c-3)成果:
(11-2c-4)程式碼:
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-2-d:當資料集數目少時可用k-摺疊交叉驗證法(k fold cross validation)
☎本範例方法:讀入csv,用Keras預測預測波士頓房價/Boston Housing price regression
☎問題:當資料集數目少(只有500多筆資料),又要訓練,又要驗證,資料會不夠
☎改善方法:交叉驗證法(k fold cross validation),把資料集分成很多分隔區partitions,當一區作為驗證用時,其它區就當作訓練用
(11-2c-1)為什麼除了『訓練資料集,測試資料集』外,還要有『驗證資料集』?
☎(1)因為:若只用『訓練資料集,測試資料集』,往往會出現『過度擬合overfitting,泛化不足』,這可能是因為過度學習導致的
☎(2)所以,必須用『驗證資料集』,找出『最佳的訓練週期』
☎(3)若是已經找出『最佳的訓練週期』了,就可以在此週期下,重新只用『訓練資料集,測試資料集』來訓練模型
(11-2c-2)k-摺疊交叉驗證法:
☎程式碼:
☎nb_val_samples :每一折的樣本數。
☎nb_epochs = 80,nb_epochs是訓練週期數。
☎mae_scores = [],mae_scores清單變數,乃是記錄著每次迴圈評估模型的mae。
☎for i in range(k):共執行迴圈k=4次,用『切割運算子』取出第k個驗證資料集:X_val,Y_val
☎再用concatenate()函數取出剩下的折來建立訓練資料集:X_train_p,Y_train_p
程式碼
(11-2c-3)成果:
☎結果:共執行4次(即4折疊),每一折驗證資料的樣本數是101筆,最後顯示驗證資料,與測試資料的MSE,MAE。
☎MSE,MAE的單位是100美金/誤差。
☎例如:MAE=3.302,表示房價誤差=3305美金。
(11-2c-4)神經網絡模型程式碼:
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-2-e:使用四層神經網絡,來降低誤差
☎本範例方法:讀入csv,用Keras預測預測波士頓房價/Boston Housing price regression
☎問題:前面是三層神經網絡,現在測試使用四層神經網絡,是否可以降低誤差?
☎改善:用二層隱藏層,分別使用32個,16個神經元
(11-2c-1)程式碼:
☎使用11-2-d範例,來修改
(11-2c-2)成果:
☎測試資料集:MAE=2.223,表示房價誤差=2223美金。
☎表示誤差變小(房價誤差:由3305->2223美金)
(11-2c-3)神經網絡模型程式碼:
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-2-f:由『驗證資料集』找出避免overfitting的『最佳週期』後,就只用『訓練資料集,測試資料集』重新訓練模型
☎本範例方法:讀入csv,用Keras預測預測波士頓房價/Boston Housing price regression
☎問題:前面是使用『訓練資料集,測試資料集,驗證資料集』,用『驗證資料集』,可以找出『最佳的訓練週期』
☎目的:一旦由『驗證資料集』找出避免overfitting的『最佳週期=80』後,就只用『訓練資料集,測試資料集』重新訓練模型
(11-2f-1)為什麼除了『訓練資料集,測試資料集』外,還要有『驗證資料集』?
☎(1)因為:若只用『訓練資料集,測試資料集』,往往會出現『過度擬合overfitting,泛化不足』,這可能是因為過度學習導致的
☎(2)所以,必須用『驗證資料集』,找出『最佳的訓練週期=80』
☎(3)若是已經找出『最佳的訓練週期』了,就可以在此週期下(80),重新只用『訓練資料集,測試資料集』來訓練模型
(11-2f-1)程式碼:
☎使用11-2-b範例,來修改
(11-2f-2)成果:
☎測試資料集:MAE=2.16,表示房價誤差=2160美金。
☎表示誤差變小(房價誤差:由3305->2223->2160美金)
(11-2f-3)神經網絡模型程式碼:
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-2-g:同時一次儲存已經訓練好的模型『結構,權重』
☎本範例:用Keras預測預測波士頓房價/Boston Housing price regression
☎問題:若已經訓練好模型,過了一段時間,要用這個模型來預測,就必須要先把已經訓練好的模型參數,儲存起來
☎目的:儲存已經訓練好的模型的『結構,參數』
(11-2g-1)儲存已經訓練好的模型的『結構,權重』參數,有兩種方法:
☎(1)同時一次儲存模型的『結構,權重』
☎(2)分開儲存模型的『結構,權重』
(11-2g-2)程式碼:
☎(1)同時一次儲存模型的『結構,權重』
# 儲存模型結構和權重
model.save("k11-2g-1.h5")
☎(2)分開儲存模型的『結構,權重』
(11-2g-3)成果(同時一次儲存)
(1)成果圖片:
☎輸入:ls,可以查詢目錄的檔案
☎輸入:cat k11-2g-1.h5,可以打開檔案
(2)神經網絡模型程式碼:
3.程式碼(anaconda程式碼)
範例11-2-h:一次讀入已經訓練好的模型『結構,權重』
☎本範例:用Keras預測預測波士頓房價/Boston Housing price regression
☎問題:若已經訓練好模型,過了一段時間,要用這個模型來預測,就必須要先把已經訓練好的模型參數,儲存起來
☎目的:一次讀入已經訓練好的模型『結構,參數』
(11-2h-1)儲存已經訓練好的模型的『結構,權重』參數,有兩種方法:
☎(1)同時一次儲存模型的『結構,權重』
☎(2)分開儲存模型的『結構,權重』
(11-2h-2)程式碼:
☎(1)同時一次讀入模型的『結構,權重』
# 讀入模型
model = tf.keras.models.Sequential()
model = tf.keras.models.load_model("k11-2g-1.h5")
☎(2)分開讀入模型的『結構,權重』
(11-2h-3)成果(同時一次讀入模型的『結構,權重』)
(1)成果圖片:
☎注意三步驟:(必須在同一個cola檔案上執行,才能夠讀取到k11-2g-1.h5,若是分開兩個檔案執行,則*.h5會消失)
A.先執行:k11-2g-3的程式
B.然後執行:ls
C.然後執行:k11-2h-3的程式
☎輸入:ls,可以查詢目錄的檔案
☎輸入:cat k11-2g-1.h5,可以打開檔案
(2)神經網絡模型程式碼:
3.程式碼(anaconda程式碼)
範例11-2-i:分開儲存已經訓練好的模型『結構,權重』
☎本範例:用Keras預測預測波士頓房價/Boston Housing price regression
☎問題:若已經訓練好模型,過了一段時間,要用這個模型來預測,就必須要先把已經訓練好的模型參數,儲存起來
☎目的:分開儲存已經訓練好的模型的『結構,參數』
(11-2i-1)儲存已經訓練好的模型的『結構,權重』參數,有兩種方法:
☎(1)同時一次儲存模型的『結構,權重』
☎(2)分開儲存模型的『結構,權重』
(11-2i-2)程式碼:
☎(1)同時一次儲存模型的『結構,權重』
☎(2)分開儲存模型的『結構,權重』
# 儲存模型結構
json_str = model.to_json()
with open("k11_2i_Model.config", "w") as text_file:
text_file.write(json_str)
# 儲存模型權重
model.save_weights("k11_2i_Model.weight")
(11-2i-3)成果(分開儲存模型的『結構,權重』)
(1)成果圖片:
☎注意3步驟:
A.先執行:k11-2i-3的程式
B.然後執行:ls
C.然後執行:cat k11_2i_Model.config,可以打開檔案
(2)神經網絡模型程式碼:
3.程式碼(anaconda程式碼)
範例11-2-j:分開讀入已經訓練好的模型『結構,權重』
☎本範例:用Keras預測預測波士頓房價/Boston Housing price regression
☎問題:若已經訓練好模型,過了一段時間,要用這個模型來預測,就必須要先把已經訓練好的模型參數,儲存起來
☎目的:分開讀入已經訓練好的模型的『結構,參數』
(11-2j-1)儲存已經訓練好的模型的『結構,權重』參數,有兩種方法:
☎(1)同時一次儲存模型的『結構,權重』
☎(2)分開儲存模型的『結構,權重』
(11-2j-2)程式碼:
☎(1)同時一次儲存模型的『結構,權重』
☎(2)分開儲存模型的『結構,權重』
# 儲存模型結構
json_str = model.to_json()
with open("k11_2i_Model.config", "w") as text_file:
text_file.write(json_str)
# 儲存模型權重
model.save_weights("k11_2i_Model.weight")
(11-2j-3)成果(分開讀入儲存模型的『結構,權重』)
(1)成果圖片:
☎注意三步驟:(必須在同一個cola檔案上執行,才能夠讀取到k11-2i-1.h5,若是分開兩個檔案執行,則*.h5會消失)
A.先執行:k11-2i-3的程式
B.然後執行:ls
C.然後執行:k11-2j-3的程式(讀取已經儲存的檔案)
(2)神經網絡模型程式碼:
3.程式碼(anaconda程式碼)
範例11-3-a:鳶尾花資料集(The iris dataset)的多元分類:讀入csv資料集
☎人工智慧的最常見用途:分類,迴歸
☎本範例方法:讀入csv,用Keras做鳶尾花資料集的多元分類/The iris dataset
☎目的:讀入鳶尾花資料集(The iris dataset),並印出前5筆
(11-3a-1)教學文件:
☎Keras之對鳶尾花識別
☎Keras多分類例項:鳶尾花
☎Classifying the Iris Data Set with Keras
☎Deep Learning with Keras on Iris Dataset
☎Keras之對鳶尾花識別
(11-3a-2)鳶尾花資料集欄位說明:
了解數據集
鳶尾花數據集是一個經典的機器學習數據集,非常適合用來入門。
鳶尾花數據集鏈接:下載鳶尾花數據集
鳶尾花數據集包含四個特徵和一個標籤。這四個特徵確定了單株鳶尾花的下列植物學特徵:
花萼長度:sepal_length
花萼寬度:sepal_width
花瓣長度:petal_length
花瓣寬度:petal_width
鳶尾花種類:target(包括:setosa, versicolor, virginica)
該表確定了鳶尾花品種,品種必須是下列任意一種:
山鳶尾 Iris-Setosa(0)
雜色鳶尾 Iris-versicolor(1)
維吉尼亞鳶尾 Iris-virginica(2)
數據集中三類鳶尾花各含有50個樣本,共150各樣本
(11-3a-2)讀入csv的方法:
(1)在anconda讀入csv:
import pandas as pd
df = pd.read_csv("./diabetes.csv")
(2)在colaboratory讀入csv:方法1
☎注意:diabetes.csv已經上傳到google drive裡面了
在colaboratory的python讀入google drive裡面的diabetes.csv
from google.colab import drive
drive.mount('/content/drive')
df = pd.read_csv("./diabetes.csv")
(3)在colaboratory讀入csv:方法2
☎注意:diabetes.csv在自己的個人電腦硬碟裡
#上傳diabetes.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])))
# 確認diabetes.csv是否已上載
!ls *.* -l
# use Pandas to read diabetes.csv
df = pd.read_csv("./diabetes.csv")
print(df)
(11-3a-3)下載鳶尾花資料集(The iris dataset):
(1)下載鳶尾花csv資料集
(2)鳶尾花資料集說明:
☎資料集包含了150個樣本,都屬於鳶尾屬下的三個亞屬,分別是山鳶尾、變色鳶尾和維吉尼亞鳶尾。
☎四個特徵被用作樣本的定量分析,它們分別是花萼和花瓣的長度和寬度。基於這四個特徵的集合,費雪發展了一個線性判別分析以確定其屬種。
(11-3a-4)讀入csv檔案,印出前5筆,印出資料集的size(row,column)=(筆數,欄位數)
☎成果:
☎程式碼:
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-3-b:繪圖(散佈圖,seabron繪圖庫):鳶尾花資料集
☎人工智慧的最常見用途:分類,迴歸
☎本範例方法:讀入csv,用Keras做鳶尾花資料集的多元分類/The iris dataset
☎目的:將鳶尾花資料集(The iris dataset),執行繪圖視覺化,做兩種繪圖:散佈圖scatter,seabron繪圖庫
(11-3b-1)教學文件:
☎Keras之對鳶尾花識別
☎Keras多分類例項:鳶尾花
☎Classifying the Iris Data Set with Keras
☎Deep Learning with Keras on Iris Dataset
☎Keras之對鳶尾花識別
(11-3b-2)顯示花瓣,花萼的長寬散佈圖:
☎紅色點:山鳶尾 Iris-Setosa(0)
☎綠色點:雜色鳶尾 Iris-versicolor(1)
☎黃色點:維吉尼亞鳶尾 Iris-virginica(2)
☎方法:為了顯示彩色圖,所以要把df(dataframe)的traget欄位,轉換成0~2的整數(Y)。
☎colmap[Y]:是讀取色彩對照表(對應到:red, green, yellow)
☎程式碼:
3.程式碼
df = pd.read_csv("./iris_data.csv")
target_mapping = {"setosa": 0,
"versicolor": 1,
"virginica": 2}
Y = df["target"].map(target_mapping)
# 使用Matplotlib顯示視覺化圖表
colmap = np.array(["r", "g", "y"])
plt.figure(figsize=(10,5))
plt.subplot(1, 2, 1)
plt.subplots_adjust(hspace = .5)
plt.scatter(df["sepal_length"], df["sepal_width"], color=colmap[Y])
plt.xlabel("Sepal Length")
plt.ylabel("Sepal Width")
plt.subplot(1, 2, 2)
plt.scatter(df["petal_length"], df["petal_width"], color=colmap[Y])
plt.xlabel("Petal Length")
plt.ylabel("Petal Width")
plt.show()
(11-3b-3)資料集視覺化:seabron繪圖庫
(1)seabron是一個功能強大的python繪圖庫,由於其簡易使用的特性,以及與pandas高度整合的特性,使得seaborn受到資料科學家的歡迎
(2)seaborn為python繪圖函式庫,以matplotlib為基礎封裝了許多實用的統計圖表
(3)參考:教學文件
(4)安裝seaborn:
pip install seaborn
(4)使用(x,y)繪製一個seaborn圖:
sns.relplot(x="total_bill", y="tip", data=tips)
(5)使用df(dataframe)繪圖
import seaborn as sns
sns.pairplot(df, hue="target")
☎成果:
☎程式碼:
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)
範例11-3-c:建立鳶尾花資料集(The iris dataset)的神經網絡模型,並輸入結構與權重檔案
☎人工智慧的最常見用途:分類,迴歸
☎本範例方法:讀入csv,用Keras做鳶尾花資料集的多元分類/The iris dataset
☎目的:讀入鳶尾花資料集(The iris dataset),建立神經網絡模型
(11-3c-1)教學文件:
☎Keras之對鳶尾花識別
☎Keras多分類例項:鳶尾花
☎Classifying the Iris Data Set with Keras
☎Deep Learning with Keras on Iris Dataset
☎Keras之對鳶尾花識別
(11-3c-2)建立深度學習神經網絡模型(四層):
☎輸入層:4個神經元(訓練特徵值的數目)
☎第1 dense隱藏層:6個神經元
☎第2 dense隱藏層:6個神經元
☎輸出層:3個神經元(三類花名)
(11-3c-3)建立四層神經層:
keras使用Sequential來建立神經層:
☎建立model指令:model = Sequential()
☎加入四層網絡:
範例:
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"))
☎參數說明:
(1)第1層:輸入層,不需要建立
(2)第2層:隱藏層,model.add(Dense(設定參數))
☎參數units:神經元數目
☎參數input_shape:設定輸入層的形狀 =(樣本數,輸出維度)
例如:輸入向量size = 13 = X_train.shape[1],為13個特徵數
☎參數activation:設定激勵函數,例如:activation="relu",設定ReLU函數
(4)第3層:輸出層,model.add(Dense(設定參數))
☎範例:model.add(Dense(1))
建立一個輸出層,設定一個神經元
(11-3c-4)顯示神經網絡模型的摘要資訊:
☎指令:model.summary()
(11-3c-5)編譯模型:
☎目的:把上面keras建立好的三層神經網絡,編譯成低階的tensorflow計算圖
☎指令:model.compile(設定參數)
☎範例:model.compile(loss="mse", optimizer="adam", metrics=["mae"])
☎參數說明:
(1).loss參數:損失函數的名稱,迴歸常用的函數,例如:均方誤差(mse)
下表是『激勵函數 vs 損失函數對應表』
☎二元分類,
所以『激勵函數/啟動函數 = sigmoid』,
所以『損失函數 = binary_crossentropy』
(2).迴歸問題損失函數:
☎迴歸和分類,必須使用不同的損失函數,
☎在迴歸中的損失函數:
通常使用:Mean Square Error(MSE)
☎範例:model.compile(loss="mse", optimizer="adam", metrics=["mae"])
(3).在迴歸問題任務(對連續值的預測)中,常見的評估指標(Metric)有:
☎平均絕對誤差(Mean Absolute Error,MAE),例如:metrics=["mae"]
☎均方誤差(Mean Square Error,MSE),例如:metrics=["mse"]
☎均方根誤差(Root Mean Square Error,RMSE),例如:metrics=["rmse"]
☎平均絕對百分比誤差(Mean Absolute Percentage Error,MAPE),例如:metrics=["mape"]
☎其中用得最為廣泛的就是:MAE和MSE。
☎範例:model.compile(loss="mse", optimizer="adam", metrics=["mae"])
(4).比較:迴歸 vs 分類問題的『評價標準』(metrics=["..."]):
☎迴歸問題:通常使用Mean Absolute Error(MAE),例如:metrics=["mae"],
☎分類問題:通常使用accuracy,例如:metrics=["accuracy"]
☎當樣本資料量小的時候,通常使用K-Fold方法使訓練的模型,才會更可靠
☎分類-範例:model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
☎迴歸-範例:model.compile(loss="mse", optimizer="adam", metrics=["mae"])
(5).誤差名詞的定義:
☎mse 損失函數,即均方誤差(MSE,mean squared error),預測值與目標值之差的平方。這是回歸問題常用的損失函數。
☎平均絕對誤差(MAE,mean absolute error)。它是預測值與目標值之差的絕對值。
☎我們評估標準是MAE越小,即預測值與真實值越接近,模型效果越好。
(2).optimizer參數:優化器,就是所使用的『梯度下降法 gradient descent』,keras可以設定多種類的梯度下降法
☎範例:optimizer="adam"
(3).metrics參數:設定『訓練模型』,『評估模型』的評估標準,所以這個是個list清單[....]
迴歸問題通常使用『mae』
☎範例:metrics=["mae"]
☎平均絕對誤差(MAE,mean absolute error)。它是預測值與目標值之差的絕對值。
☎我們評估標準是MAE越小,即預測值與真實值越接近,模型效果越好。
(11-3c-6)訓練模型:
☎目的:把特徵資料數據,放入上面模型來訓練
☎指令:model.fit(設定參數)
☎範例:history = model.fit(X_train, Y_train, epochs=150, batch_size=10, verbose=0)
☎參數說明:
(1).X, Y參數:X是輸入資料(特徵資料),Y是輸出資料(目標值,標籤資料)
(2).epochs參數:epochs是訓練週期的次數,epochs=150代表總共訓練150次
(3).batch_size參數:batch_size是批次尺寸
(11-3c-7)評估模型的效能:
☎指令:model.evaluate(設定參數)
☎範例:mse,mae = model.evaluate(X_train, Y_train)
☎參數說明:
(1).X, Y參數:X是輸入資料(特徵資料),Y是輸出資料(目標值,標籤資料)
(2).verbose參數:訓練過程輸出方式,若verbose=0則不輸出資訊,若verbose=1則輸出資訊
☎訓練用資料集的損失函數 = 均方誤差(mse) = mse越小越好,代表誤差越小
☎訓練用資料集的評估效率 = 平均絕對誤差(mae) = mae越小越好,代表越接近標準答案
(11-3c-9)成果:並輸入結構與權重檔案
A.先執行:k11-3c-c的程式
B.然後執行:ls(查看檔案)
C.然後執行:cat iris.h5(可以打開檔案)
(11-3c-10)程式碼:
3.程式碼(在colaboratory的python讀入個人電腦硬碟裡的資料集)