我是凱拉斯的新學員。我想提出一個問題:如何計算Keras中沒有重量衰減的損失?
1:在Keras,創建一個卷積層和也使用L2重量衰變。
2:我的第一個問題是:當我定義的model.fit()
損失 - 擁有所有的權衰減損失被納入這一損失?
3:如果權衰減損失已計入總損失:我怎樣才能在訓練中沒有這個權衰減的損失?
我想調查沒有重量衰減的損失,而我想這個體重衰減參加這次培訓。
非常感謝!
我是凱拉斯的新學員。我想提出一個問題:如何計算Keras中沒有重量衰減的損失?
1:在Keras,創建一個卷積層和也使用L2重量衰變。
2:我的第一個問題是:當我定義的model.fit()
損失 - 擁有所有的權衰減損失被納入這一損失?
3:如果權衰減損失已計入總損失:我怎樣才能在訓練中沒有這個權衰減的損失?
我想調查沒有重量衰減的損失,而我想這個體重衰減參加這次培訓。
非常感謝!
是的,重量衰減損失包含在屏幕上打印的損失值中。
要監視的值是總損失減去正則化損失的總和。
model.total_loss
。model.losses
中。以下線可以在model.compile()
的源代碼中找到:
# Add regularization penalties
# and other layer-specific losses.
for loss_tensor in self.losses:
total_loss += loss_tensor
爲了得到沒有權衰減損失,則可以相反順序執行上述的操作。即,要監測的值是model.total_loss - sum(model.losses)
。
現在,如何監測這個值是有點棘手。幸運的是,在調用model.fit()
之前,Keras模型使用的度量列表不是固定的。因此,您可以將此值附加到列表中,並在模型擬合期間將其顯示在屏幕上。
這裏有一個簡單的例子:
input_tensor = Input(shape=(64, 64, 3))
hidden = Conv2D(32, 1, kernel_regularizer=l2(0.01))(input_tensor)
hidden = GlobalAveragePooling2D()(hidden)
out = Dense(1)(hidden)
model = Model(input_tensor, out)
model.compile(loss='mse', optimizer='adam')
loss_no_weight_decay = model.total_loss - sum(model.losses)
model.metrics_tensors.append(loss_no_weight_decay)
model.metrics_names.append('loss_no_weight_decay')
當您運行model.fit()
,這樣的事情會被顯示在屏幕上:
Epoch 1/1
100/100 [==================] - 0s - loss: 0.5764 - loss_no_weight_decay: 0.5178
您也可以驗證該值是否正確,通過計算L2正則化手動:
conv_kernel = model.layers[1].get_weights()[0]
print(np.sum(0.01 * np.square(conv_kernel)))
在我的情況下,p剔除值爲0.0585,這確實是loss
和loss_no_weight_decay
之間的差異(有一些舍入誤差)。
完美!這是我在Stackoverflow中給出問題的最佳答案。 –
你能分享一些代碼嗎?具體而言,您如何指定「L2重量衰減」,以及在擬合時使用了什麼損失函數? – etov