Как обрабатывать функцию потерь с разреженным выходомPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как обрабатывать функцию потерь с разреженным выходом

Сообщение Anonymous »

Я пытаюсь создать модель ML в Tensorflow, которая принимает тензор с формой (128,128,12) и выводит тензор с формой (128,128,3), где выходные измерения означают (x, y, sensor_numb X-Y-координаты. Но если я возьму измерение, у меня всегда будет все 3 показания датчиков.

Код: Выделить всё

from keras import Input, layers, models

input_data = Input(shape=(128,128,12), name="input_data")
input_mask = Input(shape=(128,128,3), name="input_mask")

output_layer = layers.Conv2D(filters=3, kernel_size=(3,3), padding="same", activation="sigmoid", name="output")(input_data)
output_masked = layers.Multiply(name="masked_output")([output_layer, input_mask])

print(output_masked.shape)
# return input_data, input_mask, output_layer, output_masked

model = models.Model(inputs=input_data, outputs=output_layer)
model_masked = models.Model(inputs=[input_data, input_mask], outputs=output_masked)

model_masked.compile(optimizer="adam", loss="mse")
< /code>
Маска просто содержит те, что в координатах, где я проводил измерения, в противном случае нули. Если это полезно, не было бы проблемы использовать нули в Y_TRUE для получения маски, фактические показания датчика всегда превышают 0. Чтобы решить эту проблему, я решил, что мне нужна функция пользовательской потери, которая вычисляет только потерю для координат, где доступны данные. Я попробовал это: < /p>
from keras import ops
def masked_mse(y_true, y_pred):
mask_value = 0
mask = ops.repeat(
ops.cast(
ops.any(
ops.not_equal(y_true, mask_value),
axis=-1, keepdims=True,
),
"float32"
),
repeats=y_true.shape[-1], axis=-1
)
masked_squared_error = ops.square(mask * (y_pred - y_true))
masked_mse = ops.sum(masked_squared_error, axis=-1) / ops.sum(mask, axis=-1) # results in lots of NaNs
# masked_mse = ops.sum(masked_squared_error, axis=-1) / ops.maximum(ops.sum(mask, axis=-1), 1) # results in lots of zeros
return masked_mse
< /code>
Но я не понимаю, как эта функция потерь применяется во время обучения.
Если вы заметили, я включил два варианта о том, как вычислять masked_mse < /code>.
Первый из них результатов в NANS, где не представлены измерения. Выход на x-y-координату.
во время тренировок, однако, tensorflow регистрирует потерю как одно значение, которое всегда будет NAN.
Я не понимаю, как рассчитывается эта агрегация. Потери и модель обучения для прогнозирования в основном нулей. С сокращением = нет 
Это рассчитывает координат MSE. С REDUT = "SUM_OVER_BATCH_SIZE" (по умолчанию) Это рассчитывает одно значение. Это как я должен определить свою функцию потери в маске?


Подробнее здесь: https://stackoverflow.com/questions/796 ... rse-output
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»