Можно ли маскировать выходные переменные нейронной сети в зависимости от входных переменных

#python #tensorflow #keras #deep-learning #neural-network

#питон #тензорный поток #keras #глубокое обучение #нейронная сеть

Вопрос:

У меня есть странный вариант использования нейронной сети, и я хочу понять, есть ли способ выполнить то, что я пытаюсь сделать.

Я пытаюсь обучить нейронную сеть, которая принимает 3 входные переменные и выводит 96 непрерывных переменных. В идеале выходные данные должны создавать непрерывную кривую, однако ожидаемые значения y содержат много недостающих точек данных (gt;50%), распределенных случайным образом, что влияет на то, как работает модель. Я знаю, какие точки данных отсутствуют, и пытаюсь найти способ игнорировать эти выходные данные во время обратного распространения.

Например:

 Input = [1,2,3] Expected Output = [1,2,3,NAN,5,6,7,NAN,...] # NAN is set to 0 for training  

В настоящее время я пытаюсь использовать именно этот метод (tensorflow.keras).

 in1 = layers.Input(3) in2 = layers.Input(96) # Array of Bools, =1 if expected output variable is a number, =0 if nan hidden1 = layers.Dense(37,activation='relu',use_bias=True)(in1) hidden2 = layers.Dense(37,activation='relu',use_bias=True)(hidden1) hidden3 = layers.Dense(37,activation='relu',use_bias=True)(hidden2) hidden3_in2 = layers.concatenate([hidden3,in2]) out = layers.Dense(96)(hidden3_in2)  model = Model(inputs=[in1,in2], outputs=[out])  

Ожидаемый результат этого должен быть равен 0, вычисляемому там, где in2 == 0, и число больше 0 везде. При использовании модели для прогнозирования данных я вставляю массив 1 в in2, указывая, что ожидаемые значения не должны равняться 0, поэтому должна выводиться непрерывная кривая. Однако многие выходные переменные по-прежнему равны 0, что не является идеальным.

По сути, мой вопрос заключается в следующем: есть ли хороший способ замаскировать конкретные результаты во время обратного распространения и/или расчета потерь с использованием массива?

Заранее спасибо!

Ответ №1:

Все, что вам нужно сделать, это написать свою пользовательскую функцию потерь, в которой вы буквально маскируете значения потерь.

Что-то вроде

 def my_loss_fn(y_true, y_pred):  squared_difference = tf.square(y_true - y_pred)  mask = 1.0 - tf.math.is_nan(y_true)  return tf.reduce_mean(squared_difference * mask, axis=-1) # Note the `axis=-1`  model.compile(optimizer='adam', loss=my_loss_fn)