强制tensor转换为设定数据类型
tf.cast(x, dtype, name=None)
# e.g.
x = tf.constant([1.8, 2.2], dtype=tf.float32)
tf.dtypes.cast(x, tf.int32) #
取出张量中的最小值
tf.math.reduce_min(input_tensor, axis=None, keepdims=False, name=None)
# e.g.
a = tf.constant([[1, 2], [3, 4]])
tf.reduce_min(a) #tf.Tensor(1, shape=(), dtype=int32)
取出张量中的最大值
tf.math.reduce_max(input_tensor, axis=None, keepdims=False, name=None)
# e.g.
x = tf.constant([5, 1, 2, 4])
print(tf.reduce_max(x)) #tf.Tensor(5, shape=(), dtype=int32)
axis = 0 对第一个维度进行操作
axis = 1 对第二个维度进行操作
在二维张量即矩阵中
axis = 0 表示跨行进行操作
axis = 1 表示跨列进行操作
计算张量中所有元素的平均值
tf.reduce_mean(input_tensor, axis=None, keepdims=False, name=None)
# e.g.
x = tf.constant([[1, 2, 3],[2, 2, 2]])
print(tf.reduce_mean(x)) # tf.Tensor(2, shape=(), dtype=int32)
x = tf.constant([[1, 2, 3],[2, 2, 3]])
#由于为int型结果会向下取整
print(tf.reduce_mean(x)) # tf.Tensor(2, shape=(), dtype=int32)
对张量按某一维度进行求和
tf.math.reduce_sum(input_tensor, axis=None, keepdims=False, name=None)
# e.g.
x = tf.constant([[1, 2, 3],[2, 2, 3]])
# 列求和
print(tf.reduce_sum(x, axis = 1)) # tf.Tensor([6 7], shape=(2,), dtype=int32)
# 行求和
print(tf.reduce_sum(x, axis = 0)) # tf.Tensor([3 4 6], shape=(3,), dtype=int32)
将变量标记为可训练,被标记的变量会在反向传播中中记录梯度信息。在神经网络的训练中常用该函数标记待训练参数
tf.Variable(
initial_value=None, trainable=None, validate_shape=True, caching_device=None,
name=None, variable_def=None, dtype=None, import_scope=None, constraint=None,
synchronization=tf.VariableSynchronization.AUTO,
aggregation=tf.compat.v1.VariableAggregation.NONE, shape=None
)
# e.g.
w = tf.Variable([[1.], [2.]]) # 待训练参数
x = tf.constant([[3., 4.]])
print(tf.matmul(w, x))
"""
tf.Tensor(
[[3. 4.]
[6. 8.]], shape=(2, 2), dtype=float32)
"""
对应元素的四则运算:tf.add,tf.subtract,tf.multiply,tf.divide(只有维度相同的张量才可以进行四则运算)
tf.add(x, y, name=None) # 两张量对应元素相加
tf.subtract(x, y, name=None) #两张量对应元素相减
tf.multiply(x, y, name=None) #两张量对应元素相乘
tf.divide(x, y, name=None) #两张量对应元素相除
#e.g.
a = tf.constant([[5, 1], [2, 4]])
b = tf.constant([[3, -1], [0, 9]])
print(tf.add(a, b))
print(tf.subtract(a, b))
print(tf.multiply(a, b))
print(tf.divide(a, b))
print(tf.divide(b, a))
"""
tf.Tensor(
[[ 8 0]
[ 2 13]], shape=(2, 2), dtype=int32)
tf.Tensor(
[[ 2 2]
[ 2 -5]], shape=(2, 2), dtype=int32)
tf.Tensor(
[[15 -1]
[ 0 36]], shape=(2, 2), dtype=int32)
tf.Tensor(
[[ 1.66666667 -1. ]
[ inf 0.44444444]], shape=(2, 2), dtype=float64)
tf.Tensor(
[[ 0.6 -1. ]
[ 0. 2.25]], shape=(2, 2), dtype=float64)
"""
平方、次方与开方:tf.square,tf.pow,tf.sqrt
tf.square(x, name=None) # 对张量中的每一元素进行平方运算
tf.pow(x, y, name=None) # 对张量中的每一元素进行次方运算
tf.sqrt(x, name=None) # 对张量中的每一元素进行开方运算
# e.g.
a = tf.constant([[5, 1], [2, 4]])
print(tf.square(a))
print(tf.pow(a, 3))
a = tf.cast(a, dtype=tf.float32) # 在进行开方操作前将张量的数据类型强制转换为浮点型
print(tf.sqrt(a))
"""
tf.Tensor(
[[25 1]
[ 4 16]], shape=(2, 2), dtype=int32)
tf.Tensor(
[[125 1]
[ 8 64]], shape=(2, 2), dtype=int32)
tf.Tensor(
[[2.236068 1. ]
[1.4142135 2. ]], shape=(2, 2), dtype=float32)
"""
矩阵相乘:tf.matmul
tf.matmul(
a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False,
a_is_sparse=False, b_is_sparse=False, name=None
)
# e.g.
a = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3])
print(a)
"""
tf.Tensor(
[[1 2 3]
[4 5 6]], shape=(2, 3), dtype=int32)
"""
b = tf.constant([7, 8, 9, 10, 11, 12], shape=[3, 2])
print(b)
"""
tf.Tensor(
[[ 7 8]
[ 9 10]
[11 12]], shape=(3, 2), dtype=int32)
"""
c = tf.matmul(a, b)
print(c)
"""
tf.Tensor(
[[ 58 64]
[139 154]], shape=(2, 2), dtype=int32)
"""
切分传入张量的第一维度,生成输入 feature / label 对,常用于构建数据集。(Numpy 与 Tensor 格式都可用该语句读入数据)
dataset = tf.data.Dataset.from_tensor_slices((feature, label))
# e.g.
feature = tf.constant([[1, 2, 3],[2, 4, 5]])
label = tf.constant([[0], [1]])
dataset = tf.data.Dataset.from_tensor_slices((feature, label))
for element in dataset:
print(element)
"""
(, )
(, )
"""
和 with 结构配合使用记录计算过程,gradient 求出张量的梯度。详细的参数设置请见另一篇博客:
GradientTape函数参数解读
tf.GradientTape(persistent=False, watch_accessed_variables=True)
# e.g.
with tf.GradientTape() as tape:
w = tf.Variable(tf.constant(3.0))
loss = tf.pow(w, 2)
grad = tape.gradient(loss, w)
print(grad) # tf.Tensor(6.0, shape=(), dtype=float32)
python 内建函数,它可遍历每个元素(如列表,元组,字符串),组合为:索引 元素,常在 for 循环中使用。
enumerate(iterable, start=0)
# e.g.
seq = ["one", "two", "three"]
for i, element in enumerate(seq):
print(i, element)
"""
0 one
1 two
2 three
"""
独热编码(one-hot encoding),在分类问题中常用,独热码做标签
该函数将待转换数据,转换为 one-hot 形式的数据输出
tf.one_hot(
indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None
)
# e.g.
classes = 3 # 总类别数
labels = tf.constant([1, 0, 2])
output = tf.one_hot(labels, depth = classes)
print(output)
"""
tf.Tensor(
[[0. 1. 0.]
[1. 0. 0.]
[0. 0. 1.]], shape=(3, 3), dtype=float32)
"""
使共 n 个类别的分类任务的 n 个输出满足概率分布,原理是如下数学公式:
p ( y i ) = e y i ∑ i = 0 n e y i p(y_{i}) = \frac{e^{y_{i}}}{\sum_{i=0}^{n}e^{y_{i}}} p(yi)=∑i=0neyieyi
and
∑ i = 0 n p ( y i ) = 1 \sum_{i=0}^{n}p(y_{i}) = 1 i=0∑np(yi)=1
tf.nn.softmax(logits, axis=None, name=None)
# e.g.
y = tf.constant([1.01, 2.01, -0.66])
y_probability = tf.nn.softmax(y)
print(y_probability)
"""
tf.Tensor([0.25598174 0.69583046 0.0481878 ], shape=(3,), dtype=float32)
"""
赋值操作,更新参数并返回
调用该函数之前必须先用 tf.Variable 定义变量为可训练(可自更新)
assign_sub(value)
# e.g.
w = tf.Variable(4)
w.assign_sub(1)
print(w) #
返回张量沿指定维度的最大值的索引
tf.argmax(input, axis=None, output_type=tf.dtypes.int64, name=None)
# e.g.
import numpy as np
test = np.array([[1, 2, 3],[2, 3, 4],[5, 4, 3]])
print(test)
print(tf.argmax(test, axis=0)) # 每列最大值的索引
print(tf.argmax(test, axis=1)) # 每行最大值的索引
"""
[[1 2 3]
[2 3 4]
[5 4 3]]
tf.Tensor([2 2 1], shape=(3,), dtype=int64)
tf.Tensor([2 2 0], shape=(3,), dtype=int64)
"""
参考文献:
北京大学 人工实践 Tensorflow 2.0 笔记
Tensorflow 官方API文档