TensorFlow即张量的流动,即保持计算节点不变让数据以张量的形式进行流动.张量tensor可以是一个变量/数组/多维数组等.一个tensor包含一个静态的rank和一个shape.
tensor的几个重要属性:
即tensor存储的数据类型.
数据类型 | Python 类型 | 描述 |
---|---|---|
DT_FLOAT | tf.float32 | 32 位浮点数 |
DT_DOUBLE | tf.float64 | 64 位浮点数 |
DT_INT64 | tf.int64 | 64 位有符号整型 |
DT_INT32 | tf.int32 | 32 位有符号整型 |
DT_INT16 | tf.int16 | 16 位有符号整型 |
DT_INT8 | tf.int8 | 8 位有符号整型 |
DT_UINT8 | tf.uint8 | 8 位无符号整型 |
DT_STRING | tf.string | 可变长度的字节数组.每一个张量元素都是一个字节数组 |
DT_BOOL | tf.bool | 布尔型 |
DT_COMPLEX64 | tf.complex64 | 由两个32位浮点数组成的复数:实数和虚数 |
DT_QINT32 | tf.qint32 | 用于量化Ops的32位有符号整型 |
DT_QINT8 | tf.qint8 | 用于量化Ops的8位有符号整型 |
DT_QUINT8 | tf.quint8 | 用于量化Ops的8位无符号整型 |
设置存储类型:
import tensorflow as tf
a = tf.zeros((2, 2), dtype=tf.float16)
print a
输出:
Tensor("zeros:0", shape=(2, 2), dtype=float16)
Rank:tensor的维数,即张量是几维的数组.(直观上看就是括了几层括号)
零阶张量即纯量;
s = 256
一阶张量可看作为向量,可用t[i]来访问其元素;
v = [1.1, 2.2, 3.3]
二阶张量可看做为矩阵,可用t[i,j]来访问其元素;
m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
三阶张量可用t[i,j,k]来访问其元素;
t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]]
tensor的形状.
0-D(一个 0维张量. 一个纯量.):scalar shape为[];
1-D(一个1维张量的形式[D0]):vector shape为 [D0];
2-D(一个2维张量的形式[D0, D1]):matrix shape为 [D0,D1];
阶 | 形状 | 维数 | 实例 |
---|---|---|---|
0 | [ ] | 0-D | 一个 0维张量. 一个纯量 |
1 | [D0] | 1-D | 一个1维张量的形式[5] |
2 | [D0, D1] | 2-D | 一个2维张量的形式[3, 4] |
3 | [D0, D1, D2] | 3-D | 一个3维张量的形式 [1, 4, 3] |
n | [D0, D1, … Dn] | n-D | 一个n维张量的形式 [D0, D1, … Dn] |
.
import tensorflow as tf
a = tf.zeros([1, 2, 2])
print a
输出:
Tensor("zeros:0", shape=(1, 2, 2), dtype=float32)
与Tensor相关的常用的API主要有:
操作 | 描述 |
---|---|
tensor.eval() | 张量的值 |
tensor.dtype | 张量的数据类型 |
tensor.name | 张量的名字 |
tensor.graph | 张量所在的图 |
tensor.op | 产生该张量的操作 |
.
#!/usr/bin/python
# coding:utf-8
import tensorflow as tf
t0 = tf.Variable(tf.random_normal([1, 3, 2, 3]), name='t')
t1 = tf.Variable(tf.random_normal([1, 3, 2, 3]), name='t')
t2 = tf.Variable(tf.random_normal([1, 3, 2, 3]), name='t')
# 初始化变量
init = tf.initialize_all_variables()
# 启动默认图
with tf.Session() as sess:
sess.run(init)
# 张量的值
print "t0.eval():\n", t0.eval()
# 张量的数据类型
print "t0.dtype:\n", t0.dtype
# 张量的名字
print "t0.name:\n", t0.name
# 重名时加序号区分
print "t2.name:\n", t2.name
# 张量所在的图
print "t0.graph:\n", t0.graph
# 产生该张量的操作
print "t0.op:\n", t0.op
输出:
t0.eval():
[[[[-0.55077618 1.64050066 -1.32940078]
[ 1.74692714 0.11233041 1.51372337]]
[[ 0.15455215 -0.38469273 2.4409039 ]
[-0.51784748 0.62258196 -0.74489498]]
[[ 1.00270367 2.20758677 -0.10242216]
[ 0.56432706 0.9625718 -0.76739138]]]]
t0.dtype:
'float32_ref'>
t0.name:
t:0
t2.name:
t_2:0
t0.graph:
0x7faa4c958610>
t0.op:
name: "t"
op: "VariableV2"
attr {
key: "container"
value {
s: ""
}
}
attr {
key: "dtype"
value {
type: DT_FLOAT
}
}
attr {
key: "shape"
value {
shape {
dim {
size: 1
}
dim {
size: 3
}
dim {
size: 2
}
dim {
size: 3
}
}
}
}
attr {
key: "shared_name"
value {
s: ""
}
}
生成1个4行2列3维/通道的张量t和1个4行3列2维的张量b:
import tensorflow as tf
t = tf.Variable(tf.random_normal([1, 4, 2, 3]))
b = tf.Variable([[[[1, 1], [1, 1], [1, 1]],
[[1, 1], [1, 1], [1, 1]],
[[1, 1], [1, 1], [1, 1]],
[[1, 1], [1, 1], [1, 1]]]],
dtype=tf.float32)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print t.eval()
print b.eval()
print b.shape
输出:
[[[[ -0.94044793 -1.46241128 1.05189145]
[ -0.4611243 -2.49165058 -0.82913154]]
[[ 1.01612628 -0.21953523 -0.82144296]
[ -0.61173284 0.45760757 -1.30645704]]
[[ -1.89634395 -0.20555718 -2.55326843]
[ -0.62727648 0.24829486 0.45809004 ]]
[[ -0.25653574 1.29294693 0.00365613]
[ 0.45901382 -0.72672909 0.46698001]]]]
[[[[ 1. 1.]
[ 1. 1.]
[ 1. 1.]]
[[ 1. 1.]
[ 1. 1.]
[ 1. 1.]]
[[ 1. 1.]
[ 1. 1.]
[ 1. 1.]]
[[ 1. 1.]
[ 1. 1.]
[ 1. 1.]]]]
(1, 4, 3, 2)
其中张量t的形式为:
张量中的元素对应关系:
如,1个4行4列3维的张量a中,查看其中第1行第2列第3维和第2行第1列第2维的元素:
import tensorflow as tf
a = tf.Variable([[[[1, 2, 3], [1.5, 2.5, 3.5], [1, 1, 1], [1, 1, 1]],
[[10, 20, 30], [1, 1, 1], [1, 1, 1], [1, 1, 1]],
[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]],
[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]]],
dtype=tf.float32)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print a.eval()
print a.shape
print a.eval()[0, 0, 1, 2]
print a.eval()[0, 1, 0, 1]
输出:
[[[[ 1. 2. 3. ]
[ 1.5 2.5 3.5]
[ 1. 1. 1. ]
[ 1. 1. 1. ]]
[[ 10. 20. 30. ]
[ 1. 1. 1. ]
[ 1. 1. 1. ]
[ 1. 1. 1. ]]
[[ 1. 1. 1. ]
[ 1. 1. 1. ]
[ 1. 1. 1. ]
[ 1. 1. 1. ]]
[[ 1. 1. 1. ]
[ 1. 1. 1. ]
[ 1. 1. 1. ]
[ 1. 1. 1. ]]]]
(1, 4, 4, 3)
3.5
20.0