Как реализовать гауссовский рендерер со средними и дисперсионными значениями в качестве входных данных в любой среде глубокого моделирования (должен быть обратно распространяемым) - PullRequest
1 голос
/ 05 февраля 2020

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

Здесь мне нужно, чтобы декодер взял свои входные данные, например, тензор 10x2, где каждая строка представляет x,y позиции или координаты, и визуализировал изображение фиксированного предопределенного размера, где в указанном местоположении генерируется 10 гауссовых распределений по входу.

По-другому, мне нужно создать пустой тензор фиксированного размера, заполнить местоположения, заданные координатами 10, значением 1, а затем развернуть гауссово ядро ​​по всему тензору. Например, представьте следующий 1-й сценарий. пусть вход для всей модели будет вектором размера 10. если вход для декодера равен [3, 7], которые представляют собой две x-координаты (индексирование 0), и гауссово ядро ​​размера 3, которое мы хотим использовать, это [0.28, 0.44, 0.28], тогда выходной сигнал декодера должен выглядеть следующим образом (должен быть того же размера, что и исходный вход модели, равный 10):

[0, 0, 0.28, 0.44, 0.28, 0, 0.28, 0.44, 0.28, 0]  

, что совпадает с [0, 0, 0, 1, 0, 0, 0, 1, 0, 0]*[0.28, 0.44, 0.28] где * представляет оператор свертки. обратите внимание, что в первом векторе 1 или расположены в позициях 3 и 7, учитывая формат индексации 0.

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

Этот модуль сам не имеет никаких обучаемых параметров. Кроме того, я не хочу менять слои перед этим модулем рендеринга, и они должны оставаться такими, как есть. В более продвинутой настройке я также хотел бы предоставить 4 значения ковариации в качестве входных данных, то есть вход для рендерера будет иметь вид [num_points, 5], где каждая строка [x_coord, y_coord, cov(x,x), cov(x,y), cov(y,y)].

Как Могу ли я реализовать такой модуль в любой из доступных структур глубокого обучения? намек на что-то похожее также был бы очень полезен.

1 Ответ

0 голосов
/ 06 февраля 2020

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

Таким образом, вместо использования гауссовского ядра, было бы лучше, чтобы фактическая гауссовская функция применялась ко всем пикселям.

Итак, взяв двумерную гауссову функцию распределения:

2d Gaussian

Мы можем использовать это так:

InOurModel

Это означает, что некоторые шаги в пользовательской функции:

import keras.backend as K

def coords_to_gaussian(x): #where x is shape (batch, 10, 2), and 2 = x, y

    #pixel coordinates - must match the values of x and y
    #here I suppose from 0 to image size, but you may want it normalized, maybe
    x_pixels = K.reshape(K.arange(image_size), (1,1,image_size,1))
    x_pixels = K.concatenate([x_pixels]*image_size, axis=-1) #shape(1,1,size,size)

    y_pixels = K.permute_dimensions(x_pixels, (0,1,3,2))

    pixels = K.stack([x_pixels, y_pixels], axis=-1) #shape(1,1,size,size,2)


    #adjusting the AE locations to a compatible shape:
    locations = K.reshape(x, (-1, 10, 1, 1, 2))


    #calculating the upper part of the equation
    result = K.square(pixels - locations) #shape (batch, 10, size, size, 2)
    result = - K.sum(result, axis=-1) / (2*square_sigma) #shape (batch, 10, size, size)

    #calculating the E:
    result = K.exp(result) / (2 * pi * square_sigma)

    #sum the 10 channels (principle of superposition)
    result = K.sum(result, axis=1) #shape (batch, size, size)

    #add a channel for future convolutions
    result = K.expand_dims(result, axis=-1) #shape (batch, size, size, 1)

    return result

Используйте это в слое Lambda:

from keras.layers import Lambda
Lambda(coords_to_gaussian)(coordinates_tensor_from_encoder)

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

...