gpt4 book ai didi

python - 当图像以 0 到 9 的小数进行评级时,Earth Mover Loss 的输入类型应该是什么(Keras、Tensorflow)

转载 作者:行者123 更新时间:2023-12-03 14:38:05 29 4
gpt4 key购买 nike

我正在尝试实现谷歌的 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


找到 下面给出的损失函数代码
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,)

问题 :
当我使用 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 的损失值

我尝试了几种方法:
  • 将分数创建为 rounded = math.round(score)并使用 class_mode=sparse
  • 将分数创建为 str(rounded)然后使用 class_mode=categorical

  • 但我每次都有错误。

    请帮助我使用 ImageDataGenerator 加载图像关于我应该如何将图像加载到这个模型中 .

    模型结构不应改变。

    最佳答案

    以下介绍here , 我对 NaN gradient 有一些想法...

    我认为您的损失是 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)
  • 排除 sqrt,通过这种方式,Earth Mover Loss 更类似于 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)
  • 关于python - 当图像以 0 到 9 的小数进行评级时,Earth Mover Loss 的输入类型应该是什么(Keras、Tensorflow),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61672258/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com