Я создаю автоэнкодер для данных по экспрессии генов. Некоторые гены не экспрессируются и имеют 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.
Оригинал вопрос.