第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

自定義損失函數(shù),Keras \\ ValueError:無梯度

自定義損失函數(shù),Keras \\ ValueError:無梯度

慕桂英4014372 2023-07-18 15:13:35
我正在嘗試將我的 Keras 神經(jīng)網(wǎng)絡(luò)包裝在一個class對象中。我已經(jīng)在類設(shè)置之外實(shí)現(xiàn)了以下內(nèi)容,但我想讓它更加對象友好。總而言之,我的model調(diào)用函數(shù)sequential_model創(chuàng)建了一個sequential模型。在這compile一步中,我定義了自己的損失函數(shù)weighted_categorical_crossentropy,我希望順序模型實(shí)現(xiàn)它。但是,當(dāng)我運(yùn)行下面的代碼時,出現(xiàn)以下錯誤:ValueError: No gradients provided for any variable:我懷疑問題在于我如何定義該weighted_categorical_crossentropy函數(shù)以供sequential.再次,我能夠以非面向?qū)ο蟮姆绞酵瓿蛇@項(xiàng)工作。任何幫助都感激不盡。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貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個贊

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


? ? 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因?yàn)閘oss方法不返回任何東西,它返回None!如果您嘗試使用 擬合方法loss=None,模型將無法計(jì)算梯度,因此會拋出相同的錯誤。


接下來是您return_sequences = True在非循環(huán)層之前的層中使用的 。這會導(dǎo)致Dense在形狀錯誤的數(shù)據(jù)上調(diào)用該層,這僅適用于循環(huán)層。不要那樣使用它。

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


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

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


您定義的自定義損失函數(shù)可能存在其他問題,但我無法推斷出輸入/輸出形狀,因此您必須運(yùn)行它并添加看看它是否有效??赡軙嬖诰仃嚦朔ㄐ螤畈黄ヅ涞那闆r。


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

查看完整回答
反對 回復(fù) 2023-07-18
  • 1 回答
  • 0 關(guān)注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號