TensorFlow数据格式及名词记录以及一些常用的操作


代码地址


TensorFlow 名词汇总

TensorFlow:一个开源软件库,用于使用数据流图进行张量计算。

tensor:张量

CNN:卷积神经网络

RNN:循环神经网络

1. Tensor 张量结构介绍

1.1 张量的阶

代码演示
0 scala = 1000
1 vector = [ 2,3,4,5]
2 matrix=[[1],[2],[3]]
3 3-tensor = [[[1,2][2,3][3,4]]]
n n-Tensor

1.2 张量的形状

形状 维数 例子
0 [] 0-D 4
1 [D0] 1-D [2]
2 [D0,D1] 2-D [6,2]
3 [D0,D1,D2] 3-D [7,3,2]
n [D0,D1,D2,…,Dn-1] n-D [7,3,2,…,4]

1.3 张量的数据类型

数据类型 Python类型 描述
DT_FLOAT tf.float32 32位浮点型
DT_DOUBLE tf.float64 64位浮点型
DT_INT8 tf.ini8 8位有符号整数
DT_INT16 tf.16 16位有符号整数
DT_INT32 tf.32 32位有符号整数
DT_INT64 tf.64 64位有符号整数
DT_UINT8 tf.uint8 8位无符号整数
DT_STRING tf.string 可变长度字节数组
DT_BOOL tf.bool 逻辑布尔型

1.4 张量运算

Tensorflow支持许多矩阵运算,如矩阵转置、乘法、行列式、逆矩阵等运算。

以下便是代码实例:

1.4.1 定义和使用张量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import numpy as np
x = tf.constant(np.random.rand(32).astype(np.float32))

#定义随机常数

y = tf.constant([[1.,2.,3.],[3.,2.,6.,],[3.,2.,6.]])

# 定义常数

x_data = np.array([[1.,2.,3.],[3.,2.,6.,],[3.,2.,6.]])

#创建一个matrix

x1 = tf.convert_to_tensor(x_data,dtype=tf.float32)

#将array转换为tensor类型

#在tensorflow中 numpy 和 tensor 之间是可以相互转换的

c = tf.matmul(x1,y)

#创建一个矩阵乘类型,接受a,b个tensor参数,对a,b进行矩阵乘运算,结果放入c

b = tf.Variable(tf.zeros[1000])

#创建一个张量变量

----------------------------
# 以下代码为查看张量数据流图、新版本可能无法查看
import tensorflow as tf
g = tf.Graph()
with g.as_default():
import tensorflow as tf
sess = tf.Session()
W_m = tf.Variable(tf.zeros([10,5]))
x_v = tf.placeholder(tf.float32,[None,10])
result = tf.matmul(x_v,W_m)
print (g.as_graph_def())
-----------------------------
1.4.2 张量的基本运算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import tensorflow as tf
sess = tf.InteractiveSession()
x = tf.constant([
[2,5,3,-5],
[0,3,-2,5],
[4,3,5,3],
[6,1,4,0]
])
y = tf.constant([
[4,7,4,-3,4],
[6,4,-7,4,7],
[2,3,2,1,4],
[1,5,5,5,2]
])
floatx = tf.constant([
[2.,5.,3.,-5.],
[0.,3.,-2.,5.],
[4.,3.,5.,3.],
[6.,1.,4.,0.]
])
print(tf.transpose(x).eval())

#eval 将tensor转为numpy transpose运算,矩阵转置运算

print(tf.matrix_determinant(floatx).eval())

#求矩阵行列式的值

print(tf.matrix_inverse(floatx).eval())

#求逆矩阵运算

print(tf.matrix_solve(floatx,[[1],[1],[1],[1]]).eval()) #矩阵求解(方程组)
1.4.3 张量的约简

约简:缩减一个维度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import tensorflow as tf
sess = tf.InteractiveSession()
x = tf.constant([
[1,2,3],
[3,2,1],
[-1,-2,-3]
])
print(tf.reduce_prod(x,reduction_indices=1).eval())
print(tf.reduce_min(x,reduction_indices=1).eval())
print(tf.reduce_max(x,reduction_indices=1).eval())
print(tf.reduce_mean(x,reduction_indices=1).eval())
# 结果:
[ 6 6 -6] // 每行相乘
[ 1 1 -3] // 每行取最小
[ 3 3 -1] // 每行取最大
[ 2 2 -2] // 每行平均值

1.4.4 张量的分割
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import tensorflow as tf
sess = tf.InteractiveSession()
seg_ids = tf.constant([0,1,1,2,2])
tensl = tf.constant([
[2,5,3,-5],
[0,3,-2,5],
[4,3,5,3],
[6,1,4,0],
[6,1,4,0]
])
print(tf.segment_sum(tensl,seg_ids).eval())
print(tf.segment_prod(tensl,seg_ids).eval())
print(tf.segment_min(tensl,seg_ids).eval())
print(tf.segment_max(tensl,seg_ids).eval())
print(tf.segment_mean(tensl,seg_ids).eval())

#输出
[[ 2 5 3 -5]
[ 4 6 3 8]
[12 2 8 0]]

[[ 2 5 3 -5]
[ 0 9 -10 15]
[ 36 1 16 0]]

[[ 2 5 3 -5]
[ 0 3 -2 3]
[ 6 1 4 0]]

[[ 2 5 3 -5]
[ 4 3 5 5]
[ 6 1 4 0]]

[[ 2 5 3 -5]
[ 2 3 1 4]
[ 6 1 4 0]]
1.4.5 张量的序列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import tensorflow as tf
sess = tf.InteractiveSession()
x = tf.constant([
[2,5,3,-5],
[0,3,-2,5],
[4,3,5,3],
[6,1,4,0]
])
listx = tf.constant([1,2,3,4,5,6,7,8])
listy = tf.constant([4,5,8,9])
boolx = tf.constant([[True,False],[False,True]])
print(tf.argmin(x,1).eval()) #最小值列
print(tf.argmax(x,1).eval()) #最大值列
print(tf.setdiff1d(listx,listy)[0].eval()) #元素不同的列
print(tf.where(boolx).eval()) # 显示真值所在坐标
print(tf.unique(listx)[0].eval()) # 去重复
#结果
[3 2 1 3]
[1 3 2 0]
[1 2 3 6 7]
[[0 0]
[1 1]]
[1 2 3 4 5 6 7 8]
1.4.6 张量形状变换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import tensorflow as tf
sess = tf.InteractiveSession()
x = tf.constant([[2, 5, 3, -5],
[0, 3,-2, 5],
[4, 3, 5, 3],
[6, 1, 4, 0]])
print(tf.shape(x).eval()) # tensor 形状查看
print(tf.size(x).eval())# tensor 大小查看
print(tf.rank(x).eval()) # tensor 维度查看
print(tf.reshape(x, [8, 2]).eval()) # tensor 改变形状
print(tf.squeeze(x).eval()) # tensor 变为方形矩阵
print(tf.expand_dims(x,1).eval()) # tensor维度+1

#结果
[4 4]
16
2
[[ 2 5]
[ 3 -5]
[ 0 3]
[-2 5]
[ 4 3]
[ 5 3]
[ 6 1]
[ 4 0]]
[[ 2 5 3 -5]
[ 0 3 -2 5]
[ 4 3 5 3]
[ 6 1 4 0]]
[[[ 2 5 3 -5]]
[[ 0 3 -2 5]]
[[ 4 3 5 3]]
[[ 6 1 4 0]]]

1.5 TensorBoard的使用

利用TensorBoard来查看我们的代码的流程结构以及实现细节

1.5.1 实验一线性拟合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import tensorflow as tf
import numpy as np

## prepare the original data
with tf.name_scope('data'):
x_data = np.random.rand(100).astype(np.float32)
y_data = 0.3*x_data+0.1
##creat parameters
with tf.name_scope('parameters'):
weight = tf.Variable(tf.random_uniform([1],-1.0,1.0))
bias = tf.Variable(tf.zeros([1]))
##get y_prediction
with tf.name_scope('y_prediction'):
y_prediction = weight*x_data+bias
##compute the loss
with tf.name_scope('loss'):
loss = tf.reduce_mean(tf.square(y_data-y_prediction))
##creat optimizer
optimizer = tf.train.GradientDescentOptimizer(0.5)
#creat train ,minimize the loss
with tf.name_scope('train'):
train = optimizer.minimize(loss)
#creat init
with tf.name_scope('init'):
init = tf.global_variables_initializer()
##creat a Session
sess = tf.Session()
##initialize
writer = tf.summary.FileWriter("logs/", sess.graph)
sess.run(init)
## Loop
for step in range(101):
sess.run(train)
if step %10==0 :
print (step ,'weight:',sess.run(weight),'bias:',sess.run(bias))

启动tensorboard,设置目录和端口参数

1
tensorboard --logdir="D:\note\logs" --port=8000

可以看到流程结构图如下:

双击各个标签可查看具体细节,大家自己研究下,这玩意英文的,我也不是很懂,嘿嘿。

1.5.2 实验线性拟合2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import tensorflow as tf
import numpy as np

## prepare the original data
with tf.name_scope('data'):
x_data = np.random.rand(100).astype(np.float32)
y_data = 0.3*x_data+0.1
##creat parameters
with tf.name_scope('parameters'):
with tf.name_scope('weights'):
weight = tf.Variable(tf.random_uniform([1],-1.0,1.0))
tf.summary.histogram('weight',weight)
with tf.name_scope('biases'):
bias = tf.Variable(tf.zeros([1]))
tf.summary.histogram('bias',bias)
##get y_prediction
with tf.name_scope('y_prediction'):
y_prediction = weight*x_data+bias
##compute the loss
with tf.name_scope('loss'):
loss = tf.reduce_mean(tf.square(y_data-y_prediction))
tf.summary.scalar('loss',loss)
##creat optimizer
optimizer = tf.train.GradientDescentOptimizer(0.5)
#creat train ,minimize the loss
with tf.name_scope('train'):
train = optimizer.minimize(loss)
#creat init
with tf.name_scope('init'):
init = tf.global_variables_initializer()
##creat a Session
sess = tf.Session()
#merged
merged = tf.summary.merge_all()
##initialize
writer = tf.summary.FileWriter("logs/", sess.graph)
sess.run(init)
## Loop
for step in range(101):
sess.run(train)
rs=sess.run(merged)
writer.add_summary(rs, step)

可以查看其整个拟合过程的参数变化。