【问题标题】:Custom Loss function, Keras \\ ValueError: No gradients自定义损失函数,Keras \\ ValueError: No gradients
【发布时间】:2020-12-24 03:33:14
【问题描述】:

我正在尝试将我的 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 K

class 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

    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

【问题讨论】:

    标签: python tensorflow object keras


    【解决方案1】:

    上面的代码有几个问题,但最明显的一个是你没有从weighted_categorical_crossentropy返回loss。它应该看起来更像:

        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,因为损失方法没有返回任何东西,它返回None!如果你尝试用loss=None 拟合一个方法,模型将无法计算梯度,因此它会抛出同样的错误。

    接下来是您在非循环层之前的层中使用return_sequences = True。这会导致在形状错误的数据上调用Dense 层,这仅适用于循环层。不要那样使用它。
    如果您有充分的理由使用return_sequences = True,那么您必须添加Dense 层,例如:

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

    这将导致Dense 层在每个时间步分别作用于输出序列。这也意味着您的y_true 必须具有适当的形状。

    您定义的自定义损失函数可能存在其他问题,但我无法推断输入/输出形状,因此您必须运行它并添加它是否有效。可能会出现矩阵乘法形状不匹配。

    最后但同样重要的是,考虑使用子类化 API。它能让你的任何操作更容易编写吗?

    感谢您的阅读,一旦获得该信息,我将更新此答案。干杯。

    【讨论】:

    • 感谢您指出明显的逻辑错误并感谢您的彻底回复!关于你的第二点,我的y_true 输出是一个n X time X classes 矩阵(在本例中为:n X 20 X 4),因此n_hidden 的大小为20,n_output 的大小为4 个不同的类。 20 的隐藏大小意味着 20 个连续的建模周期(按每个 n 的顺序),所以从你上面的观点来看,我应该像你提到的那样定义 dense 层。关于您的第三点,必须查看sub-classing API。再次感谢,如果可能的话,我会请你吃一些好的 kinkhali。
    • 我很高兴@Josh。乐意效劳。另外,关于那个 knikali:如果你决定有一天去格鲁吉亚,我很乐意在当地的 sakhinkle(提供服务的地方的名称)邀请你。干杯。 :)
    • 这只是时间问题,我的妻子来自 Poti,我被指示尽快访问 Bakhmaro :D
    • 嘿@tornikeo,希望你一切都好。您是我认识的该领域的专家,如果您能看看我的另一个 ANN 问题,将不胜感激:stackoverflow.com/questions/65067446/…
    • 嘿@Josh 我很好。你好吗?我今天有一些差事要跑,一旦我有空闲时间,我会尽力回答你的问题。我已经为它添加了书签。
    猜你喜欢
    • 2020-10-14
    • 2020-12-19
    • 2017-12-18
    • 2020-03-27
    • 1970-01-01
    • 2018-10-28
    • 2017-12-29
    • 1970-01-01
    • 2020-02-27
    相关资源
    最近更新 更多