即使我对输入进行归一化,binary_corssentropy 损失也是负数

Posted

技术标签:

【中文标题】即使我对输入进行归一化,binary_corssentropy 损失也是负数【英文标题】:binary_corssentropy loss is negative even I normalize the inputs 【发布时间】:2019-02-22 00:56:52 【问题描述】:

我尝试使用 U-net 来做语义分割问题。掩码图像是二进制的。但是在训练时,我发现我的损失是负数。这里的损失我使用 binary_crossentropy。 这是我的代码:

X_train = X_train /255
y_train = y_train /255
X_val = X_val/255
y_val = y_val/255

它们的类型都是np.float32

然后我使用 imageDataGenerator 来增强图像,代码如下:

def image_augmentation(X_train,y_train):
    # Set hyper parameters for the model.
    data_gen_args = dict(featurewise_center=True,
                         featurewise_std_normalization=True,
                         rotation_range=90.,
                         width_shift_range=0.1,
                         height_shift_range=0.1,
                         zoom_range=0.2,
                         horizontal_flip=True, 
                         vertical_flip=True)
    image_datagen = ImageDataGenerator(**data_gen_args)
    mask_datagen = ImageDataGenerator(**data_gen_args)

    seed = 42
    image_datagen.fit(X_train, augment=True, seed=seed)
    mask_datagen.fit(y_train, augment=True, seed=seed)

    image_generator = image_datagen.flow(
                         X_train,batch_size=8,
                         seed=seed)

    mask_generator = mask_datagen.flow(
                         y_train, batch_size=8,
                         seed=seed)

    while True:
         yield(image_generator.next(),mask_generator.next())


train_generator = image_augmentation(X_train,y_train)

pat_init = 50
pat = pat_init
learning_rate = 1e-4
##change the model weight you want
file_path = "./model_v1/improvement-epoch:02d-val_my_iou_metric:.5f.hdf5"
checkpoint = ModelCheckpoint(file_path,monitor = 'val_my_iou_metric',verbose=1,save_best_only=True,mode='max')
reduce_lr = ReduceLROnPlateau(monitor='val_loss', mode = 'auto',factor=0.5, patience=5, min_lr=1e-9, verbose=1)
model.compile(loss='binary_crossentropy', optimizer=Adam(lr=learning_rate), metrics=[my_iou_metric])

# Use the image data Augment below to achieve better result
model.fit_generator(
        train_generator,steps_per_epoch=2000,epochs=300,
        validation_data=(X_val, y_val), verbose=1,
        callbacks=[checkpoint,reduce_lr]
        )

My net 的最后一层定义如下:

output = Conv2D(1,activation='sigmoid',
                            kernel_size=(1,1), 
                            padding='same',
                            data_format='channels_last')(x)

我真的很好奇为什么会发生这种情况? 'sigmoid' 函数的输出是否介于 0 和 1 之间?

如果你有什么想法,请与我讨论。 非常感谢!

【问题讨论】:

【参考方案1】:
samplewise_center=True,
samplewise_std_normalization=True

在图像数据生成器中

【讨论】:

虽然这可能会回答作者的问题,但它缺少一些解释性文字和/或文档链接。如果没有围绕它们的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请edit你的答案-From Review 同时,我找到了另一种解决方法。它可能只是一个二元分类,但您的目的可能并非如此。尝试二进制分类。

以上是关于即使我对输入进行归一化,binary_corssentropy 损失也是负数的主要内容,如果未能解决你的问题,请参考以下文章

我应该啥时候在机器学习中进行特征缩放或归一化?

归一化和标准化的一些理解

我们是不是应该在输入 cox 模型(生存分析)之前对定量协变量进行归一化?

matlab中怎样将矩阵归一化处理?

为啥单层感知器在没有归一化的情况下收敛这么慢,即使边距很大?

数据的归一化处理