Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TensorFlow中不广播tf.matmul_Tensorflow_Broadcasting - Fatal编程技术网

TensorFlow中不广播tf.matmul

TensorFlow中不广播tf.matmul,tensorflow,broadcasting,Tensorflow,Broadcasting,我有一个我一直在努力解决的问题。它与tf.matmul()及其不广播有关 我知道在上有一个类似的问题,但是tf.batch\u matmul()看起来不适合我的情况 我需要将输入数据编码为4D张量: X=tf.placeholder(tf.float32,shape=(无,无,无,100)) 第一个维度是批次的大小,第二个维度是批次中的条目数。 您可以将每个条目想象为多个对象(三维)的组合。最后,每个对象由100个浮点值的向量描述 请注意,我在第二和第三维度中使用了None,因为每个批次的实际尺

我有一个我一直在努力解决的问题。它与
tf.matmul()
及其不广播有关

我知道在上有一个类似的问题,但是
tf.batch\u matmul()
看起来不适合我的情况

我需要将输入数据编码为4D张量:
X=tf.placeholder(tf.float32,shape=(无,无,无,100))
第一个维度是批次的大小,第二个维度是批次中的条目数。 您可以将每个条目想象为多个对象(三维)的组合。最后,每个对象由100个浮点值的向量描述

请注意,我在第二和第三维度中使用了None,因为每个批次的实际尺寸可能会发生变化。然而,为了简单起见,让我们用实际数字来塑造张量:
X=tf.placeholder(tf.float32,shape=(5,10,4100))

以下是我计算的步骤:

  • 计算100个浮点值的每个向量的函数(例如,线性函数)
    W=tf.Variable(tf.truncated_normal([100,50],stddev=0.1))
    Y=tf.matmul(X,W)
    问题:tf.matmul()没有广播,使用tf.batch\u matmul()也没有成功 Y的预期形状:(5,10,4,50)

  • 为批处理的每个条目应用平均池(在每个条目的对象上):
    Y\u avg=tf.reduce\u均值(Y,2)
    Y_平均值的预期形状:(5,10,50)

  • 我原以为
    tf.matmul()
    会支持广播。然后我找到了
    tf.batch_matmul()
    ,但它看起来仍然不适用于我的情况(例如,W至少需要有3个维度,不清楚为什么)

    顺便说一句,上面我使用了一个简单的线性函数(其权重存储在W中)。但在我的模型中,我有一个很深的网络。所以,我遇到的更普遍的问题是,自动计算张量的每个切片的函数。这就是为什么我期望
    tf.matmul()
    会有广播行为(如果是这样,可能根本不需要
    tf.batch\u matmul()

    期待向您学习!
    Alessio

    你可以通过重塑
    X
    来塑造
    [n,d]
    ,其中
    d
    是一个计算“实例”的维度(在你的例子中为100),而
    n
    是多维对象中这些实例的数量(在你的例子中
    5*10*4=200)。重塑后,可以使用
    tf.matmul
    然后重塑回所需形状。前三个维度可能会有所不同,这一点很棘手,但您可以使用
    tf.shape
    在运行时确定实际的形状。最后,您可以执行计算的第二步,这应该是一个简单的
    tf。在各个维度上减少_mean
    。总之,它看起来是这样的:

    X = tf.placeholder(tf.float32, shape=(None, None, None, 100))
    W = tf.Variable(tf.truncated_normal([100, 50], stddev=0.1))
    X_ = tf.reshape(X, [-1, 100])
    Y_ = tf.matmul(X_, W)
    X_shape = tf.gather(tf.shape(X), [0,1,2]) # Extract the first three dimensions
    target_shape = tf.concat(0, [X_shape, [50]])
    Y = tf.reshape(Y_, target_shape)
    Y_avg = tf.reduce_mean(Y, 2)
    

    正如您链接的文件的重命名标题所示,您应该使用。它使两个张量之间的轴对收缩与Numpy的一致。对于您的情况:

    X = tf.placeholder(tf.float32, shape=(5, 10, 4, 100))
    W = tf.Variable(tf.truncated_normal([100, 50], stddev=0.1))
    Y = tf.tensordot(X, W, [[3], [0]])  # gives shape=[5, 10, 4, 50]
    

    谢谢你的回答。不幸的是,您的解决方案有两个问题:1。它在所有向量上取平均值,这是不正确的2。重塑仅在固定形状张量的情况下有效,而我有前3个维度变化的批次(每个批次固定,各批次不同),为什么它在所有向量上都是平均值
    X[i,j,k,:]
    构成一个向量,对吗?通过按照我建议的方式进行重塑,我们将这些向量堆叠在一个大矩阵中(每行包含一个向量)。如果我们现在做矩阵乘法,每一行分别与矩阵相乘。现在,我们可以对每一行执行所需的操作(例如,取平均值,如您的示例中所示),然后重新安排到我们想要的形状。我看不出向量的平均值在哪里,但我可能遗漏了一些东西。关于第二个问题,只要向量的维数(在你的例子中为100)是固定的,
    tf.reformate(X,[-1100])
    应该可以正常工作吗?使用
    -1
    ,现在不需要先验地计算其他维度。没错,它并不是所有向量的平均值,但您实现的并不是我需要的。您的代码所做的是为每个向量获取一个标量,而我需要为张量的每个片段获取一个平均向量。事实上,在我的问题中,我指出Y_avg的预期形状必须是(5,10,50):第三维消失了,因为我们得到了50个元素的平均向量。对于第二个问题,我确实可以使用-1来重塑,但是我不能回到原来的张量形式。如果我的问题不是100%清楚,我深表歉意,再次感谢您的帮助!PS:
    Y\u avg\u
    在你的代码中有形状(200),因此你甚至不能用
    Y\u avg=tf重塑。重塑(Y\u avg[5,10,50])
    因为
    200!=5*10*50