我正在訓練一個具有形狀 (400,22) 的二維張量作為輸入和輸出的 CNN 模型。我的模型有點像這樣:
X_input = Input(shape=(400,22))
X = Conv1D(filters=32, kernel_size=2, activation='elu', kernel_regularizer=L2(1e-4), bias_regularizer=L2(1e-4), padding='same')(X_input)
X = Dropout(0.2)(X)
X = Conv1D(filters=32, kernel_size=2, activation='elu', kernel_regularizer=L2(1e-4), bias_regularizer=L2(1e-4), padding='same')(X)
X = Dropout(0.2)(X)
y = Conv1D(filters=22, kernel_size=1, activation='softmax', kernel_regularizer=L2(1e-4), bias_regularizer=L2(1e-4), padding='same')(X)
model = Model(X_input, y, name='mymodel')
model.compile(optimizer=Adam(1e-3),
loss=tf.keras.losses.categorical_crossentropy,
metrics=[tf.keras.losses.categorical_crossentropy])
history = model.fit(X=Xtrain, y=ytrain, sample_weight=sample_weight, epochs=10)
Epoch 1/10
1010/1010 - 123s - loss: 77.8096 - categorical_crossentropy: 344.0709
Epoch 2/10
1010/1010 - 73s - loss: 50.5642 - categorical_crossentropy: 223.2328
Epoch 3/10
1010/1010 - 73s - loss: 44.2204 - categorical_crossentropy: 194.8449
Epoch 4/10
1010/1010 - 73s - loss: 40.1621 - categorical_crossentropy: 177.2441
Epoch 5/10
1010/1010 - 73s - loss: 38.4596 - categorical_crossentropy: 169.7108
從其他幾個堆疊溢位問題中,我了解到雖然損失和度量使用相同的函式,但由于 dropout、正則化以及度量在最后計算的事實,損失可能大于度量每個時期的損失,而損失是訓練中批次的平均值。
然而,就我而言,度量比損失大幾倍,盡管相同的 categorical_crossentropy 函式用于損失和度量。
我認為這是由于樣本權重(范圍從 0.01 到 1),但 Keras 檔案說樣本權重是在評估指標時實作的,就像在損失中一樣。
損失/指標值存在巨大差異的原因可能是什么?
uj5u.com熱心網友回復:
首先,分類交叉熵通常不用作度量。其次,您正在執行某種型別的 seq2seq 任務,我希望您以此意圖設計模型。
最后,在您的設定中, usingsample_weight僅適用于損失,它對指標或驗證沒有影響。您的代碼中還有其他小錯誤。這是固定的作業代碼:
參考:TF 2.3.0 使用帶有樣本權重的 tf 資料集訓練 keras 模型不適用于指標 (為什么sample_weight只適用于損失)
import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras.optimizers import *
from tensorflow.keras import *
import numpy as np
X_input = Input(shape=(400,22))
X = Conv1D(filters=32, kernel_size=2, activation='elu', kernel_regularizer=L2(1e-4), bias_regularizer=L2(1e-4), padding='same')(X_input)
X = Dropout(0.2)(X)
X = Conv1D(filters=32, kernel_size=2, activation='elu', kernel_regularizer=L2(1e-4), bias_regularizer=L2(1e-4), padding='same')(X)
X = Dropout(0.2)(X)
y = Conv1D(filters=22, kernel_size=1, activation='softmax', kernel_regularizer=L2(1e-4), bias_regularizer=L2(1e-4), padding='same')(X)
model = Model(X_input, y, name='mymodel')
model.compile(optimizer=Adam(1e-3), loss=tf.keras.losses.categorical_crossentropy,
metrics=[tf.keras.losses.categorical_crossentropy])
Xtrain = np.random.rand(10,400,22)
ytrain = np.random.rand(10,400,22)
history = model.fit(Xtrain, ytrain, sample_weight=np.ones(10), epochs=10)
Epoch 1/10
1/1 [==============================] - 1s 719ms/step - loss: 35.4521 - categorical_crossentropy: 35.4437
Epoch 2/10
1/1 [==============================] - 0s 20ms/step - loss: 35.5138 - categorical_crossentropy: 35.5054
Epoch 3/10
1/1 [==============================] - 0s 19ms/step - loss: 35.5984 - categorical_crossentropy: 35.5900
Epoch 4/10
1/1 [==============================] - 0s 19ms/step - loss: 35.6617 - categorical_crossentropy: 35.6533
Epoch 5/10
1/1 [==============================] - 0s 19ms/step - loss: 35.7807 - categorical_crossentropy: 35.7723
Epoch 6/10
1/1 [==============================] - 0s 19ms/step - loss: 35.9045 - categorical_crossentropy: 35.8961
Epoch 7/10
1/1 [==============================] - 0s 18ms/step - loss: 36.0590 - categorical_crossentropy: 36.0505
Epoch 8/10
1/1 [==============================] - 0s 19ms/step - loss: 36.2040 - categorical_crossentropy: 36.1956
Epoch 9/10
1/1 [==============================] - 0s 18ms/step - loss: 36.4169 - categorical_crossentropy: 36.4084
Epoch 10/10
1/1 [==============================] - 0s 32ms/step - loss: 36.6622 - categorical_crossentropy: 36.6538
在這里,如果您sample_weight對每個樣本使用 no或 1,您將獲得接近/相似的分類交叉熵。
weighted_metrics根據檔案使用。
uj5u.com熱心網友回復:
Keras 不會在指標評估中自動包含樣本權重。這就是為什么損失和指標之間存在巨大差異的原因。
如果您想在評估指標時包含樣本權重,請將它們作為weighted_metrics而不是指標傳遞。
model.compile(optimizer=Adam(1e-3),
loss=tf.keras.losses.categorical_crossentropy,
weighted_metrics=[tf.keras.losses.categorical_crossentropy]))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/346291.html
上一篇:如何在張量流中添加右零值
