直接参考朋友的文章—

Tensorflow入门

什么是Tensorflow

Tensorflow是机器学习的框架之一

Tensor

什么是张量?

​ 概括地说:在计算机范畴下,张量就是具有统一类型的多维数组

创建张量

​ 创建一个张量只需要给出两个内容:值与类型(类型不指定,将使用默认的类型)

  • 0维的张量,就是一个数字,或者称为标量,或称为0秩张量
1
2
3
4
rank_0_tensor = tf.constant(4) # 4就是一个标量,也叫一个0维张量
# constant() 会创建一个常量
print(rank_0_tensor)
# 输出 tf.Tensor(4, shape=(), dtype=int32)
  • 一维数组,就是一维的张量,1秩张量,有一个轴
1
2
3
rank_1_tensor = tf.constant([2.0, 3.0, 4.0])
print(rank_1_tensor)
# 输出 tf.Tensor([2. 3. 4.], shape=(3,), dtype=float32)
  • 二维数组,就是二维的张量,2秩张量,有两个轴,高维同理

​ 注意:维(Dimension)秩(Rank / Degree)含义不同。可能会看到 “二维张量” 之类的表述,但 2 秩张量通常并不是用来描述二维空间。

​ 可以使用 ones()zeros() 来创建张量

1
2
3
4
5
6
test1 = tf.ones(3) # 创建1秩tensor,并用1填充
test2 = tf.ones([2,2]) # 创建2秩tensor,并用1填充
test3 = tf.ones([2,2,2]) # 创建3秩tensor,并用1填充
print(test1)
print(test2)
print(test3)

​ 输出内容如下,可以看到,如果参数是一个数组,那么这个数组表示这个张量的形状

1
2
3
4
5
6
7
8
9
10
11
12
tf.Tensor([1. 1. 1.], shape=(3,), dtype=float32)

tf.Tensor(
[[1. 1.]
[1. 1.]], shape=(2, 2), dtype=float32)

tf.Tensor(
[[[1. 1.]
[1. 1.]]

[[1. 1.]
[1. 1.]]], shape=(2, 2, 2), dtype=float32)

张量的属性

  • type 类型:元素的类型是什么(比如 int16、int32、string)
  • shape 形状:每个轴的元素个数(或者说每个轴的长度)
  • rank/degree 秩:有多少个轴
  • dimension 维:某个特定的轴
  • elements 元素:张量含有元素的多少,是各个形状的乘积

张量的种类

张量有不同的种类

  • Variable
  • Constant
  • Placeholder
  • SparseTensor

只有 Variable 是可变的张量,其他张量都是不可变的

1
2
tf.Variable(x1,x2) # x1表示内容,x2表示类型
tf.constant(x1,x2) #同上

改变张量的形状

reshape 函数可以更改张量的形状,但前提是:重构张量中的元素数量必须与原始张量中的元素数量相匹配

1
2
3
4
tensor1 = tf.ones([1,2,3])
tensor2 = tf.reshape(tensor1, [2,3,1])
tensor3 = tf.reshape(tensor2, [-1]) # -1 会自动算出该维度的数量 ,这样就是一个 6个长度的一维数组
# 如果选择 tf.reshape(tensor2, [3,-1]) 这样就是一个 3*2 的二维数组

输出结果为

1
2
3
4
5
6
7
8
9
10
11
12
tf.Tensor(
[[[1. 1. 1.]
[1. 1. 1.]]], shape=(1, 2, 3), dtype=float32)
tf.Tensor(
[[[1.]
[1.]
[1.]]

[[1.]
[1.]
[1.]]], shape=(2, 3, 1), dtype=float32)
tf.Tensor([1. 1. 1. 1. 1. 1.], shape=(6,), dtype=float32)

对张量进行切片

tensor[dim1, dim2, dim3...] 每个位置上对应的数字就找到了对应的元素

用一个例子来介绍切片(类似于 py 的切片)

1
2
3
4
5
6
7
8
matrix = [[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15],
[16,17,18,19,20]]

tensor = tf.Variable(matrix, dtype=tf.int32)
print(tf.rank(tensor)) # tf.Tensor(2, shape=(), dtype=int32)
print(tensor.shape) # (4, 5)

切片操作:

1
2
3
4
5
6
7
8
9
three = tensor[0,2]  # 找到第一行,第三列的元素 3

row1 = tensor[0] # 选择了第一行

column1 = tensor[:,0] # 选择了第一列

row_2_and_4 = tensor[1::2] # 第二行与第三行

column_1_in_row_2_and_3 = tensor[1:3, 0] # 选择行[1,3),每行的第1个元素

结果如下:

1
2
3
4
5
6
7
tf.Tensor(3, shape=(), dtype=int32)
tf.Tensor([1 2 3 4 5], shape=(5,), dtype=int32)
tf.Tensor([ 1 6 11 16], shape=(4,), dtype=int32)
tf.Tensor(
[[ 6 7 8 9 10]
[16 17 18 19 20]], shape=(2, 5), dtype=int32)
tf.Tensor([ 6 11], shape=(2,), dtype=int32)

tensor[:,0] 为什么这行代码选择了第一列?

答:第一个数: 表示选择所有的行,而第二个 0 表示选择每行的第一个数字,因此是第一列

关于切片的操作,可以看此篇 blog

Tensor 的基本 API 总结

创建

1
2
3
4
tf.Variable(x1,x2) # 创建变量
tf.constant(x1,x2) # 创建常量
tf.ones(x) # x为一个数或一个数组,创建如数组所示形状的张量,并用1填充
tf.zeros(x) # 同上,使用0填充

查看属性

1
2
tf.rank(x) # 查看x张量的秩
tensor1.shape # 查看张量的形状(注意这个并不是方法,而是一个属性)

更改形状

1
tf.reshape(tensor1, x2) # x2为形状的数组,更改前后元素数必须相同,-1可以自动计算数量

关于切片的操作,可以看此篇 blog

参考资料