(1) element-wise
(2) matrix-wise
(3) dim-wise
b = tf.fill([2, 2], 2.)
: 2×2的元素都为2的Tensor;
a = tf.ones([2, 2])
: 2×2的元素都为1的Tensor;
(1) a + b
: 2×2的元素都为3的Tensor;
(2) a - b
: 2×2的元素都-1的Tensor;
(3) a * b
: 2×2的元素都为2的Tensor;
(4) a / b
: 2×2的元素都为0.5的Tensor;
(5) b // a
: 整除操作,得到2×2的元素都为2的Tensor;
(6) b % a
: 余除操作,得到2×2的元素都为0的Tensor;
(1) tf.math.log(a)
: l o g e a log_ea logea,因为 l o g e 1 = 0 log_e1=0 loge1=0,所以得到2×2的元素都为0的Tensor;
(2) tf.exp(a):
e a e^a ea,因为 e 1 = e e^1=e e1=e,而 e ≈ 2.7182817 e≈2.7182817 e≈2.7182817,所以得到2×2的元素都为2.7182817的Tensor;
没有这俩API,不过我们可以利用:
l o g a b l o g a c = l o g c b \frac{log_a b}{log_a c}=log_c b logaclogab=logcb
→ \to →
l o g e b l o g e c = l o g c b \frac{log_e b}{log_e c}=log_c b logeclogeb=logcb
来计算,如下图所示:
(1) tf.math.log(8.)/tf.math.log(2.)
: l o g 2 8 = 3.0 log_2 8=3.0 log28=3.0;
(2) tf.math.log(100.)/tf.math.log(10.)
: l o g 10 100 = 2.0 log_{10} 100=2.0 log10100=2.0;
(1) tf.pow(b, 3)
: n次方操作,因为 2 3 = 8 2^3=8 23=8,所以得到2×2的元素都为8的Tensor;
(2)b**3
: 与tf.pow(b, 3)
的作用一样,所以得到2×2的元素都为8的Tensor;
(3) tf.sqrt(b)
: 开方操作,因为 √ 2 ≈ 1.4142135 √2≈1.4142135 √2≈1.4142135,所以得到2×2的元素都为1.4142135的Tensor;
(1) a@b
: 矩阵a与矩阵b相乘,得到2×2的元素都为4的Tensor;
(2) tf.matmul(a, b)
: 作用与a@b
一样;
a = tf.ones([4, 2, 3])
: 可以看成是4个2×3的矩阵元素都为1的Tensor;
a = tf.fill([4, 2, 3], 2.)
: 可以看成是4个2×3的矩阵元素都为2的Tensor;
(3) a@b
: 可以看成是[2, 3]的矩阵和[3, 5]的矩阵相乘,这个操作是可以并行的,我们可以一次并行4个这样的操作,所以得到4个2×5的矩阵,所以其shape=[4, 2, 5];
(4) tf.matmul(a, b)
: 作用与a@b一样;
(1) bb = tf.broadcast_to(b, [4, 3, 5])
: 使用Broadcasting方法将b.shape由[3, 5]变为[4, 3, 5];
(2) a@bb
: 可以看成是[2, 3]的矩阵和[3, 5]的矩阵相乘,这个操作是可以并行的,我们可以一次并行4个这样的操作,所以得到4个2×5的矩阵,所以其shape=[4, 2, 5];
参考文献:
[1] 龙良曲:《深度学习与TensorFlow2入门实战》