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
是否解决了您的问题。谢谢