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)入損失模塊:
    1. 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)化器

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

RMSprop 優(yōu)化器

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

Adagrad 優(yōu)化器

  1. keras.optimizers.Adagrad(learning_rate = 0.01)

Adadelta 優(yōu)化器

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

Adam 優(yōu)化器

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

Adamax 優(yōu)化器。

  1. 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)模塊:

  1. from keras import metrics

編譯模型

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

  1. compile(
  2. optimizer,
  3. loss = None,
  4. metrics = None,
  5. loss_weights = None,
  6. sample_weight_mode = None,
  7. weighted_metrics = None,
  8. target_tensors = None
  9. )

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

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

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

  1. from keras import losses
  2. from keras import optimizers
  3. from keras import metrics
  4. model.compile(loss = 'mean_squared_error',
  5. 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ǔ)法:

  1. 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ù):

  1. import numpy as np
  2. x_train = np.random.random((100,4,8))
  3. y_train = np.random.random((100,10))

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

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

創(chuàng)建模型

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

  1. from keras.models import Sequential model = Sequential()

添加圖層

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

  1. from keras.layers import LSTM, Dense
  2. ## add a sequence of vectors of dimension 16
  3. model.add(LSTM(16, return_sequences = True))
  4. model.add(Dense(10, activation = 'softmax'))

編譯模型

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

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

應(yīng)用fit()

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

  1. 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ù)集:

  1. from keras.datasets import mnist
  2. (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)入必要的模塊。

  1. import keras
  2. from keras.datasets import mnist
  3. from keras.models import Sequential
  4. from keras.layers import Dense, Dropout
  5. from keras.optimizers import RMSprop
  6. import numpy as np

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

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

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

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

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

  1. x_train = x_train.reshape(60000, 784)
  2. x_test = x_test.reshape(10000, 784)
  3. x_train = x_train.astype('float32')
  4. x_test = x_test.astype('float32')
  5. x_train /= 255
  6. x_test /= 255
  7. y_train = keras.utils.to_categorical(y_train, 10)
  8. 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í)際模型。

  1. model = Sequential()
  2. model.add(Dense(512, activation = 'relu', input_shape = (784,)))
  3. model.add(Dropout(0.2))
  4. model.add(Dense(512, activation = 'relu'))
  5. model.add(Dropout(0.2))
  6. model.add(Dense(10, activation = 'softmax'))

步驟 5 - 編譯模型

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

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

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

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

  1. history = model.fit(
  2. x_train, y_train,
  3. batch_size = 128,
  4. epochs = 20,
  5. verbose = 1,
  6. validation_data = (x_test, y_test)
  7. )

總結(jié)

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

  1. import keras
  2. from keras.datasets import mnist
  3. from keras.models import Sequential
  4. from keras.layers import Dense, Dropout
  5. from keras.optimizers import RMSprop
  6. import numpy as np
  7. (x_train, y_train), (x_test, y_test) = mnist.load_data()
  8. x_train = x_train.reshape(60000, 784)
  9. x_test = x_test.reshape(10000, 784)
  10. x_train = x_train.astype('float32')
  11. x_test = x_test.astype('float32')
  12. x_train /= 255
  13. x_test /= 255
  14. y_train = keras.utils.to_categorical(y_train, 10)
  15. y_test = keras.utils.to_categorical(y_test, 10)
  16. model = Sequential()
  17. model.add(Dense(512, activation='relu', input_shape = (784,)))
  18. model.add(Dropout(0.2))
  19. model.add(Dense(512, activation = 'relu')) model.add(Dropout(0.2))
  20. model.add(Dense(10, activation = 'softmax'))
  21. model.compile(loss = 'categorical_crossentropy',
  22. optimizer = RMSprop(),
  23. metrics = ['accuracy'])
  24. history = model.fit(x_train, y_train,
  25. batch_size = 128, epochs = 20, verbose = 1, validation_data = (x_test, y_test))

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

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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)