之前,我們研究了如何使用 Sequential 和 Function API 創(chuàng)建模型的基礎(chǔ)知識(shí)。本章將介紹如何編譯模型。編譯是創(chuàng)建模型的最后一步。編譯完成后,我們就可以進(jìn)入訓(xùn)練階段。
首先,學(xué)習(xí)一些概念,有助于我們更好地理解編譯過(guò)程。
在機(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_pred
與 y_true
形狀相同的預(yù)測(cè)
在使用下面指定的損失函數(shù)之前,首先要導(dǎo)入損失模塊:
from keras import losses
在機(jī)器學(xué)習(xí)中,optimizer
是通過(guò)比較預(yù)測(cè)和損失函數(shù)來(lái)優(yōu)化輸入權(quán)重的重要過(guò)程。Keras 提供了很多優(yōu)化器作為模塊,具體如下:
keras.optimizers.SGD(learning_rate = 0.01, momentum = 0.0, nesterov = False)
keras.optimizers.RMSprop(learning_rate = 0.001, rho = 0.9)
keras.optimizers.Adagrad(learning_rate = 0.01)
keras.optimizers.Adadelta(learning_rate = 1.0, rho = 0.95)
keras.optimizers.Adam(
learning_rate = 0.001, beta_1 = 0.9, beta_2 = 0.999, amsgrad = False
)
from keras import optimizers
在機(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_pred
與 y_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)如下:
編譯模式的示例代碼如下:
from keras import losses
from keras import optimizers
from keras import metrics
model.compile(loss = 'mean_squared_error',
optimizer = 'sgd', metrics = [metrics.categorical_accuracy])
mean_squared_error
sgd
metrics.categorical_accuracy
模型由 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è)概念。
讓我們?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)建簡(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']
)
現(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))
我們已經(jīng)學(xué)會(huì)了創(chuàng)建、編譯和訓(xùn)練 Keras 模型。
讓我們應(yīng)用我們的學(xué)習(xí)并創(chuàng)建一個(gè)簡(jiǎn)單的基于 MPL 的 ANN。
在創(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ù)如下:
讓我們使用手寫數(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()
minst
。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ù)。讓我們選擇一個(gè)簡(jiǎn)單的多層感知器 (MLP),如下所示,并嘗試使用 Keras 創(chuàng)建模型:
該模型的核心特征如下:
讓我們導(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
讓我們導(dǎo)入 mnist 數(shù)據(jù)集。
(x_train, y_train), (x_test, y_test) = mnist.load_data()
讓我們根據(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)制矩陣讓我們創(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'))
讓我們使用選定的損失函數(shù)、優(yōu)化器和指標(biāo)來(lái)編譯模型。
model.compile(loss = 'categorical_crossentropy',
optimizer = RMSprop(),
metrics = ['accuracy'])
讓我們使用fit()
方法訓(xùn)練模型。
history = model.fit(
x_train, y_train,
batch_size = 128,
epochs = 20,
verbose = 1,
validation_data = (x_test, y_test)
)
我們已經(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
更多建議: