Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Numpy 如何在tensorflow中有效地交换张量轴?_Numpy_Tensorflow_Deep Learning - Fatal编程技术网

Numpy 如何在tensorflow中有效地交换张量轴?

Numpy 如何在tensorflow中有效地交换张量轴?,numpy,tensorflow,deep-learning,Numpy,Tensorflow,Deep Learning,我必须使用tf.transpose交换张量轴,以执行批量矩阵乘法(如下所示代码) 张量输入_a:shape[10000,10000] 张量输入:形状[批量大小,10000,10] # reshape_input_b: shape [10000, batch_size, 10] transpose_input_b = tf.transpose(input_b, [1, 0, 2]) # transpose_input_b : shape [10000, batch_size * 10] resh

我必须使用
tf.transpose
交换张量轴,以执行批量矩阵乘法(如下所示代码)

张量输入_a:shape[10000,10000]

张量输入:形状[批量大小,10000,10]

# reshape_input_b: shape [10000, batch_size, 10]
transpose_input_b = tf.transpose(input_b, [1, 0, 2])

# transpose_input_b : shape [10000, batch_size * 10]
reshape_input_b = tf.reshape(transpose_input_b , [10000, -1])

# ret: shape [10000, batch_size * 10]
ret = tf.matmul(input_a, reshape_input_b, a_is_sparse = True)

# reshape_ret: [10000, batch_size, 10]
reshape_ret = tf.reshape(ret, [10000, -1, 10])

# output : [batch_size, 10000, 10]
output = tf.transpose(reshape_ret, [1, 0, 2])
张量输出:形状[批量大小,10000,10]

# reshape_input_b: shape [10000, batch_size, 10]
transpose_input_b = tf.transpose(input_b, [1, 0, 2])

# transpose_input_b : shape [10000, batch_size * 10]
reshape_input_b = tf.reshape(transpose_input_b , [10000, -1])

# ret: shape [10000, batch_size * 10]
ret = tf.matmul(input_a, reshape_input_b, a_is_sparse = True)

# reshape_ret: [10000, batch_size, 10]
reshape_ret = tf.reshape(ret, [10000, -1, 10])

# output : [batch_size, 10000, 10]
output = tf.transpose(reshape_ret, [1, 0, 2])
然而,它似乎很慢。我在
tf.transpose
的文档页面上注意到了这一点:

在numpy中,转置是内存效率较高的恒定时间操作,因为它们只是以调整的步幅返回相同数据的新视图

TensorFlow不支持跨步,所以transpose返回一个新的张量,其中的项被排列


所以,我认为这可能是我的代码运行缓慢的原因?有没有办法交换tensor的轴,或者有效地进行批量矩阵乘法?

为什么您可以比
tensorflow
提供的
transpose
做得更好
numpy
transpose/swap是有效的,因为它只需要改变形状和步幅,不需要复制数据-这是在整形或其他计算需要连续数据之前。@hpaulj那么,有什么方法可以像上面的代码一样进行矩阵乘法,但不使用
tf.transpose
?我需要将两个具有不同秩的矩阵相乘,可能不需要进行转置或轴交换。
np.einsum
可以混合和匹配维度,但我不知道tensorflow是否有此功能。@hpaulj谢谢,tensorflow有
tf.einsum
,我会试试。@Ficush:请确认使用
tf.einsum
是否解决了您的问题。谢谢