2017-09-24 34 views
1

我是凱拉斯的新學員。我想提出一個問題:如何計算Keras中沒有重量衰減的損失?

1:在Keras,創建一個卷積層和也使用L2重量衰變。

2:我的第一個問題是:當我定義的model.fit()損失 - 擁有所有的權衰減損失被納入這一損失?

3:如果權衰減損失已計入總損失:我怎樣才能在訓練中沒有這個權衰減的損失?

我想調查沒有重量衰減的損失,而我想這個體重衰減參加這次培訓。

非常感謝!

+0

你能分享一些代碼嗎?具體而言,您如何指定「L2重量衰減」,以及在擬合時使用了什麼損失函數? – etov

回答

0

是的,重量衰減損失包含在屏幕上打印的損失值中。

要監視的值是總損失減去正則化損失的總和。

  • 總損失只是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,這確實是lossloss_no_weight_decay之間的差異(有一些舍入誤差)。

+0

完美!這是我在Stackoverflow中給出問題的最佳答案。 –