学习准备:
所需的库:
tensorflow 1.12.0
numpy 1.19.5
基本初始化函数
1.1 理解张量
tensor:
多维数组(列表), 阶:张量的维数
维数 | 名字 | 栗子 |
---|---|---|
0 | 标量 | s = 1, 2, 3 |
1 | 向量 | v = [1, 2, 3] |
2 | 矩阵 | m = [[1, 2], [3, 4]] |
n | 张量 | t = [[[[(这里有n个方括号)… |
张量可以是0-n阶的数组(列表) |
张量数据类型:
tf.int, tf.float: 浮点型
-tf.int 32, tf.float 32, tf.float 64
tf.bool: 布尔型
- tf.constant([True, False])
tf.string: 字符串型
- tf.string(“hello, world”)
with tf.Session() as sess:
a = np.arange(0, 5)
b = tf.convert_to_tensor(a, dtype=tf.int64)
b_value = sess.run(b)
print(a, b)
输出结果:
- 可以看到,b_value = sess.run(b)之后,b_value成了numpy格式数组。
输出结果:
[0 1 2 3 4] [0 1 2 3 4]
1.2 创建一个tensor
函数:
tf.zeros(维度),
tf.ones(维度),
tf.fill(维度, 指定值)
代码:
with tf.Session() as sess:
a = tf.zeros([1, 2])
b = tf.ones([1, 2])
c = tf.fill([1, 2], 6)
a_value = sess.run(a)
b_value = sess.run(b)
c_value = sess.run(c)
print("a:", a_value, "b:", b_value, "c:", c_value)
运行结果:
a: [[0. 0.]] b: [[1. 1.]] c: [[6 6]]
函数:
正态分布:
tf.random.normal(维度, mean=均值, stddev=标准差)
截断式正态分布:
tf.random.truncated_normal(维度, mean=均值, stddev=标准差)
- tf.random.truncated_normal随机生成的数据取值在均值加减两个标准差范围内
代码:
with tf.Session() as sess:
a = tf.random.normal([1, 3], mean=4, stddev=2)
b = tf.random.truncated_normal([1, 3], mean=4, stddev=2)
a_value = sess.run(a)
b_value = sess.run(b)
print("a:", a_value, "b:", b_value)
输出结果:
a: [[2.6766534 3.4962902 4.4655743]] b: [[5.353275 6.081551 0.55957913]]
函数:
均匀分布随机数
tf.random.uniform(维度, minval=最小值, maxval=最大值)
代码:
with tf.Session() as sess: # 均匀分布随机数
a = tf.random.uniform([1, 2], minval=0, maxval=1)
a_value = sess.run(a)
print("a:", a_value)
输出结果:
a: [[0.94062424 0.09171367]]
类型转换与常见函数1
2.1 强制类型转换
tf.cast(张量名, dtype=数据类型)
2.2计算张量维度上元素的最小值或最大值
tf.reduce_min(张量名)
tf.reduce_max(张量名)
- 栗子:
with tf.Session() as sess:
x1 = tf.constant([1., 2., 3.], dtype=tf.float64)
x2 = tf.cast(x1, tf.int32)
sess.run(x1)
sess.run(x2)
print(x1)
print(x2)
print(sess.run(tf.reduce_min(x2)), sess.run(tf.reduce_max(x2)))
输出结果:
Tensor("Const:0", shape=(3,), dtype=float64)
Tensor("Cast:0", shape=(3,), dtype=int32)
1 3
2.3理解axis:
二维张量或数组中,可以通过调整axis等于0或1来控制执行维度
axis = 0,对列进行操作
axis = 1,对行进行操作
不指定axis,则所有元素参与运算
2.4 理解tf.Variable
这个函数将变量标记为可训练的,被标记的变量会在反向传播中标记自己的梯度信息
神经网络训练中,常用这个函数标记待训练的参数
with tf.Session() as sess:
w = tf.Variable([[2, 3], [1, 4]])
b = tf.Variable(tf.random.normal([2, 2], mean=0, stddev=1))
print(w, b)
init = tf.global_variables_initializer()
sess.run(init)
w_value = sess.run(w)
b_value = sess.run(b)
print(w_value, b_value)
输出结果:
<tf.Variable 'Variable:0' shape=(2, 2) dtype=int32_ref> <tf.Variable 'Variable_1:0' shape=(2, 2) dtype=float32_ref>
[[2 3]
[1 4]]
[[ 1.2650353 0.49283144]
[ 0.13539286 -1.2500311 ]]
注意:
print(w, b) 打印的是变量 w 和 b 的 TensorFlow 对象的字符串表示, 而不是它们的值。
这是因为在 TensorFlow 1.x 中你需要先初始化所有变量,然后才能获取它们的值。
init = tf.global_variables_initializer()
sess.run(init)
这个操作就是初始化所有变量,
然后再用w_value = sess.run(w)来获取变量w的值
常用数学运算函数
3.1 四则运算
要求:两个张量维度相同
张量中对应元素进行四则运算
tf.add
tf.substract
tf.multiply
tf.divide
- 栗子:
with tf.Session() as sess:
x = tf.constant([[1, 2]])
y = tf.constant([[3, 4]])
a = tf.add(x, y)
b = tf.subtract(x, y)
c = tf.multiply(x, y)
d = tf.divide(x, y)
a = sess.run(a)
b = sess.run(b)
c = sess.run(c)
d = sess.run(d)
print(a, b, c, d)
输出:
[[4 6]]
[[-2 -2]]
[[3 8]]
[[0.33333333 0.5 ]]
3.2 平方、次方、开方
函数:
tf.square
tf.pow
tf.sqrt
代码:
with tf.Session() as sess: # 平方,次方与开方
x = tf.constant([[4, 9], [1, 2]], dtype=float)
pow = tf.pow(x, 3)
square = tf.square(x)
sqrt = tf.sqrt(x)
pow = sess.run(pow)
square = sess.run(square)
sqrt = sess.run(sqrt)
print(pow)
print(square)
print(sqrt)
输出结果:
[[ 64. 729.]
[ 1. 8.]]
[[16. 81.]
[ 1. 4.]]
[[2. 3. ]
[1. 1.4142135]]
3.3 矩阵乘法
函数:
tf.matmul
代码:
with tf.Session() as sess: # 矩阵乘法
x = tf.constant([[4, 9], [1, 2]], dtype=float)
y = tf.constant([[4], [1]], dtype=float)
z = tf.matmul(x, y)
z_value = sess.run(z)
print(z_value)
输出结果:
[[25.]
[ 6.]]
梯度计算与常见函数2
4.1 梯度计算
在 TensorFlow 1.x 中,梯度计算通常是通过 tf.gradients 函数来实现的
梯度计算代码:
import tensorflow as tf
w = tf.Variable([3.0, 5.0]) # 变量
loss = tf.pow(w, 2) * 2 # 函数
grad = tf.gradients(loss, w) # 算梯度
init = tf.global_variables_initializer() # 初始化
with tf.Session() as sess:
sess.run(init)
print(sess.run(grad))
输出结果:
[array([12., 20.], dtype=float32)]