我使用了一个自定义损失函数:
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的输出。