文章目录
1.张量(Tensor)的定义
TensorFlow中的张量就是一个n维的数组,类型为tf.tensor.类似于numpy中的ndarray。Tensor具有两个重要的属性,包括张量的数据类型(dtype)及张量的形状(shape)。
2.创建张量的指令
张量分为固定值张量和随机值张量,不同类型的张量具有不同的创建指令。
2.1固定值张量
常见的固定值张量创建指令如下:
tf.zeros(shape,dtype=tf.float32,name=None)
tf.zeros_like(shape,dtype=tf.float32,name=None)
tf.ones(shape,dtype=tf.float32,name=None)
tf.ones_like(shape,dtype=tf.float32,name=None)
tf.constant(value,dtype=tf.float32,shape=None,name='Const')
2.2随机值张量
主要是用于生成特定分布,如正态分布等的随机值张量。
基于Pycharm创建随机值张量:
采用InteractiveSession()在Python Console中进行操作
2.2.1进入InteractiveSession交互式会话
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
tf.compat.v1.InteractiveSession()
本文所采用的TensorFlow的版本为2.5.0版本,在该版本中已经没有tf.InteractiveSession(),所以采用兼容v1版本的方式调用交互式会话。
2.2.2生成正态分布随机值张量
random_data = tf.random.normal([2,3],mean=0.0,stddev=1.0)
random_data.eval()
将得到以下的结果:
array([[-0.5411521 , -0.04788242, -0.14508048],
[-1.2735071 , -0.5523144 , -0.46699935]], dtype=float32)
3.张量的变换
张量的变换包括类型改变和形状改变。
3.1张量的类型改变
以下提供了一些张量类型改变的函数:
tf.string_to_number(string_tensor,out_type=None,name=None)
tf.to_double(x,name='ToDouble')
tf.to_float(x,name='ToFloat')
tf.cast(x,dtype,name=None)
3.2张量的形状改变
张量存在两种形状的变化,分别为动态形状改变与静态形状改变。
3.2.1静态形状的改变
API:object.set_shape
需要符合的规则:
- 静态形状固定之后不能再次修改
- 转换静态形状的时候,不能跨阶数转换
示例1:
with tf.compat.v1.Session() as sess:
a = tf.compat.v1.placeholder(dtype=tf.float32,shape=[3,4])
print("Origin a:",a.get_shape())
a.set_shape(shape=[2,6])
以上代码在静态形状固定的情况下修改形状,将产生以下报错信息:
ValueError: Dimension 0 in both shapes must be equal, but are 3 and 2. Shapes are [3,4] and [2,6].
示例2:
with tf.compat.v1.Session() as sess:
a = tf.compat.v1.placeholder(dtype=tf.float32,shape=[None,3])
print("Origin a:",a.get_shape())
a.set_shape(shape=[3,2,3])
以上代码在跨阶改变形状,将产生以下报错信息:
ValueError: Shapes must be equal rank, but are 2 and 3
示例3:
with tf.compat.v1.Session() as sess:
a = tf.compat.v1.placeholder(dtype=tf.float32,shape=[None,None])
print("Origin a:",a.get_shape())
a.set_shape(shape=[3,2])
print("changed a:",a.get_shape())
以上为正确的代码,结果如下(set_shape是在原Tensor的基础上进行修改,不产生新的对象):
Origin a: (None, None)
changed a: (3, 2)
3.2.2 动态形状的改变
API:tf.reshape()
需要符合的规则:
- 动态创建新张量,张量的元素个数必须匹配
示例:
with tf.compat.v1.Session() as sess:
a = tf.compat.v1.placeholder(dtype=tf.float32,shape=[3,4])
print("a:",a.get_shape())
b = tf.reshape(a,[3,2,2])
c = tf.reshape(a,[2,6])
print("a:",a.get_shape())
print("b:",b.get_shape())
print("c:",c.get_shape())
以上为正确的代码,结果如下(reshape是将产生新的对象,不改变原Tensor的形状):
a: (3, 4)
a: (3, 4)
b: (3, 2, 2)
c: (2, 6)