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

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

tensor的几个重要属性:

Data type/数据类型

即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/阶

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的形状.
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:
'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的形式为:

TensorFlow学习--张量的数据类型/rank/shape和常用API_第1张图片
注意指定张量中元素的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

你可能感兴趣的:(TensorFlow)