亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

自定義損失函數,Keras \\ ValueError:無梯度

自定義損失函數,Keras \\ ValueError:無梯度

慕桂英4014372 2023-07-18 15:13:35
我正在嘗試將我的 Keras 神經網絡包裝在一個class對象中。我已經在類設置之外實現了以下內容,但我想讓它更加對象友好??偠灾?,我的model調用函數sequential_model創建了一個sequential模型。在這compile一步中,我定義了自己的損失函數weighted_categorical_crossentropy,我希望順序模型實現它。但是,當我運行下面的代碼時,出現以下錯誤:ValueError: No gradients provided for any variable:我懷疑問題在于我如何定義該weighted_categorical_crossentropy函數以供sequential.再次,我能夠以非面向對象的方式完成這項工作。任何幫助都感激不盡。from tensorflow.keras import Sequential, backend as Kclass MyNetwork():             def __init__(self, file, n_output=4, n_hidden=20, epochs=3,                 dropout=0.10, batch_size=64, metrics = ['categorical_accuracy'],                 optimizer = 'rmsprop', activation = 'softmax'):    [...] //Other Class attributes     def model(self):        self.model = self.sequential_model(False)        self.model.summary()    def sequential_model(self, val):        K.clear_session()        if val == False:            self.epochs = 3        regressor = Sequential()        #regressor.run_eagerly = True        regressor.add(LSTM(units = self.n_hidden, dropout=self.dropout, return_sequences = True, input_shape = (self.X.shape[1], self.X.shape[2])))        regressor.add(LSTM(units = self.n_hidden, dropout=self.dropout, return_sequences = True))        regressor.add(Dense(units = self.n_output, activation=self.activation))            self.weights = np.array([0.025,0.225,0.78,0.020])        regressor.compile(optimizer = self.optimizer, loss = self.weighted_categorical_crossentropy(self.weights), metrics = [self.metrics])        regressor.fit(self.X, self.Y*1.0,batch_size=self.batch_size, epochs=self.epochs, verbose=1, validation_data=(self.Xval, self.Yval*1.0))        return regressor
查看完整描述

1 回答

?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

上面的代碼有幾個問題,但最值得注意的一個是你沒有返回lossfrom weighted_categorical_crossentropy。它應該看起來更像:


? ? def weighted_categorical_crossentropy(self, weights):

? ? ? ? weights = K.variable(weights)

? ? ? ? def loss(y_true, y_pred):

? ? ? ? ? ? y_pred /= K.sum(y_pred, axis=-1, keepdims=True)

? ? ? ? ? ? y_pred = K.clip(y_pred, K.epsilon(), 1 - K.epsilon())

? ? ? ? ? ? loss = y_true * K.log(y_pred) * weights

? ? ? ? ? ? loss = -K.sum(loss, -1)

? ? ? ? ? ? return loss

? ? ? ? return loss # Return the callable function!

錯誤是ValueError: No gradients provided for any variable因為loss方法不返回任何東西,它返回None!如果您嘗試使用 擬合方法loss=None,模型將無法計算梯度,因此會拋出相同的錯誤。


接下來是您return_sequences = True在非循環層之前的層中使用的 。這會導致Dense在形狀錯誤的數據上調用該層,這僅適用于循環層。不要那樣使用它。

如果您有充分的理由使用return_sequences = True,那么您必須添加Dense如下層:


model.add(keras.layers.TimeDistributed(keras.layers.Dense(...)))

這將導致該層在每個時間步上分別Dense作用于輸出序列。這也意味著您的體形必須合適。y_true


您定義的自定義損失函數可能存在其他問題,但我無法推斷出輸入/輸出形狀,因此您必須運行它并添加看看它是否有效。可能會存在矩陣乘法形狀不匹配的情況。


最后但并非最不重要的一點是,考慮使用子類 API。它能讓你的操作更容易編寫嗎?

查看完整回答
反對 回復 2023-07-18
  • 1 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號