Keras 是一個開源的深度學習庫,在這篇Keras 教學 文章中,我們將深入研究在Keras中訓練模型時損失函數的類型、compile、fit、evaluate和predict參數。了解這些概念對於有效地訓練並評估Keras模型至關重要。
Keras:損失函數的類型
在Keras中,損失函數的類型應與輸出層的啟動函數互相搭配。以下是一些常見的損失函數類型及其對應的問題類型和啟動函數:
問題類型 | 啟動函數 | loss function |
---|---|---|
二元分類 | sigmod | binary_crossentropy |
多元分類 | softmax | categorical_crossentropy |
多標籤分類 | sigmod | binary_crossentropy |
迴歸求值 | None | mse |
迴歸求0~1的值 | sigmod | mse 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