数学运算
目录
Outline
- +-*/
- **,pow,square
- sqrt
- //,%
- exp,log
- @,matmul
- linear layer
Operation type
- element-wise
- +-*/
- matrix-wise
- @,matmul
- [b,3,4]@[b,4,5] = b([3,4][4,5])=[b,3,5]
- dim-wise
- reduce_mean/max/min/sum
+-*/%//
import tensorflow as tf
b = tf.fill([2, 2], 2.)
a = tf.ones([2, 2])
a+b
<tf.Tensor: id=6, shape=(2, 2), dtype=float32, numpy=
array([[3., 3.],
[3., 3.]], dtype=float32)>
a-b
<tf.Tensor: id=8, shape=(2, 2), dtype=float32, numpy=
array([[-1., -1.],
[-1., -1.]], dtype=float32)>
a*b
<tf.Tensor: id=10, shape=(2, 2), dtype=float32, numpy=
array([[2., 2.],
[2., 2.]], dtype=float32)>
a/b
<tf.Tensor: id=12, shape=(2, 2), dtype=float32, numpy=
array([[0.5, 0.5],
[0.5, 0.5]], dtype=float32)>
b // a
<tf.Tensor: id=14, shape=(2, 2), dtype=float32, numpy=
array([[2., 2.],
[2., 2.]], dtype=float32)>
b % a
<tf.Tensor: id=16, shape=(2, 2), dtype=float32, numpy=
array([[0., 0.],
[0., 0.]], dtype=float32)>
tf.math.log, tf.exp
a
<tf.Tensor: id=5, shape=(2, 2), dtype=float32, numpy=
array([[1., 1.],
[1., 1.]], dtype=float32)>
tf.math.log(a) # 只有以e为底的log
<tf.Tensor: id=23, shape=(2, 2), dtype=float32, numpy=
array([[0., 0.],
[0., 0.]], dtype=float32)>
tf.exp(a)
<tf.Tensor: id=21, shape=(2, 2), dtype=float32, numpy=
array([[2.7182817, 2.7182817],
[2.7182817, 2.7182817]], dtype=float32)>
tf.math.log(8.)/tf.math.log(2.) # 以2为底
<tf.Tensor: id=43, shape=(), dtype=float32, numpy=3.0>
tf.math.log(100.)/tf.math.log(10.) # 以10为底
<tf.Tensor: id=49, shape=(), dtype=float32, numpy=2.0>
pow, sqrt
b
<tf.Tensor: id=2, shape=(2, 2), dtype=float32, numpy=
array([[2., 2.],
[2., 2.]], dtype=float32)>
tf.pow(b, 3)
<tf.Tensor: id=53, shape=(2, 2), dtype=float32, numpy=
array([[8., 8.],
[8., 8.]], dtype=float32)>
b**3
<tf.Tensor: id=56, shape=(2, 2), dtype=float32, numpy=
array([[8., 8.],
[8., 8.]], dtype=float32)>
tf.sqrt(b)
<tf.Tensor: id=58, shape=(2, 2), dtype=float32, numpy=
array([[1.4142135, 1.4142135],
[1.4142135, 1.4142135]], dtype=float32)>
@, matmul
a, b
(<tf.Tensor: id=5, shape=(2, 2), dtype=float32, numpy=
array([[1., 1.],
[1., 1.]], dtype=float32)>,
<tf.Tensor: id=2, shape=(2, 2), dtype=float32, numpy=
array([[2., 2.],
[2., 2.]], dtype=float32)>)
a@b
<tf.Tensor: id=62, shape=(2, 2), dtype=float32, numpy=
array([[4., 4.],
[4., 4.]], dtype=float32)>
tf.matmul(a, b)
<tf.Tensor: id=64, shape=(2, 2), dtype=float32, numpy=
array([[4., 4.],
[4., 4.]], dtype=float32)>
a = tf.ones([4, 2, 3]) # 4作为batch处理
b = tf.fill([4, 3, 5], 2.) # 4作为batch处理
a@b
<tf.Tensor: id=72, shape=(4, 2, 5), dtype=float32, numpy=
array([[[6., 6., 6., 6., 6.],
[6., 6., 6., 6., 6.]],
[[6., 6., 6., 6., 6.],
[6., 6., 6., 6., 6.]],
[[6., 6., 6., 6., 6.],
[6., 6., 6., 6., 6.]],
[[6., 6., 6., 6., 6.],
[6., 6., 6., 6., 6.]]], dtype=float32)>
tf.matmul(a, b)
<tf.Tensor: id=74, shape=(4, 2, 5), dtype=float32, numpy=
array([[[6., 6., 6., 6., 6.],
[6., 6., 6., 6., 6.]],
[[6., 6., 6., 6., 6.],
[6., 6., 6., 6., 6.]],
[[6., 6., 6., 6., 6.],
[6., 6., 6., 6., 6.]],
[[6., 6., 6., 6., 6.],
[6., 6., 6., 6., 6.]]], dtype=float32)>
With broadcasting
a.shape
TensorShape([4, 2, 3])
b.shape
TensorShape([4, 3, 5])
bb = tf.broadcast_to(b, [4, 3, 5])
a@bb
<tf.Tensor: id=78, shape=(4, 2, 5), dtype=float32, numpy=
array([[[6., 6., 6., 6., 6.],
[6., 6., 6., 6., 6.]],
[[6., 6., 6., 6., 6.],
[6., 6., 6., 6., 6.]],
[[6., 6., 6., 6., 6.],
[6., 6., 6., 6., 6.]],
[[6., 6., 6., 6., 6.],
[6., 6., 6., 6., 6.]]], dtype=float32)>
Y = X@W +b
x = tf.ones([4, 2])
W = tf.ones([2, 1])
b = tf.constant(0.1) # 自动broadcast为[4,1]
x@W + b
<tf.Tensor: id=88, shape=(4, 1), dtype=float32, numpy=
array([[2.1],
[2.1],
[2.1],
[2.1]], dtype=float32)>
out = x@W + b
tf.nn.relu(out)
<tf.Tensor: id=95, shape=(4, 1), dtype=float32, numpy=
array([[2.1],
[2.1],
[2.1],
[2.1]], dtype=float32)>