您的位置:首页 > 其它

TensorFlow学习--张量的数据类型/rank/shape和常用API

2017-10-25 18:53 926 查看
TensorFlow即张量的流动,即保持计算节点不变让数据以张量的形式进行流动.张量tensor可以是一个变量/数组/多维数组等.一个tensor包含一个静态的rank和一个shape.

tensor的几个重要属性:

Data type/数据类型

即tensor存储的数据类型.

数据类型Python 类型描述
DT_FLOATtf.float3232 位浮点数
DT_DOUBLEtf.float6464 位浮点数
DT_INT64tf.int6464 位有符号整型
DT_INT32tf.int3232 位有符号整型
DT_INT16tf.int1616 位有符号整型
DT_INT8tf.int88 位有符号整型
DT_UINT8tf.uint88 位无符号整型
DT_STRINGtf.string可变长度的字节数组.每一个张量元素都是一个字节数组
DT_BOOLtf.bool布尔型
DT_COMPLEX64tf.complex64由两个32位浮点数组成的复数:实数和虚数
DT_QINT32tf.qint32用于量化Ops的32位有符号整型
DT_QINT8tf.qint8用于量化Ops的8位有符号整型
DT_QUINT8tf.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/阶

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]]]

Shape/形状

tensor的形状. <
cf0e
br>
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)


常用API

与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:
<dtype: 'float32_ref'>

t0.name:
t:0

t2.name:
t_2:0

t0.graph:
<tensorflow.python.framework.ops.Graph object at 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的形式为:



注意指定张量中元素的dtype类型.

张量中的元素对应关系:

如,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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: