如何在Keras自定义损失函数中防止负预测

我使用了一个自定义损失函数:

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

谢谢,Amir


回答:

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

你可以像Daniel Möller回答的那样,添加一个激活函数。

这将涉及到更改

model.add(Dense(1))

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

因为你在评论中提到希望输出从0到约200。这样可以保证不会有低于0的输出。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注