Posted on

Keras介紹

甚麼是Keras

Keras是一個用Python編寫的開源神經網路庫,旨在快速實現深度神經網路,專注於使用者友好、模組化和可延伸性,除標準神經網路外,Keras還支援卷積神經網路和迴圈神經網路。包含許多常用神經網路構建塊的實現,例如層、目標、啟用功能、最佳化器和一系列工具,可以更輕鬆地處理圖像和文字資料。

Keras由純Python編寫而成並基於Tensorflow、Theano以及CNTK後端。Keras 為支持快速實驗而生,能夠把你的idea迅速轉換為結果,如果你有如下需求,請選擇Keras:

  • 簡易和快速的原型設計(keras具有高度模塊化,極簡,和可擴充特性)
  • 支持CNN和RNN,或二者的結合
  • 無縫CPU和GPU切換

Keras建立模型的流程

  • 載入數據集: 首先,您需要載入您要用來訓練模型的圖像數據集。您可以使用 Python 的數據讀取庫(如 pandas 或 numpy) 來讀取本地數據集,或者使用 Keras 自帶的數據集(如 MNIST 手寫數字數據集)。
  • 將數據拆分為訓練集和測試集: 接下來,您需要將數據集拆分為訓練集和測試集。這樣可以幫助您評估模型的表現。通常,您會將大約 80% 的數據集用於訓練,剩餘的 20% 用於測試。
  • 預處理數據: 在進行模型訓練之前,您需要對數據進行預處理。這可能包括將圖像大小轉換為相同的大小,標準化像素值等。
  • 建立模型: 接下來,您可以使用 Keras 來建立模型。Keras 提供了許多不同的模型建構器(如 Sequential 或 functional API),您可以使用它們來建立不同類型的模型。在建立模型時,您需要考慮使用哪種模型類型(如卷積神經網絡或長短期記憶網絡)、使用哪些層類型(如卷積層、池化層、全連接層等),以及如何連接這些層。在決定模型結構時,您可以參考相關研究或嘗試不同的組合以找出最佳的模型結構。
  • 編譯模型: 一旦您已經建立了模型,您需要使用 Keras 的 compile 方法將其編譯。在編譯時,您需要指定損失函數和優化器。損失函數用於評估模型的表現,優化器用於更新模型的權重以使損失最小化。
  • 訓練模型: 一旦您已經編譯了模型,您就可以使用 Keras 的 fit 方法對模型進行訓練。在訓練過程中,您需要指定訓練集和模型訓練的參數,如批次大小和訓練輪數。
  • 評估模型: 一旦模型訓練完成,您就可以使用 Keras 的 evaluate 方法對模型進行評估。評估時,您需要指定測試集,Keras 會自動計算損失和指標(如準確率)。
  • 使用模型: 一旦您已經訓練好了模型,就可使用model.predict來預測資料

與Tensorflow的關係

TensorFlow是一個用於構建和訓練模型的平台。它提供了很多功能,可以讓你輕鬆地構建、訓練和部署各種不同類型的模型。

Keras是一個用於構建和訓練深度學習模型的高階框架。它是在TensorFlow之上構建的,可以讓你輕鬆地使用TensorFlow的功能。

总之,TensorFlow是一個底層的框架,Keras是建立在TensorFlow之上的高階框架,可以讓你更輕鬆地構建和訓練模型。

基礎範例

這是一個建立模型的範例,主要用以做為圖片分類的神經學習,使用了下面幾種模型結構:
1、卷積層: 可以使用一或多個卷積層來提取圖像中的特徵。
2、池化層: 可以使用池化層來縮小圖像的尺寸,並且保留有用的特徵。
3、全連接層: 可以使用一或多個全連接層來將特徵轉換為預測結果。

from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from keras.models import Sequential
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
# X_train 和 y_train 都是 NumPy 陣列
images = np.array(images)
labels= np.array(labels)
# 如果 y_train 是字符串類型的標籤,則可以使用 sklearn 的 LabelEncoder 來將它們轉換為數值。例如:
le = LabelEncoder()
y_train = le.fit_transform(y_train)
# 分割為訓練集及驗證集
X_train, X_test, y_train, y_test = train_test_split(images, labels, test_size=0.2)
# 建立模型
model = Sequential()

# 加入卷積層
model.add(Conv2D(filters=32, kernel_size=(3,3), activation='relu', input_shape=(200,200,3)))

# 加入池化層
model.add(MaxPooling2D(pool_size=(2,2)))

# 加入卷積層
model.add(Conv2D(filters=64, kernel_size=(3,3), activation='relu'))

# 加入池化層
model.add(MaxPooling2D(pool_size=(2,2)))

# 將特徵圖拉平
model.add(Flatten())

# 加入全連接層
model.add(Dense(units=64, activation='relu'))

# 加入輸出層
model.add(Dense(units=52, activation='softmax'))

# 編譯模型
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# 開始訓練
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_test, y_test))

這是一個使用 Keras 載入模型並預測答案的範例

import numpy as np
import tensorflow as tf
from tensorflow import keras

# 載入模型
model = keras.models.load_model('model.h5')

# 假設我們有一個輸入矩陣 X,其中包含一些資料點
X = np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]])

# 使用模型預測答案
predictions = model.predict(X)

# 輸出預測結果
print(predictions)