Какими должны быть типы входных данных для потерь при движении Земли, когда изображения имеют десятичный рейтинг от 0 до 9 (Keras, Tensorflow) - PullRequest
6 голосов
/ 08 мая 2020

Я пытаюсь реализовать исследование NIMA Research от Google, в котором они оценивают качество изображения. Я использую набор данных 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,)

ПРОБЛЕМА : Когда я использую 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')

, это либо дает ошибку во время обучения, либо значение потери of nan

Я пробовал несколько методов:

  1. Создание оценок как rounded = math.round(score) и использование class_mode=sparse
  2. Создание оценок как str(rounded) а затем используйте class_mode=categorical

, но у меня каждый раз возникает ошибка.

ПОЖАЛУЙСТА, помогите мне с загрузкой изображений, используя ImageDataGenerator о том, как я должен загрузить изображения в эту модель .

Структура модели не должна измениться.

1 Ответ

3 голосов
/ 13 мая 2020

Следуя тому, что было введено здесь , у меня есть несколько идей по поводу градиента NaN ...

Я думаю, что ваши потери составляют nan, потому что sqrt вычисляется на отрицательном числе, что недопустимо. поэтому есть две возможности:

  • обрезать значения перед применением sqrt. Таким образом мы обрезаем все значения <= 0, заменяя их маленьким эпсилоном </p>

    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 больше похож на MSE между CDF

    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)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...