Tensor and Variable
Tensor and Variable
Tensor
Tensor是一个类,包含了属性和常用函数,一个Tensor对象主要包含以下三个部分,如下所示:
Tensor("Placeholder:0", shape=(2, 3), dtype=float32)
参数说明:
-
第一部分是
Tensor Name
,比如:’Constant’、‘Placeholder’、‘Variable’等,0没有什么实质性的含义,只是表示Tensor的顺序,当前是0,那么下一个Tensor就是1了; -
第二部分是
Tensor Shape
, 也就是Tensor的形状,这里是[2,3],2行3列。 -
第三部分是
Tensor Type
,也就是tensor张量的数据类型。
tensor的形状
tensor的形状,我们在TensorFlow中使用阶乘表示,它的形状表示如下表所示:
阶乘 | 名称 | 描述 | 示例 |
---|---|---|---|
0 | 纯量 | 只有大小 | s = 481 |
1 | 向量 | 有大小和方向 | v = [1, 2, 3] |
2 | 矩阵 | 数据表 | 比如:3x2矩阵,m = [[1,2] [3,4] [5,6]] |
3 | 3阶张量 | 数据立体 | 比如:1x2x2,t = [[ [[1,2], [3,4]], [[5,6], [7,8]] ]] |
n | n阶张量 | n阶张量 | … |
在Tensorflow中,矩阵[n,m],表示n行m列,行表示特征数量,列表示样本数量。
tensor的数据类型
Python类型 | 描述 |
---|---|
tf.float64 | 64位浮点数 |
tf.float32 | 32位浮点数 |
tf.int64 | 64位有符号整型 |
tf.int32 | 32位有符号整型 |
tf.int16 | 16位有符号整型 |
tf.int8 | 8位有符号整型 |
tf.uint8 | 8位无符号整型 |
tf.string | 可变长度的字节数组,每一个张量元素都是一个字节数组 |
tf.bool | 布尔型 |
tf.complex64 | 由两个32位浮点数组成的复数:实数和虚数 |
tf.qint32 | 用于量化Ops的32位有符号整型 |
tf.qint8 | 用于量化Ops的8位有符号整型 |
tf.quint8 | 用于量化Ops的8位无符号整型 |
float32和float64表示浮点精度,但是实际并不会多分配内存,两者的使用效果差不多,我们常用float32。同理int32和int64也是这样。
tensor属性
tensor对象具有如下属性:
-
graph:张量所在的图
-
op:张量的op
-
name:张量的名称
-
shape:张量的形状
示例代码:
import tensorflow as tf
a = tf.constant(1.0)
with tf.Session() as sess:
print("graph-->", a.graph)
print("op-->",a.op)
print("name-->",a.name)
print("shape-->",a.shape)
placeholder
placeholder是占位符张量。
我们可以通过tf.placeholder()
来创建一个占位符张量,用于在运行图的时候,可以动态赋予数据,我们通过run(fetches, feed_dict=None, graph=None)
来动态赋予数据。
示例代码:
import tensorflow as tf
plt = tf.placeholder(tf.float32, [2,3])
with tf.Session() as sess:
sess.run(plt, feed_dict={
plt: [[1, 2, 3],[3, 4, 5]]
})
张量的静态形状和动态形状
静态形状
张量的形状在整个图中都是固定不可变的,如果初始的张量中由不确定的形状(如?
),我们可以通过set_shape()
去设置,通过get_shape()
去获取
示例代码:
import tensorflow as tf
plt = tf.placeholder(tf.float32, [None,2])
# 列已经确定了,不能修改,行是None不确定可以修改
plt.set_shape([3,2])
print(plt.get_shape())
动态形状
一种描述原始张量在执行过程中的一种形状,这个张量的形状在图的执行过程中是可以动态改变的。更新动态形状:tf.reshape()
。
示例代码:
import tensorflow as tf
plt = tf.placeholder(tf.float32, [3,2])
# reshape重新创建一个张量
plt2 = tf.reshape(plt, [2,3])
print(plt2)
注意reshape前后的张量数据个数肯定是不能变的。
随机张量
在做神经网络训练的时候,梯度下降的初始参数w、b我们可以使用随机张量,然后通过梯度下降去优化。
以下是从正态分布创建随机张量的例子:
示例代码:
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32,seed=None, name=None)
我们关注2个参数,mean表示数据平均值,也就是数学中的μ,stddev表示标准差,也就是数学中的σ。
当μ=0,σ=1时,也就是标准正态分布。
张量类型转换
例如,如果我们的张量的dtype是tf.int32类型的,我们可以将其转换为tf.float32类型的。
示例代码:
a = tf.constant(1.0)
b = tf.cast(a, tf.int32)
张量合并
示例代码:
import tensorflow as tf
b = [[1,2,3],[4,5,6]]
c = [[7,8,9],[10,11,12]]
# 张量合并
d = tf.concat([b,c], axis=0)
with tf.Session() as sess:
print(d.eval())
运行结果如下:
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
说明:axis=0表示按行合并,axis=1表示按列合并。
Variable
variable 变量也是一种OP,是一种特殊的张量,能够进行存储持久化。
Variable的创建
API
tf.Variable(initial_value=None,name=None)
代码中涉及到了变量,一定要在Session之前做变量初始化,然后在Session中首先运行初始化的变量。
示例代码:
import tensorflow as tf
import os
os.environ['TP_CPP_LOG_LEVEL'] = '2'
# 创建变量
val = tf.Variable(tf.random_normal([2,3], mean=0.0, stddev=1.0))
# 变量初始化
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
# 运行变量初始化op
sess.run(init_op)
# 输出变量
print(sess.run(val))
我们在会话前必须做变量的初始化成一个op
,然后在会话中首先运行这个初始化变量
。
我们也可以采用下面的简化方式:
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())