介绍
以龙良曲老师的《深度学习与TensorFlow 2入门实战》为教材,记录一下我的学习笔记。
代码
运行结果
tf.where
tf.where(tensor)
a=tf.random.normal([3,3])
mask=a>0
mask
生成一个3*3的随机数矩阵,> 0 的值返回True,< 0 的值返回False
<tf.Tensor: shape=(3, 3), dtype=bool, numpy=
array([[False, False, True],
[ True, False, False],
[ True, False, True]])>
tf.boolean_mask(a,mask)
取出所有 > 0 的值,即取出True对应a中的值
<tf.Tensor: shape=(4,), dtype=float32, numpy=array([0.91642493, 0.6902244 , 0.01110752, 0.06577968], dtype=float32)>
indices=tf.where(mask)
indices
返回所有True的索引位置,即返回所有 > 0 值的索引位置。
为一个n*2(如果原函数为2维张量)的矩阵。
<tf.Tensor: shape=(4, 2), dtype=int64, numpy=
array([[0, 2],
[1, 0],
[2, 0],
[2, 2]])>
tf.gather_nd(a,indices)
通过索引位置,在a中取出所有 > 0 的值。
<tf.Tensor: shape=(4,), dtype=float32, numpy=array([0.91642493, 0.6902244 , 0.01110752, 0.06577968], dtype=float32)>
tf.where(condition,A,B)
True 从 A 中取值, False 从 B 中取值。
cond=tf.constant([[True, False],[False, True]])
A=tf.ones([2,2])
B=tf.zeros([2,2])
tf.where(cond,A,B)
<tf.Tensor: shape=(2, 2), dtype=float32, numpy=
array([[1., 0.],
[0., 1.]], dtype=float32)>
tf.scatter_nd
需要传入3个参数 tf.scatter_nd( indices, updates, shape)
- indices
- updates
- shape
举个例子:更新一个全为0的向量
shape = tf.constant([6])
indices = tf.constant([4],[1],[3])
updates = tf.constant([8,5,2])
tf.scatter_nd(indices, updates, shape)
<tf.Tensor: shape=(6,), dtype=int32, numpy=array([0,5,0,2,8,0])>
还可以对指定位置相加、相减
如果是高维度:
tf.meshgrid
Numpy 实现
points = []
for y in np.linspace(-2,2,5):
for x in np.linspace(-2,2,5):
points.append([x,y])
return np.array(points)
利用GPU加速
- x为[-2,2]区间内的值
- y为[-2,2]区间内的值
- 由x、y生产 Points,一个N*2的矩阵
# 在[-2,2]区间内生成5个平均间隔值,即[-2., -1., 0., 1., 2.,]
x=tf.linspace(-2.,2.,5)
y=tf.linspace(-2.,2.,5)
points_x, points_y=tf.meshgrid(x,y)
points_x
<tf.Tensor: shape=(5, 5), dtype=float32, numpy=
array([[-2., -1., 0., 1., 2.],
[-2., -1., 0., 1., 2.],
[-2., -1., 0., 1., 2.],
[-2., -1., 0., 1., 2.],
[-2., -1., 0., 1., 2.]], dtype=float32)>
points_y
<tf.Tensor: shape=(5, 5), dtype=float32, numpy=
array([[-2., -2., -2., -2., -2.],
[-1., -1., -1., -1., -1.],
[ 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1.],
[ 2., 2., 2., 2., 2.]], dtype=float32)>
points=tf.stack([points_x,points_y], axis=2)
形成25个点,保存在points中,即25*2的矩阵
<tf.Tensor: shape=(5, 5, 2), dtype=float32, numpy=
array([[[-2., -2.],
[-1., -2.],
[ 0., -2.],
[ 1., -2.],
[ 2., -2.]],
[[-2., -1.],
[-1., -1.],
[ 0., -1.],
[ 1., -1.],
[ 2., -1.]],
[[-2., 0.],
[-1., 0.],
[ 0., 0.],
[ 1., 0.],
[ 2., 0.]],
[[-2., 1.],
[-1., 1.],
[ 0., 1.],
[ 1., 1.],
[ 2., 1.]],
[[-2., 2.],
[-1., 2.],
[ 0., 2.],
[ 1., 2.],
[ 2., 2.]]], dtype=float32)>
例子:画出函数的等高线
z
=
s
i
n
(
x
)
+
s
i
n
(
y
)
z=sin(x)+sin(y)
z=sin(x)+sin(y)函数采样点
最大值2,位于黄色区域
最小值-2,位于蓝色区域
import tensorflow as tf
import matplotlib.pyplot as plt
def func(x):
"""
:param x: [b, 2]
:return:
"""
# [b,0] 这一列为 x 的值, [b,1] 这一列为 y 的值,
z = tf.math.sin(x[...,0]) + tf.math.sin(x[...,1])
return z
x = tf.linspace(0., 2*3.14, 500)
y = tf.linspace(0., 2*3.14, 500)
# [50, 50]
point_x, point_y = tf.meshgrid(x, y)
# [50, 50, 2]
points = tf.stack([point_x, point_y], axis=2)
# points = tf.reshape(points, [-1, 2])
print('points:', points.shape)
z = func(points)
print('z:', z.shape)
plt.figure('plot 2d func value')
plt.imshow(z, origin='lower', interpolation='none')
plt.colorbar()
plt.figure('plot 2d func contour')
plt.contour(point_x, point_y, z)
plt.colorbar()
plt.show()