Добавление пользовательской среднеквадратической ошибки в Keras - PullRequest
1 голос
/ 20 апреля 2019

Я пытаюсь написать функцию RMSE в Keras, которая выполняет RMSE только над значениями массива, которые не равны нулю.У меня есть два массива arr1 и arr2.Оба массива имеют нули в одних и тех же местах (таким образом, они вносят ноль в значение RMSE).Однако мне нужно изменить число, на которое я делю, на число ненулевых значений в arr1 (или arr2)

def root_mean_squared_error(y_true, y_pred):
    nonzero = tf.count_nonzero(y_pred)
   num_zeros=tf.reduce_sum(tf.where(tf.not_equal(y_pred,0),tf.ones_like(y_pred),tf.zeros_like(y_pred))) 
    return K.sqrt((K.sum(K.square(y_pred - y_true))/tf.cast(nonzero, tf.float32)))

mc = keras.callbacks.ModelCheckpoint('modelsPerEpoch/weights{epoch:06d}.hdf5', 
                                     save_weights_only=False, 
                                     period=1)

decay_learner = ValidationLearningRateScheduler()

main_input = Input(shape=(None, 2, 100, 100), dtype='float32', name='input')

mask=Input(shape=(1, 100, 100), dtype='float32', name='mask')

hidden = ConvLSTM2D(filters=16, 
                    kernel_size=(5, 5),  
                    padding='same',  
                    return_sequences=False, 
                    data_format='channels_first')(main_input)

output = Conv2D(filters=1, 
                kernel_size=(1, 1), 
                padding='same',
                activation='sigmoid',
                kernel_initializer='glorot_uniform',
                data_format='channels_first',
                name='output')(hidden)

output_with_mask=Multiply()([output, mask])

sgd = SGD(lr=0.002, momentum=0.0, decay=0.0, nesterov=False)

model = Model(inputs=[main_input, mask], outputs=output_with_mask)

model.compile(optimizer=sgd,
              loss=root_mean_squared_error,
              metrics=[metrics.mse, root_mean_squared_error])

Однако, когда я запускаю это, я получаю «inf», возвращаемое вкомандная строка.Как я могу это исправить?

1 Ответ

1 голос
/ 21 апреля 2019

y_true и y_pred, имеющие нули в одних и тех же местах, недействительны согласно вашему коду.Вы получаете inf в командной строке, потому что ненулевое число в y_pred равно 0, то есть nonzero = 0 в вашем коде.Вы должны считать правильные ненулевые числа и избегать деления на 0 с помощью следующего кода.

def root_mean_squared_error(y_true, y_pred):
    nonzero = tf.count_nonzero(y_true)
    ...
    return K.switch(K.equal(nonzero,0)
                    , K.constant(value=0.)
                    , K.sqrt((K.sum(K.square(y_pred - y_true))/tf.cast(nonzero, tf.float32))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...