本文为8月10日TensorFlow学习笔记,分为九个章节:
两组数据:
[
c
l
a
s
s
1
−
4
,
s
t
u
d
e
n
t
s
,
s
c
o
r
e
s
]
[
c
l
a
s
s
5
−
6
,
s
t
u
d
e
n
t
s
,
s
c
o
r
e
s
]
[class\ 1-4, students, scores]\\\ [class\ 5-6, students, scores]
[class 1−4,students,scores] [class 5−6,students,scores]
a = tf.ones([4, 35, 8])
b = tf.ones([2, 35, 8])
c = tf.concat([a, b], axis=0)
c.shape
>>> TensorShape([6, 35, 8])
注意:a 和 b 维度必须完全一致。
a.shape
b.shape
>>> TensorShape([4, 35, 8])
tf.stack([a, b], axis=0).shape
>>> TensorShape([2, 4, 35, 8])
c.shape
TensorShape([2, 4, 35, 8])
aa, bb = tf.unstack(c, axis=0)
aa.shape, bb.shape
>>> (TensorShape([4, 35, 8]), TensorShape([4, 35, 8]))
res = tf.split(c, axis = 3, num_or_size_splits=[2, 2, 4])
res[0].shape, res[1].shape, res[2].shape
>>> (TensorShape([2, 4, 35, 2]), TensorShape([2, 4, 35, 2]), TensorShape([2, 4, 35, 4]))
b = tf.ones([2, 2])
tf.norm(b, ord=1)
>>> <tf.Tensor: shape=(), dtype=float32, numpy=4.0>
tf.norm(b, ord=1, axis=0)
>>> <tf.Tensor: shape=(2,), dtype=float32, numpy=array([2., 2.], dtype=float32)>
tf.norm(b, ord=1, axis=1)
>>> <tf.Tensor: shape=(2,), dtype=float32, numpy=array([2., 2.], dtype=float32)>
b = tf.ones([2, 2])
tf.norm(b)
>>> <tf.Tensor: shape=(), dtype=float32, numpy=2.0>
a = tf.random.normal([4, 10])
tf.reduce_min(a), tf.reduce_max(a), tf.reduce_mean(a)
>>> (<tf.Tensor: shape=(), dtype=float32, numpy=-2.0422432>,
<tf.Tensor: shape=(), dtype=float32, numpy=2.3004503>,
<tf.Tensor: shape=(), dtype=float32, numpy=-0.08308693>)
a = tf.random.normal([4, 10])
tf.argmax(a).shape
>>> TensorShape([10])
tf.argmax(a)
>>> <tf.Tensor: shape=(10,), dtype=int64, numpy=array([2, 1, 2, 1, 3, 2, 3, 0, 2, 0], dtype=int64)>
tf.argmin(a)
>>> <tf.Tensor: shape=(10,), dtype=int64, numpy=array([0, 2, 1, 2, 2, 3, 0, 1, 0, 1], dtype=int64)>
a = tf.constant([1, 2, 3, 4, 5])
b = tf.range(5)
tf.equal(a, b)
>>> <tf.Tensor: shape=(5,), dtype=bool, numpy=array([False, False, False, False, False])>
res = tf.equal(a, b)
tf.reduce_sum(tf.cast(res, dtype=tf.int32))
>>> <tf.Tensor: shape=(), dtype=int32, numpy=0>
在一维张量中找到唯一的元素。
a = tf.range(5)
tf.unique(a)
>>> Unique(y=<tf.Tensor: shape=(5,), dtype=int32, numpy=array([0, 1, 2, 3, 4])>, idx=<tf.Tensor: shape=(5,), dtype=int32, numpy=array([0, 1, 2, 3, 4])>)
a = tf.constant([4, 2, 2, 4, 3])
tf.unique(a)
>>> Unique(y=<tf.Tensor: shape=(3,), dtype=int32, numpy=array([4, 2, 3])>, idx=<tf.Tensor: shape=(5,), dtype=int32, numpy=array([0, 1, 1, 0, 2])>)
a
<tf.Tensor: shape=(5,), dtype=int32, numpy=array([1, 4, 0, 2, 3])>
tf.sort(a)
>>> <tf.Tensor: shape=(5,), dtype=int32, numpy=array([0, 1, 2, 3, 4])>
tf.sort(a, direction='DESCENDING')
>>> <tf.Tensor: shape=(5,), dtype=int32, numpy=array([4, 3, 2, 1, 0])>
a
>>> <tf.Tensor: shape=(3, 3), dtype=int32, numpy=
array([[8, 0, 4],
[0, 7, 8],
[7, 6, 2]])>
tf.sort(a)
>>> <tf.Tensor: shape=(3, 3), dtype=int32, numpy=
array([[0, 4, 8],
[0, 7, 8],
[2, 6, 7]])>
a
<tf.Tensor: shape=(5,), dtype=int32, numpy=array([1, 4, 0, 2, 3])>
tf.argsort(a)
>>> <tf.Tensor: shape=(5,), dtype=int32, numpy=array([2, 0, 3, 4, 1])>
tf.argsort(a)
>>> <tf.Tensor: shape=(3, 3), dtype=int32, numpy=
array([[1, 2, 0],
[0, 1, 2],
[2, 1, 0]])>
a
>>> <tf.Tensor: shape=(3, 3), dtype=int32, numpy=
array([[8, 0, 4],
[0, 7, 8],
[7, 6, 2]])>
res = tf.math.top_k(a, 2)
res.indices
>>> <tf.Tensor: shape=(3, 2), dtype=int32, numpy=
array([[0, 2],
[2, 1],
[0, 1]])>
res.values
>>> <tf.Tensor: shape=(3, 2), dtype=int32, numpy=
array([[8, 4],
[8, 7],
[7, 6]])>

a
>>> <tf.Tensor: shape=(3, 3), dtype=int32, numpy=
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])>
tf.pad(a, [[1, 0], [0, 1]])
>>> <tf.Tensor: shape=(4, 4), dtype=int32, numpy=
array([[0, 0, 0, 0],
[0, 1, 2, 0],
[3, 4, 5, 0],
[6, 7, 8, 0]])>
a = tf.random.normal([4, 28, 28, 3])
b = tf.pad(a, [[0, 0], [2, 2], [2, 2], [0, 0]])
b.shape
>>> TensorShape([4, 32, 32, 3])
在同一维度上复制。
a = tf.reshape(tf.range(9), [3, 3])
a
>>> <tf.Tensor: shape=(3, 3), dtype=int32, numpy=
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])>
tf.tile(a, [1, 2])
>>> <tf.Tensor: shape=(3, 6), dtype=int32, numpy=
array([[0, 1, 2, 0, 1, 2],
[3, 4, 5, 3, 4, 5],
[6, 7, 8, 6, 7, 8]])>
a = tf.range(10)
a
>>> <tf.Tensor: shape=(10,), dtype=int32, numpy=array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>
tf.maximum(a, 2)
>>> <tf.Tensor: shape=(10,), dtype=int32, numpy=array([2, 2, 2, 3, 4, 5, 6, 7, 8, 9])>
tf.minimum(a, 8)
>>> <tf.Tensor: shape=(10,), dtype=int32, numpy=array([0, 1, 2, 3, 4, 5, 6, 7, 8, 8])>
tf.clip_by_value(a, 2, 8)
>>> <tf.Tensor: shape=(10,), dtype=int32, numpy=array([2, 2, 2, 3, 4, 5, 6, 7, 8, 8])>
a = tf.random.normal([2, 2], mean=10)
a
>>> <tf.Tensor: shape=(2, 2), dtype=float32, numpy=
array([[9.9873085, 9.921564 ],
[8.984995 , 8.998684 ]], dtype=float32)>
tf.norm(a)
>>> <tf.Tensor: shape=(), dtype=float32, numpy=18.970772>
aa = tf.clip_by_norm(a, 10)
tf.norm(aa)
>>> <tf.Tensor: shape=(), dtype=float32, numpy=10.0>
返回一个布尔张量中真值的位置。对于非布尔型张量,非0的元素都判为True。
a = tf.random.normal([3, 3])
a
>>> <tf.Tensor: shape=(3, 3), dtype=float32, numpy=
array([[-1.560072 , 0.5151809, -1.4624902],
[ 2.0856383, 1.3947535, -1.6492294],
[-2.4880304, -1.8168672, 1.519111 ]], dtype=float32)>
mask = a>0
mask
>>> <tf.Tensor: shape=(3, 3), dtype=bool, numpy=
array([[False, True, False],
[ True, True, False],
[False, False, True]])>
tf.boolean_mask(a, mask)
>>> <tf.Tensor: shape=(4,), dtype=float32, numpy=array([0.5151809, 2.0856383, 1.3947535, 1.519111 ], dtype=float32)>
indices = tf.where(mask)
indices
>>> <tf.Tensor: shape=(4, 2), dtype=int64, numpy=
array([[0, 1],
[1, 0],
[1, 1],
[2, 2]], dtype=int64)>
mask
>>> <tf.Tensor: shape=(3, 3), dtype=bool, numpy=
array([[False, True, False],
[ True, True, False],
[False, False, True]])>
A = tf.ones([3, 3])
B = tf.zeros([3, 3])
tf.where(mask, A, B)
>>> <tf.Tensor: shape=(3, 3), dtype=float32, numpy=
array([[0., 1., 0.],
[1., 1., 0.],
[0., 0., 1.]], dtype=float32)>
将 updates 中的值按照 indices 插到指定的shape的位置上。
tf.scatter_nd(indices, updates, shape)

indices = tf.constant([[4], [3], [1], [7]])
updates = tf.constant([9, 10, 11, 12])
shape = tf.constant([8])
tf.scatter_nd(indices, updates, shape)
>>> <tf.Tensor: shape=(8,), dtype=int32, numpy=array([ 0, 11, 0, 10, 9, 0, 0, 12])>

y = tf.linspace(-2., 2, 5)
y
>>> <tf.Tensor: shape=(5,), dtype=float32,
numpy=array([-2., -1., 0., 1., 2.], dtype=float32)>
x = tf.linspace(-2., 2, 5)
points_x, points_y = tf.meshgrid(x, y)
points_x.shape
>>> TensorShape([5, 5])
points = tf.stack([points_x, points_y], axis=2)
points
>>> <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)>
得到的是 Numpy 格式。
(x, y), (x_test, y_test) = keras.datasets.mnist.load_data()
x.shape
>>> (60000, 28, 28)
y.shape
>>> (60000,)
x.min(), x.max(), x.mean()
>>> (0, 255, 33.318421449829934)
x_test.shape, y_test.shape
>>> ((10000, 28, 28), (10000,))
y_onehot = tf.one_hot(y, depth=10)
y_onehot[:2]
>>> <tf.Tensor: shape=(2, 10), dtype=float32, numpy=
array([[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)>
(x, y), (x_test, y_test) = keras.datasets.cifar10.load_data()
x.shape, y.shape, x_test.shape, y_test.shape
>>> ((50000, 32, 32, 3), (50000, 1), (10000, 32, 32, 3), (10000, 1))
x.min(), x.max()
>>> (0, 255)
作用:把给定的元组、列表和张量等数据进行特征切片。
切片的范围从最外层维度开始,如果有多个特征组合,那么一次切片是把最外层维度的数据切开。
(x, y), (x_test, y_test) = keras.datasets.cifar10.load_data()
db = tf.data.Dataset.from_tensor_slices(x_test)
next(iter(db)).shape
>>> TensorShape([32, 32, 3])
db = tf.data.Dataset.from_tensor_slices((x_test, y_test))
next(iter(db))[0].shape
>>> TensorShape([32, 32, 3])

x = tf.random.normal([2, 3])
model = keras.Sequential([
keras.layers.Dense(2, activation='relu'),
keras.layers.Dense(2, activation='relu'),
keras.layers.Dense(2)
])
model.build(input_shape=[None, 4])
model.summary()
for p in model.trainable_variables:
print(p.name, p.shape)
y = tf.constant([1, 2, 3, 0, 2])
y = tf.one_hot(y, depth=4)
y = tf.cast(y, dtype=tf.float32)
out = random.normal([5, 4])
out = tf.random.normal([5, 4])
loss1 = tf.reduce_mean(tf.square(y - out))
loss2 = tf.reduce_mean(tf.losses.MSE(y, out))
loss1
>>> <tf.Tensor: shape=(), dtype=float32, numpy=1.2998294>
loss2
>>> <tf.Tensor: shape=(), dtype=float32, numpy=1.2998294>
x = tf.random.normal([1, 784])
w = tf.random.normal([784, 2])
b = tf.zeros([2])
logits = x @ w + b
prob = tf.math.softmax(logits, axis=1)
tf.losses.categorical_crossentropy(prob, logits, from_logits=True)
>>> <tf.Tensor: shape=(1,), dtype=float32, numpy=array([1.6746448e-11], dtype=float32)>