Numpy tensorflow'中的障碍;使用批乘法的s-tensordot

Numpy tensorflow'中的障碍;使用批乘法的s-tensordot,numpy,tensorflow,Numpy,Tensorflow,我正在tensorflow中实现RBM 使用mini-batch实现参数更新存在障碍 有两个张量 第一张量的形状是[100,3,1] 第二张量的形状是[100,1,4] 数字100是批次的大小 我想乘以这些张量,得到[100,3,4]张量 但是当我实现像这样的代码时 tf.tensordot(第一张量,第二张量,[[2],[1]]) 结果张量的形状为[100,3100,4] 如何解决这个问题?我不确定您是否仍然面临这个问题(因为已经一个月了),但我通过使用tf.tensordot和tf.map\

我正在tensorflow中实现RBM

使用mini-batch实现参数更新存在障碍

有两个张量

第一张量的形状是[100,3,1] 第二张量的形状是[100,1,4]

数字100是批次的大小

我想乘以这些张量,得到[100,3,4]张量

但是当我实现像这样的代码时

tf.tensordot(第一张量,第二张量,[[2],[1]])

结果张量的形状为[100,3100,4]


如何解决这个问题?

我不确定您是否仍然面临这个问题(因为已经一个月了),但我通过使用
tf.tensordot
tf.map\u fn
解决了同样的问题,它接受嵌套的输入元素并跨第一个维度(通常是批处理)并行化函数。以下函数在任意秩张量的最后两个维度上执行批量并行矩阵乘法(只要最后两个轴为矩阵乘法目的匹配):

用法示例:

>> batchsize = 3
>> tensor1 = np.random.rand(batchsize,3,4,5,2) # final dims [5,2]
>> tensor2 = np.random.rand(batchsize,2,3,2,4) # final dims [2,4]
>> sess.run(tf.shape(matmul_final_two_dims(tensor1, tensor2)))
array([3, 3, 4, 5, 2, 3, 4], dtype=int32)
>> matmul_final_two_dims(tensor1,tensor2)
<tf.Tensor 'map_1/TensorArrayStack/TensorArrayGatherV3:0' shape=(3, 3, 4, 5, 2, 3, 4) dtype=float64>

你可以用它来代替;它期望第一个维度是
batch\u size
,并且应该执行您希望它执行的操作。

您没有执行任何基于收缩的乘法。您只是在做一个外部产品,结果是
100,3100,4
非常有意义。您想在axis
100
上执行什么操作?元素乘法和无收缩?非常感谢您的回答!我在这方面遇到了一些麻烦。einsum版本似乎在CPU和GPU上都快得多。
>> batchsize = 3
>> tensor1 = np.random.rand(batchsize,3,4,5,2) # final dims [5,2]
>> tensor2 = np.random.rand(batchsize,2,3,2,4) # final dims [2,4]
>> sess.run(tf.shape(matmul_final_two_dims(tensor1, tensor2)))
array([3, 3, 4, 5, 2, 3, 4], dtype=int32)
>> matmul_final_two_dims(tensor1,tensor2)
<tf.Tensor 'map_1/TensorArrayStack/TensorArrayGatherV3:0' shape=(3, 3, 4, 5, 2, 3, 4) dtype=float64>
>> tensor1 = tf.constant(np.random.rand(3,4,5))
>> tensor2 = tf.constant(np.random.rand(3,5,7))
>> tf.einsum('bij,bjk->bik', tensor1, tensor2)
<tf.Tensor 'transpose_2:0' shape=(3, 4, 7) dtype=float64>