【问题标题】:Multiply a set of constants (1D array) with a set of matrixes (3D array) in Tensorflow在 Tensorflow 中将一组常数(1D 数组)与一组矩阵(3D 数组)相乘
【发布时间】:2018-08-29 23:04:29
【问题描述】:

我的最终目标是训练基于均值和协方差参数化的 4D 多元高斯分布

在哪里,

和,

目前我有以下代码:

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.]]]`

我的问题是,在给定coveyes 的情况下,如何获得result?结果如下:

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.]]]

谢谢,提前

【问题讨论】:

    标签: python tensorflow matrix matrix-multiplication


    【解决方案1】:

    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 数组相乘。你也可以在 tensorflow 中这样使用None

    如果每个对应维度的大小相同,或者其中一个的大小为 1,则两个数组可以明确相乘。

    【讨论】:

      猜你喜欢
      • 2020-04-16
      • 2020-02-23
      • 2013-01-08
      • 1970-01-01
      • 2015-01-24
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      相关资源
      最近更新 更多