Предсказания Autoencoder - все NaN из-за использования пользовательской функции потери - PullRequest
0 голосов
/ 26 января 2020

Я создаю автоэнкодер для данных по экспрессии генов. Некоторые гены не экспрессируются и имеют NaN на входе. Мой вывод (прогноз) все NaN. Вот моя функция потерь:

def nan_mse(y_actual, y_predicted):
    per_instance = tf.where(tf.is_nan(y_actual),
    tf.zeros_like(y_actual),
    tf.square(tf.subtract(y_predicted, y_actual)))
    return tf.reduce_mean(per_instance, axis=0)

И модель:

input_data = Input(shape=(1,num_genes))

#Leaky-Parametric-RelU
#Encoder
x = Dense(num_genes)(input_data)
encoder = PReLU()(x)

#Battleneck layer
encoded = Dense(64, activation = 'sigmoid')(encoder)

#Decoder
x = Dense(num_genes)(encoded)
decoder = PReLU()(x)

autoencoder = Model(input_data, decoder)
autoencoder.compile(loss=nan_mse, optimizer = 'adam') 
autoencoder.summary()

history = autoencoder.fit(x_train,x_train, epochs =50, verbose = 2),                      
 callbacks = [MyCustomCallback()])

Моя цель - заставить сеть игнорировать значения NaN, но важно предугадать их на входе. Это выполнимо, завершив функцию потерь?

Прямо сейчас вывод NaN. Пользователь предложил здесь отредактировать код так:

def nan_mse(y_actual, y_predicted):
    stack = tf.stack((tf.is_nan(y_actual), 
                      tf.is_nan(y_predicted)),
                     axis=1)
    is_nans = tf.keras.backend.any(stack, axis=1)
    per_instance = tf.where(is_nans,
                            tf.zeros_like(y_actual),
                            tf.square(tf.subtract(y_predicted, y_actual)))
    print(per_instance)
    return tf.reduce_mean(per_instance, axis=0)

Теперь я получаю 0,0000e + 00 в качестве моей потери, но это не решает проблему root.

Оригинал вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...