Tensorflow中矩阵乘法matmul和multiply详解

在机器学习或者神经网络编程过程中,我们的运算对象通常是矩阵,而常用的矩阵操作就是点乘(dot product)和元素相乘(elementwise multiplication)。学过线性代数的读者肯定对点乘不会陌生,但是元素相乘就不一定知道了。其实elementwise multiplication就是将两个shape一样的矩阵按照对应元素相乘。

点乘matmul

在tensorflow中的点乘使用matmul方法,其中matmul分两种情况。

首先我们通过一个例子来了解matmul方法的使用 :
代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import numpy as np
import tensorflow as tf
""" 2-D """
print("2-D:")
sess = tf.Session()
a = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3]) # 2-D tensor `a`
print("a = ", sess.run(a))
b = tf.constant([7, 8, 9, 10, 11, 12], shape=[3, 2]) # 2-D tensor `b`
print("b = ", sess.run(a))
c = tf.matmul(a, b)
print("c = ", sess.run(c))
""" 3-D """
print("3-D:")
a = tf.constant(np.arange(1, 13, dtype=np.int32), shape=[2, 2, 3]) # 3-D tensor `a`
print("a = ", sess.run(a))
b = tf.constant(np.arange(13, 25, dtype=np.int32), shape=[2, 3, 2]) # 3-D tensor `b`
print("b = ", sess.run(a))
c = tf.matmul(a, b)
print("c = ", sess.run(c))
sess.close()

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2-D:
a = [[1 2 3]
[4 5 6]]
b = [[1 2 3]
[4 5 6]]
c = [[ 58 64]
[139 154]]
3-D:
a = [[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]
b = [[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]
c = [[[ 94 100]
[229 244]]
[[508 532]
[697 730]]]
  1. 如果做点乘的两个矩阵的shape维度为2维,那么就按照一般矩阵点乘来计算。
  2. 如果点乘的两个矩阵的shape维度为3维,那么我们通常将第一维定义为batch_size,那么matmul方法就会逐个数据的将对应的维度按照第一种情况对两个矩阵做点乘。

元素相乘multiply

两个矩阵中对应元素各自相乘

例如有矩阵

M1 = [
    a b c
    e f g
    h i j
]

M2 = [
    k l m
    n o p
    q r s
]

那么multiply(M1,M2)的结果为:

[
    a*k b*l c*m
    e*n f*o g*p
    h*q i*r j*s
]

代码示例:

1
2
3
4
5
6
7
8
import tensorflow as tf
a = tf.constant([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]])
b = tf.constant([[10., 11., 12.], [13., 14., 15.], [16., 17., 18.]])
c = tf.multiply(a, b)
sess = tf.Session()
print(sess.run(c))
sess.close()

运行结果:

1
2
3
[[ 10. 22. 36.]
[ 52. 70. 90.]
[112. 136. 162.]]
显示 Gitment 评论