【问题标题】:Keras loss is in negative and accuracy is going down, but predictions are good?Keras 损失为负数,准确率下降,但预测良好?
【发布时间】:2018-08-02 16:13:59
【问题描述】:

我正在使用 Tensorflow-gpu 后端在 Keras 中训练模型。 任务是检测卫星图像中的建筑物。 损失正在下降(这很好),但在负面的方向和准确性正在下降。但好的部分是,模型的预测正在改进。我担心的是为什么损失是负数。还有,为什么模型在进步,而准确率却在下降??

from tensorflow.keras.layers import Conv2D
from tensorflow.keras.layers import BatchNormalization
from tensorflow.keras.layers import Activation
from tensorflow.keras.layers import MaxPool2D as MaxPooling2D
from tensorflow.keras.layers import UpSampling2D
from tensorflow.keras.layers import concatenate
from tensorflow.keras.layers import Input
from tensorflow.keras import Model
from tensorflow.keras.optimizers import RMSprop


# LAYERS
inputs = Input(shape=(300, 300, 3))
# 300

down0 = Conv2D(32, (3, 3), padding='same')(inputs)
down0 = BatchNormalization()(down0)
down0 = Activation('relu')(down0)
down0 = Conv2D(32, (3, 3), padding='same')(down0)
down0 = BatchNormalization()(down0)
down0 = Activation('relu')(down0)
down0_pool = MaxPooling2D((2, 2), strides=(2, 2))(down0)
# 150

down1 = Conv2D(64, (3, 3), padding='same')(down0_pool)
down1 = BatchNormalization()(down1)
down1 = Activation('relu')(down1)
down1 = Conv2D(64, (3, 3), padding='same')(down1)
down1 = BatchNormalization()(down1)
down1 = Activation('relu')(down1)
down1_pool = MaxPooling2D((2, 2), strides=(2, 2))(down1)
# 75

center = Conv2D(1024, (3, 3), padding='same')(down1_pool)
center = BatchNormalization()(center)
center = Activation('relu')(center)  
center = Conv2D(1024, (3, 3), padding='same')(center)
center = BatchNormalization()(center)
center = Activation('relu')(center)
# center

up1 = UpSampling2D((2, 2))(center)
up1 = concatenate([down1, up1], axis=3)
up1 = Conv2D(64, (3, 3), padding='same')(up1)
up1 = BatchNormalization()(up1)
up1 = Activation('relu')(up1)
up1 = Conv2D(64, (3, 3), padding='same')(up1)
up1 = BatchNormalization()(up1)
up1 = Activation('relu')(up1)
up1 = Conv2D(64, (3, 3), padding='same')(up1)
up1 = BatchNormalization()(up1)
up1 = Activation('relu')(up1)
# 150

up0 = UpSampling2D((2, 2))(up1)
up0 = concatenate([down0, up0], axis=3)
up0 = Conv2D(32, (3, 3), padding='same')(up0)
up0 = BatchNormalization()(up0)
up0 = Activation('relu')(up0)
up0 = Conv2D(32, (3, 3), padding='same')(up0)
up0 = BatchNormalization()(up0)
up0 = Activation('relu')(up0) 
up0 = Conv2D(32, (3, 3), padding='same')(up0)
up0 = BatchNormalization()(up0)
up0 = Activation('relu')(up0)
# 300x300x3
classify = Conv2D(1, (1, 1), activation='sigmoid')(up0)
# 300x300x1

model = Model(inputs=inputs, outputs=classify)

model.compile(optimizer=RMSprop(lr=0.0001), 
              loss='binary_crossentropy', 
              metrics=[dice_coeff, 'accuracy'])

history = model.fit(sample_input, sample_target, batch_size=4, epochs=5)



OUTPUT:

Epoch 6/10
500/500 [==============================] - 76s 153ms/step - loss: -293.6920 - 
dice_coeff: 1.8607 - acc: 0.2653
Epoch 7/10
500/500 [==============================] - 75s 150ms/step - loss: -309.2504 - 
dice_coeff: 1.8730 - acc: 0.2618
Epoch 8/10
500/500 [==============================] - 75s 150ms/step - loss: -324.4123 - 
dice_coeff: 1.8810 - acc: 0.2659
Epoch 9/10
136/500 [=======>......................] - ETA: 55s - loss: -329.0757 - dice_coeff: 1.8940 - acc: 0.2757

预测

目标

问题出在哪里? (将 dice_coeff 保留为自定义损失)

【问题讨论】:

    标签: tensorflow machine-learning keras deep-learning conv-neural-network


    【解决方案1】:

    您的输出未针对二元分类进行标准化。 (数据也可能未标准化)。

    如果你加载了一张图片,它可能是 0 到 255,甚至是 0 到 65355。

    您应该规范化y_train(除以y_train.max())并在模型末尾使用'sigmoid' 激活函数。

    【讨论】:

    • 成功了!谢谢丹尼尔。
    • 最近,我尝试使用 (data - mean) / std.我的准确度为 acc: 0.0000e+00。你能告诉我,这里有什么问题以及为什么它可以除以 ytrain.max() 吗??
    • 你可以对“X”进行归一化,但是“Y”必须与你上次的激活函数严格兼容。 “relu”函数在零处停止(并保持在那里)。如果您使用 relu 的 Y 为负值,那么您将陷入困境。我们使用“sigmoid”(0 到 1)和归一化在 0 到 1 之间的 Y。
    • 我明白了。再次感谢:)
    • @federico,您的数据、模型和激活之间必须保持一致。 Sigmoid 期望从 0 到 1 的数据,tanh 期望从 -1 到 +1 的数据,softmax 期望具有多个元素且只有一个元素具有值 1 和所有其他元素的数据为 0。线性激活可以采用任何值,但非标准化数据是几乎总是一件坏事。
    猜你喜欢
    • 1970-01-01
    • 2017-11-13
    • 2021-02-28
    • 2021-06-06
    • 1970-01-01
    • 2019-05-30
    • 2018-06-11
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多