当图像的小数从0到9时,地球移动者损失的输入类型应该是什么(Keras, Tensorflow)?

问题描述 投票:0回答:1

我正在尝试实现Google的NIMA研究论文,他们对图像质量进行评级。我使用的是TID2013数据集。我有3000张图片,每张图片的得分从0.00到9.00。

df.head()
>>
Image Name          Score
0   I01_01_1.bmp    5.51429
1   i01_01_2.bmp    5.56757
2   i01_01_3.bmp    4.94444
3   i01_01_4.bmp    4.37838
4   i01_01_5.bmp    3.86486

I 发现 损失函数的代码如下

def earth_mover_loss(y_true, y_pred):
    cdf_true = K.cumsum(y_true, axis=-1)
    cdf_pred = K.cumsum(y_pred, axis=-1)
    emd = K.sqrt(K.mean(K.square(cdf_true - cdf_pred), axis=-1))
    return K.mean(emd)

我把建立模型的代码写成。

base_model = InceptionResNetV2(input_shape=(W,H, 3),include_top=False,pooling='avg',weights='imagenet')
for layer in base_model.layers: 
    layer.trainable = False

x = Dropout(0.45)(base_model.output)
out = Dense(10, activation='softmax')(x) # there are 10 classes

model = Model(base_model.input, out)
optimizer = Adam(lr=0.001)
model.compile(optimizer,loss=earth_mover_loss,)

PROBLEM:当我使用 ImageDataGenerator 作为。

gen=ImageDataGenerator(validation_split=0.15,preprocessing_function=preprocess_input)

train = gen.flow_from_dataframe(df,TRAIN_PATH,x_col='Image Name',y_col='Score',subset='training',class_mode='sparse')

val = gen.flow_from_dataframe(df,TRAIN_PATH,x_col='Image Name',y_col='Score',subset='validation',class_mode='sparse')

它要么在训练过程中给出一个错误,要么给出一个损失值。nan

我试过几种方法。

  1. 将分数创建为 rounded = math.round(score) 并使用 class_mode=sparse
  2. 创建分数为 str(rounded) 再用 class_mode=categorical

但我每次都出现错误。

请帮我用以下方法加载图片。ImageDataGenerator 我应该如何将图片加载到这个模型中?.

模型结构不应该改变。

python tensorflow keras deep-learning image-recognition
1个回答
3
投票

按照介绍的内容 此处我有几个想法,关于 氮化钠梯度...

我认为你的损失是nan,因为sqrt是在负数上计算的,这是不允许的.所以有两种可能。

  • 在计算sqrt之前,先剪掉所有的值 这样的话,我们就把所有的值<=0剪掉,用一个小的epsilon代替它们

    def earth_mover_loss(y_true, y_pred):
        cdf_true = K.clip(K.cumsum(y_true, axis=-1), 0,1)
        cdf_pred = K.clip(K.cumsum(y_pred, axis=-1), 0,1)
        emd = K.sqrt(K.maximum(K.mean(K.square(cdf_true - cdf_pred), axis=-1), K.epsilon()))
        return K.mean(emd)
    
  • 不包括平方,这样一来,地球移动者损失更类似于CDF之间的MSE。

    def earth_mover_loss(y_true, y_pred):
        cdf_true = K.clip(K.cumsum(y_true, axis=-1), 0,1)
        cdf_pred = K.clip(K.cumsum(y_pred, axis=-1), 0,1)
        emd = K.mean(K.square(cdf_true - cdf_pred), axis=-1)
        return K.mean(emd)
    
© www.soinside.com 2019 - 2024. All rights reserved.