Умножьте набор констант (массив 1D) на набор матриц (массив 3D) в Tensorflow - PullRequest
0 голосов
/ 30 августа 2018

Моя конечная цель - обучить 4-мерное многомерное гауссовское распределение, параметризованное по среднему и ковариации

enter image description here

, где

enter image description here

и

enter image description here

В настоящее время у меня есть следующий код:

import tensorflow as tf
import numpy as np

value = [[1,2.0,3,4,5],[0,2,4,6,8],[80,7,6,5,4]]

value=tf.constant(value)

cov= tf.slice(value,[0,int(value.shape[1])-1],[int(value.shape[0]),1])
mean= tf.slice(value,[0,0],[int(value.shape[0]),int(value.shape[1])-1])

eyes=tf.eye(int(mean.shape[1]),batch_shape=[int(value.shape[0])])


#eyes = tf.multiply(eyes,cov)



normal = tf.contrib.distributions.MultivariateNormalFullCovariance(
                 loc=mean,
                 covariance_matrix=eyes) 

value = [[1,2.0,3,4,5],[0,2,4,6,8],[80,7,6,5,4]] - пример того, что может получить остальная часть кода.

В приведенном выше примере

cov = <tf.Tensor 'Slice_2:0' shape=(3, 1) dtype=float32>
eyes = <tf.Tensor 'eye_1/MatrixDiag:0' shape=(3, 4, 4) dtype=float32>

                     cov =  [[5.] [8.] [4.]]` 
                     eyes =  [[[1. 0. 0. 0.]
                              [0. 1. 0. 0.]
                              [0. 0. 1. 0.]
                              [0. 0. 0. 1.]]

                             [[1. 0. 0. 0.]
                              [0. 1. 0. 0.]
                              [0. 0. 1. 0.]
                              [0. 0. 0. 1.]]

                             [[1. 0. 0. 0.]
                              [0. 1. 0. 0.]
                              [0. 0. 1. 0.]
                              [0. 0. 0. 1.]]]`

Мой вопрос: как мне получить result с учетом cov и eyes? где результат выглядит следующим образом:

result = [[[5., 0., 0., 0.],
           [0., 5., 0., 0.],
           [0., 0., 5., 0.],
           [0., 0., 0., 5.]],

          [[8., 0., 0., 0.],
           [0., 8., 0., 0.],
           [0., 0., 8., 0.],
           [0., 0., 0., 8.]],

          [[4., 0., 0., 0.],
           [0., 4., 0., 0.],
           [0., 0., 4., 0.],
           [0., 0., 0., 4.]]]

enter image description here

Спасибо, заранее .

1 Ответ

0 голосов
/ 30 августа 2018

Tensorflow использует тот же тип индексации, что и numpy, который может быть довольно мощным.

Подробности можно посмотреть здесь: https://docs.scipy.org/doc/numpy-1.13.0/user/basics.broadcasting.html Обратите внимание, что np.newaxis определено так же, как None.

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

import numpy as np
cov = np.array([[5.],[8.],[4.]])
eyes = np.array([[[1.0,0,0,0],[0.0,1.0,0.0,0],[0.0,0.0,1.0,0],[0.0,0.0,0.0,1.0]],[[1.0,0,0,0],[0.0,1.0,0.0,0],[0.0,0.0,1.0,0],[0.0,0.0,0.0,1.0]],[[1.0,0,0,0],[0.0,1.0,0.0,0],[0.0,0.0,1.0,0],[0.0,0.0,0.0,1.0]]])
result = cov[:,:,None]*eyes

Использование None здесь добавляет дополнительное измерение, превращая cov в массив 3x1x1, который может однозначно умножаться на массив 3x4x4. Вы можете использовать None таким же образом и в тензорном потоке.

Два массива могут однозначно умножаться, если каждый соответствующий размер имеет одинаковый размер или один из них имеет размер 1.

...