【问题标题】:how to prevent negative predictions in keras custom loss function如何防止 keras 自定义损失函数中的负面预测
【发布时间】:2018-12-28 17:10:27
【问题描述】:

我正在使用自定义损失函数:

def ratio_loss(y, y0):
   return (K.mean(K.abs(y - y0) / y))

并获得负预测值 - 在我的情况下,这不会构成场景(我使用 CNN 和回归作为最后一层来获取对象的长度)。 我使用除法是为了在真实值相对于预测值相对较小的情况下惩罚更多)。

如何防止负面预测?

这是模式(目前..):

def create_model():
    model = Sequential()
    model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', padding='same', input_shape=(128, 128, 1)))
    model.add(Dropout(0.5))

    model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', padding='same'))
    model.add(Dropout(0.25))
    model.add(BatchNormalization())
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Conv2D(64, kernel_size=(3, 3), activation='relu', padding='same'))
    model.add(Dropout(0.25))
    model.add(BatchNormalization())
    model.add(MaxPooling2D(pool_size=(2, 2)))
    #
    #
    model.add(Conv2D(64, kernel_size=(3, 3), activation='relu', padding='same'))
    model.add(Dropout(0.25))
    model.add(BatchNormalization())
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Flatten())
    model.add(Dense(512, activation='relu'))

    model.add(Dropout(0.15))
    model.add(Dense(1))
    #model.compile(loss=keras.losses.mean_squared_error, optimizer=keras.optimizers.Adadelta(), metrics=[sacc])
    model.compile(loss=ratio_loss, optimizer=keras.optimizers.Adadelta(), metrics=[sacc])
    return model

谢谢, 阿米尔

【问题讨论】:

    标签: python tensorflow machine-learning keras computer-vision


    【解决方案1】:
    def ratio_loss(y, y0):
        return (K.mean(K.abs(y - y0 / y)))
    

    但是您的预期输出范围是多少?

    你可能应该在最后使用一些激活函数,例如:

    • activation ='sigmoid' - 从 0 到 1
    • activation = 'tanh' - 从 -1 到 +1
    • activation = 'softmax' - 如果这是一个只有一个正确类的分类问题
    • actication = 'softplus' - 从 0 到 +inf。
    • 等。

    在最后一层的用法:

    model.add(Dense(1,activation='sigmoid')) #from 0 to 1
    
    #optional, from 0 to 200 after using the sigmoid above
    model.add(Lambda(lambda x: 200*x))
    

    提示:如果您是初学者,请避免使用过多的“relu”,它通常会卡在 0 中,并且必须与精心选择的学习率一起使用。

    【讨论】:

    • 输出应该在 0 到 inf 之间(实际上是 ~200)我不明白你建议在哪里使用其中一个激活..(如果我说废话,我刚开始,请原谅我)
    • 谢谢,这很有帮助!
    • Ok :) -- 如果您认为这回答了您的问题,请将其标记为已回答。
    • 谢谢,这很有帮助!但是现在(也许正如你所说)它需要很多时间并且结果非常糟糕(不知何故一开始我有很好的结果)2400/2500 [=============== ===========>..] - ETA:6s - 损失:66.7620 - 囊:0.0565 2416/2500 [================== ========>..] - ETA:5s - 损失:66.8153 - sacc:0.0566 你建议如何构建网络(根据层数\过滤器\激活数)以提供更好和更快的网络结果?这些功能非常简单(我应该测量的那种痕迹)
    【解决方案2】:

    您可以继续训练您的神经网络,并希望它学会不做出任何低于 0 的预测(假设所有训练数据的输出都低于 0)。然后,您可以添加一个预测后步骤,在该步骤中,如果它做出任何低于 0 的预测,那么您可以将其转换为 0。

    您可以按照 Daniel Möller 的回答添加激活函数。

    这将涉及改变

    model.add(Dense(1))
    

    model.add(Dense(1, activation='softplus'))
    

    因为您提到您希望在评论中输出从 0 到 ~200。 这将保证没有低于 0 的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 2020-12-19
      • 2017-12-18
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      相关资源
      最近更新 更多