Керас: собирать тензорные изменения размер партии - PullRequest
3 голосов
/ 05 октября 2019

У меня есть входной тензор формы (5, 2), представляющий пять точек в 2D-пространстве.

Я хотел бы взять первую точку, а затем вычесть ее из всех пяти точек.

Читая вокруг, я подумал, что могу использовать K.gather, чтобы нарезать и повторить первый слой.

После применения его в лямбда-слое размер пакета перезаписывается:

_input = Input(shape=(5, 2))
x = Reshape((5 * 2,))(_input)
x_ = Lambda(lambda t: K.gather(t, [0, 1] * 5))(x)

, что приводит к:

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            (None, 5, 2)         0                                            
__________________________________________________________________________________________________
reshape_1 (Reshape)             (None, 10)           0           input_1[0][0]                    
__________________________________________________________________________________________________
lambda_1 (Lambda)               (10, 10)             0           reshape_1[0][0]                  
__________________________________________________________________________________________________

Что я делаю не так?

Кроме того, есть ли более простой способ сделать это?

Ответы [ 2 ]

1 голос
/ 06 октября 2019
Функция

gather возвращает значения предоставленных индексов из оси пакетного (0-го). Следовательно, он дает нам список (длина = 10) 1-го (индекс: 0) и 2-го (индекс: 1) образцов (форма (10,)) из партии с формой (10, 10), тогда как мы хотим 1-й(индекс: 0) и 2-й (индекс: 1) характерные точки каждого образца в партии. Чтобы справиться с этим, мы можем транспонировать тензор перед использованием функции gather, чтобы функция gather выбирала правильные значения, и, наконец, полученный тензор должен быть снова транспонирован.

_input = Input(shape=(5, 2))
x = Reshape((5 * 2,))(_input)
x_ = Lambda(lambda t: K.transpose(K.gather(K.transpose(t), [0, 1]*5)))(x)

Выход:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 5, 2)]            0         
_________________________________________________________________
reshape (Reshape)            (None, 10)                0         
_________________________________________________________________
lambda (Lambda)              (None, 10)                0         
=================================================================
0 голосов
/ 06 октября 2019

Если вы используете tf.gather(), вы можете избежать использования операции транспонирования, как описано в @ bit01. В tf.gather().

_input = Input(shape=(5, 2))
x = Reshape((5 * 2,))(_input)
x_ = Lambda(lambda t: tf.gather(t, [0, 1]*5, axis=1))(x)

# Layer (type)                 Output Shape              Param #   
# =================================================================
# input_2 (InputLayer)         (None, 5, 2)              0         
# _________________________________________________________________
# reshape_2 (Reshape)          (None, 10)                0         
# _________________________________________________________________
# lambda_1 (Lambda)            (None, 10)                0         
# =================================================================
есть аргумент axis.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...