Keras 模型編譯

2021-10-15 15:00 更新

之前,我們研究了如何使用 Sequential 和 Function API 創(chuàng)建模型的基礎(chǔ)知識(shí)。本章將介紹如何編譯模型。編譯是創(chuàng)建模型的最后一步。編譯完成后,我們就可以進(jìn)入訓(xùn)練階段。

首先,學(xué)習(xí)一些概念,有助于我們更好地理解編譯過(guò)程。

Loss 損失

在機(jī)器學(xué)習(xí)中,Loss 函數(shù)用于發(fā)現(xiàn)學(xué)習(xí)過(guò)程中的錯(cuò)誤或偏差。Keras 在模型編譯過(guò)程中需要損失函數(shù)。

Keras 在損失模塊中提供了不少的損失函數(shù),下面為大家羅列出來(lái):

  • mean_squared_error
  • mean_absolute_error
  • mean_absolute_percentage_error
  • squared_hinge
  • categorical_hinge
  • categorical_hine
  • huber_loss
  • categorical_crossentropy
  • sparse_categorical_crossentropy
  • binary_crossentropy
  • kullback_leibler_divergence
  • poisson
  • cosine_proximity
  • is_categorical_crossentropy

以上所有損失函數(shù)都接受兩個(gè)函數(shù):

  • y_true 作為 tensor 的真實(shí)標(biāo)簽
  • y_predy_true 形狀相同的預(yù)測(cè) 在使用下面指定的損失函數(shù)之前,首先要導(dǎo)入損失模塊:
    from keras import losses

Optimizer 優(yōu)化器

在機(jī)器學(xué)習(xí)中,optimizer 是通過(guò)比較預(yù)測(cè)和損失函數(shù)來(lái)優(yōu)化輸入權(quán)重的重要過(guò)程。Keras 提供了很多優(yōu)化器作為模塊,具體如下:

SGD 隨機(jī)梯度下降優(yōu)化器

keras.optimizers.SGD(learning_rate = 0.01, momentum = 0.0, nesterov = False)

RMSprop 優(yōu)化器

keras.optimizers.RMSprop(learning_rate = 0.001, rho = 0.9)

Adagrad 優(yōu)化器

keras.optimizers.Adagrad(learning_rate = 0.01)

Adadelta 優(yōu)化器

keras.optimizers.Adadelta(learning_rate = 1.0, rho = 0.95)

Adam 優(yōu)化器

keras.optimizers.Adam(
   learning_rate = 0.001, beta_1 = 0.9, beta_2 = 0.999, amsgrad = False
)

Adamax 優(yōu)化器。

from keras import optimizers

Metrics 指標(biāo)

在機(jī)器學(xué)習(xí)中,指標(biāo)用于評(píng)估模型的功能。它類似于損失函數(shù),但不用于訓(xùn)練過(guò)程。Keras也提供了許多的指標(biāo)作為模塊,詳細(xì)如下:

  • accuracy
  • binary_accuracy
  • categorical_accuracy
  • sparse_categorical_accuracy
  • top_k_categorical_accuracy
  • sparse_top_k_categorical_accuracy
  • cosine_proximity
  • clone_metric

和損失函數(shù)一樣,指標(biāo)一樣接受一下的兩種參數(shù):

  • y_true 作為 tensor 的真實(shí)標(biāo)簽
  • y_predy_true 形狀相同的預(yù)測(cè)

使用指標(biāo)需要導(dǎo)入指定的指標(biāo)模塊:

from keras import metrics

編譯模型

Keras 模型提供了一個(gè)方法compile()來(lái)編譯模型。compile()方法的參數(shù)和默認(rèn)值如下:

compile(
   optimizer, 
   loss = None, 
   metrics = None, 
   loss_weights = None, 
   sample_weight_mode = None, 
   weighted_metrics = None, 
   target_tensors = None
)

重要的論點(diǎn)如下:

  • 損失函數(shù)
  • 優(yōu)化器
  • 指標(biāo)

編譯模式的示例代碼如下:

from keras import losses 
from keras import optimizers 
from keras import metrics 


model.compile(loss = 'mean_squared_error',  
   optimizer = 'sgd', metrics = [metrics.categorical_accuracy])
  • 損失函數(shù)設(shè)置為mean_squared_error
  • 優(yōu)化器設(shè)置為sgd
  • 指標(biāo)設(shè)置為metrics.categorical_accuracy

模型訓(xùn)練

模型由 NumPy 數(shù)組使用fit()進(jìn)行訓(xùn)練。此擬合函數(shù)的主要目的是用于評(píng)估訓(xùn)練模型。這也可用于繪制模型性能。它具有以下語(yǔ)法:

model.fit(X, y, epochs = , batch_size = )
  • X, y 這是一個(gè)用于評(píng)估數(shù)據(jù)的元組。
  • epochs 在訓(xùn)練期間不需要評(píng)估模型的次數(shù)。
  • batch_size 訓(xùn)練實(shí)例。

讓我們舉一個(gè)簡(jiǎn)單的 numpy 隨機(jī)數(shù)據(jù)示例來(lái)使用這個(gè)概念。

創(chuàng)建數(shù)據(jù)

讓我們?cè)谙旅嫣岬降拿畹膸椭?,使?numpy 為 x 和 y 創(chuàng)建一個(gè)隨機(jī)數(shù)據(jù):

import numpy as np 


x_train = np.random.random((100,4,8)) 
y_train = np.random.random((100,10))

現(xiàn)在,創(chuàng)建隨機(jī)驗(yàn)證數(shù)據(jù):

x_val = np.random.random((100,4,8)) 
y_val = np.random.random((100,10))

創(chuàng)建模型

讓我們創(chuàng)建簡(jiǎn)單的順序模型:

from keras.models import Sequential model = Sequential()

添加圖層

創(chuàng)建圖層以添加模型:

from keras.layers import LSTM, Dense 


## add a sequence of vectors of dimension 16 
model.add(LSTM(16, return_sequences = True)) 
model.add(Dense(10, activation = 'softmax'))

編譯模型

模型已定義,可以使用以下命令進(jìn)行編譯:

model.compile(
   loss = 'categorical_crossentropy', optimizer = 'sgd', metrics = ['accuracy']
)

應(yīng)用fit()

現(xiàn)在我們應(yīng)用fit()函數(shù)來(lái)訓(xùn)練我們的數(shù)據(jù):

model.fit(x_train, y_train, batch_size = 32, epochs = 5, validation_data = (x_val, y_val))

創(chuàng)建一個(gè)多層感知器 ANN

我們已經(jīng)學(xué)會(huì)了創(chuàng)建、編譯和訓(xùn)練 Keras 模型。

讓我們應(yīng)用我們的學(xué)習(xí)并創(chuàng)建一個(gè)簡(jiǎn)單的基于 MPL 的 ANN。

數(shù)據(jù)集模塊

在創(chuàng)建模型之前,我們需要選擇一個(gè)問(wèn)題,需要收集所需的數(shù)據(jù)并將數(shù)據(jù)轉(zhuǎn)換為 NumPy 數(shù)組。收集數(shù)據(jù)后,我們可以準(zhǔn)備模型并使用收集的數(shù)據(jù)對(duì)其進(jìn)行訓(xùn)練。數(shù)據(jù)收集是機(jī)器學(xué)習(xí)中最困難的階段之一。Keras 提供了一個(gè)特殊的模塊數(shù)據(jù)集,用于下載在線機(jī)器學(xué)習(xí)數(shù)據(jù)以進(jìn)行訓(xùn)練。它從在線服務(wù)器獲取數(shù)據(jù),處理數(shù)據(jù)并將數(shù)據(jù)作為訓(xùn)練和測(cè)試集返回。讓我們檢查 Keras 數(shù)據(jù)集模塊提供的數(shù)據(jù)。模塊中可用的數(shù)據(jù)如下:

  • CIFAR10 小圖分類
  • CIFAR100 小圖像分類
  • IMDB電影評(píng)論情感分類
  • 路透社新聞專線主題分類
  • MNIST 手寫數(shù)字?jǐn)?shù)據(jù)庫(kù)
  • Fashion-MNIST 時(shí)尚文章數(shù)據(jù)庫(kù)
  • 波士頓房?jī)r(jià)回歸數(shù)據(jù)集

讓我們使用手寫數(shù)字(或 minst)的MNIST數(shù)據(jù)庫(kù)作為我們的輸入。minst 是 60,000 張 28x28 灰度圖像的集合。它包含 10 位數(shù)字。它還包含 10,000 張測(cè)試圖像。

下面的代碼可用于加載數(shù)據(jù)集:

from keras.datasets import mnist 


(x_train, y_train), (x_test, y_test) = mnist.load_data()
  • 第 1 行 從 keras 數(shù)據(jù)集模塊導(dǎo)入minst。
  • 第 3 行 調(diào)用load_data函數(shù),該函數(shù)將從在線服務(wù)器獲取數(shù)據(jù)并以 2 元組形式返回?cái)?shù)據(jù),第一個(gè)元組,(x_train, y_train)表示具有形狀的訓(xùn)練數(shù)據(jù),(number_sample, 28, 28)及其數(shù)字標(biāo)簽形狀(number_samples, )。第二個(gè)元組(x_test, y_test)表示具有相同形狀的測(cè)試數(shù)據(jù)。

創(chuàng)建模型

讓我們選擇一個(gè)簡(jiǎn)單的多層感知器 (MLP),如下所示,并嘗試使用 Keras 創(chuàng)建模型:

該模型的核心特征如下:

  • 輸入層由 784 個(gè)值 (28 x 28 = 784) 組成。
  • 第一個(gè)隱藏層,Dense由 512 個(gè)神經(jīng)元和“relu”激活函數(shù)組成。
  • 第二個(gè)隱藏層Dropout的值為 0.2。
  • 第三個(gè)隱藏層,同樣是 Dense,由 512 個(gè)神經(jīng)元和“relu”激活函數(shù)組成。
  • 第四個(gè)隱藏層,Dropout的值為 0.2。
  • 第五層也是最后一層由 10 個(gè)神經(jīng)元和“softmax”激活函數(shù)組成。
  • 使用categorical_crossentropy作為損失函數(shù)。
  • 使用RMSprop()作為優(yōu)化器。
  • 使用準(zhǔn)確性作為指標(biāo)。
  • 使用 128 作為批量大小。
  • 使用 20 作為紀(jì)元。

步驟 1 - 導(dǎo)入模塊

讓我們導(dǎo)入必要的模塊。

import keras 
from keras.datasets import mnist 
from keras.models import Sequential 
from keras.layers import Dense, Dropout 
from keras.optimizers import RMSprop 
import numpy as np

步驟 2 - 加載數(shù)據(jù)

讓我們導(dǎo)入 mnist 數(shù)據(jù)集。

(x_train, y_train), (x_test, y_test) = mnist.load_data()

步驟 3 - 處理數(shù)據(jù)

讓我們根據(jù)我們的模型更改數(shù)據(jù)集,以便將其輸入到我們的模型中。

x_train = x_train.reshape(60000, 784) 
x_test = x_test.reshape(10000, 784) 
x_train = x_train.astype('float32') 
x_test = x_test.astype('float32') 
x_train /= 255 
x_test /= 255 


y_train = keras.utils.to_categorical(y_train, 10) 
y_test = keras.utils.to_categorical(y_test, 10)
  • reshape用于將輸入從 (28, 28) 元組重塑為 (784, )
  • to_categorical用于將向量轉(zhuǎn)換為二進(jìn)制矩陣

步驟 4 - 創(chuàng)建模型

讓我們創(chuàng)建實(shí)際模型。

model = Sequential() 
model.add(Dense(512, activation = 'relu', input_shape = (784,))) 
model.add(Dropout(0.2)) 
model.add(Dense(512, activation = 'relu'))
model.add(Dropout(0.2)) 
model.add(Dense(10, activation = 'softmax'))

步驟 5 - 編譯模型

讓我們使用選定的損失函數(shù)、優(yōu)化器和指標(biāo)來(lái)編譯模型。

model.compile(loss = 'categorical_crossentropy',     
   optimizer = RMSprop(), 
   metrics = ['accuracy'])

步驟 6 - 訓(xùn)練模型

讓我們使用fit()方法訓(xùn)練模型。

history = model.fit(
   x_train, y_train, 
   batch_size = 128, 
   epochs = 20, 
   verbose = 1, 
   validation_data = (x_test, y_test)
)

總結(jié)

我們已經(jīng)創(chuàng)建了模型,加載了數(shù)據(jù)并將數(shù)據(jù)訓(xùn)練到模型中。我們?nèi)匀恍枰u(píng)估模型并預(yù)測(cè)未知輸入的輸出,我們將在下一章中學(xué)習(xí)。

import keras 
from keras.datasets import mnist 
from keras.models import Sequential 
from keras.layers import Dense, Dropout 
from keras.optimizers import RMSprop 
import numpy as np 


(x_train, y_train), (x_test, y_test) = mnist.load_data() 


x_train = x_train.reshape(60000, 784) 
x_test = x_test.reshape(10000, 784) 
x_train = x_train.astype('float32') 
x_test = x_test.astype('float32') 
x_train /= 255 
x_test /= 255 


y_train = keras.utils.to_categorical(y_train, 10) 
y_test = keras.utils.to_categorical(y_test, 10) 


model = Sequential() 
model.add(Dense(512, activation='relu', input_shape = (784,))) 
model.add(Dropout(0.2)) 
model.add(Dense(512, activation = 'relu')) model.add(Dropout(0.2)) 
model.add(Dense(10, activation = 'softmax'))
model.compile(loss = 'categorical_crossentropy', 
   optimizer = RMSprop(), 
   metrics = ['accuracy']) 


history = model.fit(x_train, y_train, 
   batch_size = 128, epochs = 20, verbose = 1, validation_data = (x_test, y_test))

執(zhí)行應(yīng)用程序?qū)⑻峁┮韵聝?nèi)容作為輸出

Train on 60000 samples, validate on 10000 samples Epoch 1/20 
60000/60000 [==============================] - 7s 118us/step - loss: 0.2453 
- acc: 0.9236 - val_loss: 0.1004 - val_acc: 0.9675 Epoch 2/20 
60000/60000 [==============================] - 7s 110us/step - loss: 0.1023 
- acc: 0.9693 - val_loss: 0.0797 - val_acc: 0.9761 Epoch 3/20 
60000/60000 [==============================] - 7s 110us/step - loss: 0.0744 
- acc: 0.9770 - val_loss: 0.0727 - val_acc: 0.9791 Epoch 4/20 
60000/60000 [==============================] - 7s 110us/step - loss: 0.0599 
- acc: 0.9823 - val_loss: 0.0704 - val_acc: 0.9801 Epoch 5/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0504 
- acc: 0.9853 - val_loss: 0.0714 - val_acc: 0.9817 Epoch 6/20 
60000/60000 [==============================] - 7s 111us/step - loss: 0.0438 
- acc: 0.9868 - val_loss: 0.0845 - val_acc: 0.9809 Epoch 7/20 
60000/60000 [==============================] - 7s 114us/step - loss: 0.0391 
- acc: 0.9887 - val_loss: 0.0823 - val_acc: 0.9802 Epoch 8/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0364 
- acc: 0.9892 - val_loss: 0.0818 - val_acc: 0.9830 Epoch 9/20 
60000/60000 [==============================] - 7s 113us/step - loss: 0.0308 
- acc: 0.9905 - val_loss: 0.0833 - val_acc: 0.9829 Epoch 10/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0289 
- acc: 0.9917 - val_loss: 0.0947 - val_acc: 0.9815 Epoch 11/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0279 
- acc: 0.9921 - val_loss: 0.0818 - val_acc: 0.9831 Epoch 12/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0260 
- acc: 0.9927 - val_loss: 0.0945 - val_acc: 0.9819 Epoch 13/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0257 
- acc: 0.9931 - val_loss: 0.0952 - val_acc: 0.9836 Epoch 14/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0229 
- acc: 0.9937 - val_loss: 0.0924 - val_acc: 0.9832 Epoch 15/20 
60000/60000 [==============================] - 7s 115us/step - loss: 0.0235 
- acc: 0.9937 - val_loss: 0.1004 - val_acc: 0.9823 Epoch 16/20 
60000/60000 [==============================] - 7s 113us/step - loss: 0.0214 
- acc: 0.9941 - val_loss: 0.0991 - val_acc: 0.9847 Epoch 17/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0219 
- acc: 0.9943 - val_loss: 0.1044 - val_acc: 0.9837 Epoch 18/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0190 
- acc: 0.9952 - val_loss: 0.1129 - val_acc: 0.9836 Epoch 19/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0197 
- acc: 0.9953 - val_loss: 0.0981 - val_acc: 0.9841 Epoch 20/20 
60000/60000 [==============================] - 7s 112us/step - loss: 0.0198 
- acc: 0.9950 - val_loss: 0.1215 - val_acc: 0.9828
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)