[TensorFlow 2] 高阶OP tf.where tf.scatter_nd tf.meshgrid

文章目录

介绍

以龙良曲老师的《深度学习与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)

[TensorFlow 2] 高阶OP tf.where tf.scatter_nd tf.meshgrid
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的向量
[TensorFlow 2] 高阶OP tf.where tf.scatter_nd tf.meshgrid

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])>

还可以对指定位置相加、相减

如果是高维度:
[TensorFlow 2] 高阶OP tf.where tf.scatter_nd tf.meshgrid


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()
上一篇:UVa 1235 Frequent values


下一篇:多层感知机从零开始实现