Keras 教學 2 – 損失函數的類型、compile、fit、evaluate、predict

Hand on Blue Background

Keras 是一個開源的深度學習庫,在這篇Keras 教學 文章中,我們將深入研究在Keras中訓練模型時損失函數的類型、compile、fit、evaluate和predict參數。了解這些概念對於有效地訓練並評估Keras模型至關重要。

Keras:損失函數的類型

在Keras中,損失函數的類型應與輸出層的啟動函數互相搭配。以下是一些常見的損失函數類型及其對應的問題類型和啟動函數:

問題類型啟動函數loss function
二元分類sigmodbinary_crossentropy
多元分類softmaxcategorical_crossentropy
多標籤分類sigmodbinary_crossentropy
迴歸求值Nonemse
迴歸求0~1的值sigmodmse or binary_crossentropy

Keras:常用損失函數

在 Keras 中,選擇正確的損失函數至關重要。損失函數的選擇直接影響模型的訓練結果。下面介紹了 Keras 中的一些常用損失函數以及其用法。

mean_squared_error

均方誤差(Mean Squared Error, MSE)

keras.losses.mean_squared_error(y_true, y_pred)

說明
計算目標真實值和目標預測值之間的平均平方誤差。

mean_absolute_error

平均絕對誤差(Mean Absolute Error, MAE)

keras.losses.mean_absolute_error(y_true, y_pred)

說明
計算目標真實值和目標預測值之間的平均絕對誤差。

mean_absolute_percentage_error

平均絕對百分比誤差(Mean Absolute Percentage Error, MAPE)

keras.losses.mean_absolute_percentage_error(y_true, y_pred)

說明
計算目標真實值和目標預測值之間的平均絕對百分比誤差。

mean_squared_logarithmic_error

均方對數誤差(Mean Squared Logarithmic Error, MSLE)

keras.losses.mean_squared_logarithmic_error(y_true, y_pred)

說明
計算目標真實值和目標預測值之間的均方對數誤差。

squared_hinge

平方 Hinge 損失函數

keras.losses.squared_hinge(y_true, y_pred)

說明
平方 Hinge 損失函數常用於支持向量機(SVM)模型中。

hinge

Hinge 損失函數

keras.losses.hinge(y_true, y_pred)

說明
Hinge 損失函數常用於支持向量機(SVM)模型中。

categorical_hinge

分類 Hinge 損失函數

keras.losses.categorical_hinge(y_true, y_pred)

說明
分類 Hinge 損失函數常用於支持向量機(SVM)模型中。

logcosh

雙曲餘弦對數損失函數

keras.losses.logcosh(y_true, y_pred)

說明
預測誤差的雙曲餘弦對數。對於較小的 x,log(cosh(x)) 近似等於 (x ** 2) / 2。對於較大的 x,近似於 abs(x) – log(2)。這表示 ‘logcosh’ 與均方誤差大致相同,但是不會受到偶爾瘋狂的錯誤預測的強烈影響。

huber_loss

Huber 損失函數

keras.losses.huber_loss(y_true, y_pred, delta=1.0)

參數

  • delta:閾值

說明
Huber 損失函數是均方誤差和平均絕對誤差的一種折衷,可以減小異常值的影響。

categorical_crossentropy

分類交叉熵損失函數

keras.losses.categorical_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0)

參數

  • from_logits:是否對預測進行 softmax 操作
  • label_smoothing:標籤平滑因子

說明
分類交叉熵損失函數通常用於多分類問題。

sparse_categorical_crossentropy

稀疏分類交叉熵損失函數

keras.losses.sparse_categorical_crossentropy(y_true, y_pred, from_logits=False, axis=-1)

參數

  • from_logits:是否對預測進行 softmax 操作
  • axis:要減少的軸

說明
稀疏分類交叉熵損失函數通常用於多分類問題,標籤以整數形式提供。

binary_crossentropy

二元交叉熵損失函數

keras.losses.binary_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0)

參數

  • from_logits:是否對預測進行 softmax 操作
  • label_smoothing:標籤平滑因子

說明
二元交叉熵損失函數通常用於二分類問題。

kullback_leibler_divergence

Kullback-Leibler 散度

keras.losses.kullback_leibler_divergence(y_true, y_pred)

說明
Kullback-Leibler 散度用於度量

兩個概率分佈之間的差異。

poisson

泊松損失函數

keras.losses.poisson(y_true, y_pred)

說明
泊松損失函數通常用於泊松分佈的回歸問題。

cosine_proximity

餘弦相似度

keras.losses.cosine_proximity(y_true, y_pred, axis=-1)

參數

  • axis:計算餘弦相似度的軸

說明
餘弦相似度用於度量兩個向量之間的相似程度。

is_categorical_crossentropy

是否為分類交叉熵損失函數

keras.losses.is_categorical_crossentropy(loss)

參數

  • loss:要檢查的損失函數

說明
檢查是否為分類交叉熵損失函數。


Keras 教學 :compile()的optimizer

在compile()中,我們需要選擇一個優化器(optimizer)來訓練模型。以下是一些常用的優化器:

SGD優化器(不常用)

from keras.optimizers import SGD

optimizer = SGD(
learning_rate=0.01, # W += -grad * learning_rate
momentum=0.0, # 動量法
decay=0.0, # 衰減值
nesterov=False
)

Adam

from keras.optimizers import Adam

optimizer = Adam(
learning_rate=0.001, # W += -grad * learning_rate
beta_1=0.9,
beta_2=0.999, # 動量法,指數衰減率
epsilon=1e-07, # 模糊因子
decay=0.0, # 衰減值
amsgrad=False
)

fit()

fit()方法將模型訓練用的資料傳入模型進行訓練。以下是一個範例:

from keras.datasets import mnist
from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape((60000, 28 * 28)).astype('float32') / 255
x_test = x_test.reshape((10000, 28 * 28)).astype('float32') / 255
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

model = Sequential([
Dense(512, activation='relu', input_shape=(28 * 28,)),
Dense(10, activation='softmax')
])

model.compile(optimizer=Adam(learning_rate=0.001),
loss='categorical_crossentropy',
metrics=['accuracy', 'mse'])

history = model.fit(x_train, y_train, epochs=5, batch_size=128,
validation_split=0.2,
verbose=2)

print(history.history)

evaluate()

evaluate()方法用於評估模型的性能。以下是一個範例:

t_loss, t_acc, t_mse = model.evaluate(x_test, y_test)

print("Test Loss:", t_loss)
print("Test Accuracy:", t_acc)
print("Test MSE:", t_mse)

predict()

predict()方法用於對新的數據進行預測。以下是一個範例:

predict = model.predict(x_test)

使用Keras進行模型的保存和載入

在Keras中,您可以使用以下方法保存和載入模型:

Keras保存模型

# 保存模型架構及權重
model.save('my_model.h5')

# 只保存模型架構
model_json = model.to_json()
with open("my_model.json", "w") as json_file:
json_file.write(model_json)

# 只保存權重
model.save_weights("my_model_weights.h5")

載入模型

from keras.models import load_model

# 載入模型架構及權重
loaded_model = load_model('my_model.h5')

# 只載入模型架構
json_file = open('my_model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)

# 只載入權重
loaded_model.load_weights("my_model_weights.h5")

使用回調函數

在Keras中,您可以使用回調函數來監控模型的訓練過程。以下是一個範例:

from keras.callbacks import ModelCheckpoint, EarlyStopping

# 定義回調函數
checkpoint = ModelCheckpoint("best_model.h5", monitor='val_accuracy', verbose=1, save_best_only=True, mode='max')
early_stopping = EarlyStopping(monitor='val_loss', patience=5, verbose=1, restore_best_weights=True)

# 模型訓練
history = model.fit(x_train, y_train, epochs=20, batch_size=128,
validation_split=0.2, verbose=2, callbacks=[checkpoint, early_stopping])

可視化訓練歷史

在Keras中,您可以使用matplotlib等工具來可視化模型的訓練歷史。以下是一個範例:

import matplotlib.pyplot as plt

# 可視化訓練歷史中的損失和準確率
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

通過本文,我們深入探討了在Keras中訓練模型時損失函數的類型、compile、fit、evaluate和predict參數。這些概念對於理解和有效地訓練Keras模型至關重要。在您的AI之旅中,請牢記這些概念,它們將成為您的強大工具之一。

此外,了解如何保存和載入模型、使用回調函數以及可視化訓練歷史也是非常重要的。這些技巧將使您能夠更有效地訓練和管理您的深度學習模型。

keras連結: https://keras.io Back to Blog

返回頂端