Декартово произведение, когда размерность отсутствует - PullRequest
0 голосов
/ 28 декабря 2018

Это связано с проблемой реализации в TensorFlow.У меня есть тензор H размера (batch_size, time_steps, 256) (но batch_size и time_steps None во время сборки).

Я хочу вычислить тензор A формы (batch_size, time_steps, time_steps, n_dim) который является декартовым произведением во временном измерении.Таким образом, в простых терминах:

A[:,i,j,:] = some_func(H[:,i,:], H[:,j,:])

Поскольку число time_steps равно None во время построения графа, какой будет элегантный способ вычисления A?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

У меня есть решение для случая, когда указан размер оси time_steps (т.е. не None).Мы можем легко использовать K.repeat_elements и K.tile для формирования тензоров для декартового произведения:

from keras import layers, models
from keras import backend as K

def some_func(a, b):
    # define the some_func here
    return a + b

def cart_prod(x):
    shp = K.int_shape(x)[1]
    x_rep = K.repeat_elements(x, shp, axis=1)
    x_tile = K.tile(x, [1, shp, 1])
    res = some_func(x_rep, x_tile)
    return K.reshape(res, [-1, shp, shp, K.shape(res)[-1]])

inp = layers.Input((3, 2))
out = layers.Lambda(cart_prod)(inp)
model = models.Model(inp, out)

model.predict(np.arange(6).reshape(1, 3, 2))

Выход:

array([[[[ 0.,  2.],
         [ 2.,  4.],
         [ 4.,  6.]],

        [[ 2.,  4.],
         [ 4.,  6.],
         [ 6.,  8.]],

        [[ 4.,  6.],
         [ 6.,  8.],
         [ 8., 10.]]]], dtype=float32)
0 голосов
/ 28 декабря 2018

Вы можете использовать свойства широковещания TensorFlow для построения декартовых произведений между тензорами, расширяя один тензор дополнительным измерением и умножая его на другой тензор.

import tensorflow as tf

A = tf.placeholder(shape=(None, None, 256), dtype=tf.float32)
B = tf.placeholder(shape=(None, None, 256), dtype=tf.float32)

A_ = tf.expand_dims(A, axis=1)

A_*B

Дает

<tf.Tensor 'mul_1:0' shape=(?, ?, ?, 256) dtype=float32>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...