各位同学好,今天和大家分享一下TensorFlow2.0中的tensor变量的创建方法。内容有:
(1) 通过numpy和list创建tensor;(2) 创建全部为某个值的tensor;(3) 随机化创建:正态分布、均匀分布;(4) 重新洗牌;(5) tf.constant()
那我们开始吧。
1. 通过numpy和list创建tensor
方法: tf.convert_to_tensor(value, dtype=None)
np.ones([2,3]) 使用numpy创建2行3列全为1的数组,将该数组全部变成tensor类型,指定数据类型维tf.float32
import tensorflow as tf
import numpy as np
#(1)通过numpy和list创建tensor
# 将2行3列全为1的numpy类型数据转换成tensor类型,原数据类型为float32
tf.convert_to_tensor(np.ones([2,3]),dtype=tf.float32)
# 将2行3列全为0的numpy类型数据转换成tensor类型,类型为float64
tf.convert_to_tensor(np.zeros([2,3]))
创建一个一维列表[2,3],和一个二维列表[[2],[2.]],转换成tensor类型
注意:此处的convert_to_tensor([2,3]) 括号内代表data一维数组[2,3],一定要和下面第2、3节的方法区分开
# 将1维列表变成tensor类型,int32
tf.convert_to_tensor([2,3]) #得到1维长度为2的tensor
# 将2维列表变成tensor类型,float32
tf.convert_to_tensor([[2],[2.]])
2. 创建全为某种值的tensor
2.1 创建全为0的tensor
方法: tf.zeros([shape])
注意:这里的 tf.zeros([ ]),括号里填的是形状shape;而上一节中的列表转tensor括号里面是一维数组。
# ==1== 初始化为0的tensor
tf.zeros([]) # 只有一个数字0
# ==2== 创建一个1维的,长度为2,元素全为0的tensor
tf.zeros([2]) # 一维,长度维2,全0
# ==3== 创建m行n列全为0的tensor
tf.zeros([2,3]) # 2行3列,全0
# ==4== 创建三维tensor,全为0的tensor
tf.zeros([2,3,4])
根据输入的tensor变量的shape来创建一个全为0的tensor
方法: tf.zeros_like(tensor变量)
等同于: tf.zeros(tensor变量.shape)
a = tf.zeros([2,3]) #a的shape是2行3列
# 法一:
tf.zeros_like(a) #创建一个2行3列全0的tensor
# 法二:
tf.zeros(a.shape)
2.2 创建全为1的tensor
方法: tf.ones([shape])
# 创建只有数字1的tensor
tf.ones([])
# 创建一个1维的,长度维2,只有数字1的tensor
tf.ones(2)
# 创建一个1维的长度为2的全为1的tensor
tf.ones([2])
#创建2行3列全为1的tensor
tf.ones([2,3])
根据输入的tensor变量的shape来创建一个全为1的tensor
方法: tf.ones_like(tensor变量)
等同于: tf.ones(tensor变量.shape)
# 根据返回对象的shape创建全为1的tensor
a = tf.ones([1,3]) #2维全0的tensor
tf.ones_like(a)
tf.ones_like(a.shape)
2.3 全为某元素的tensor
方法: tf.fill([shape], 元素)
用某个元素填充指定形状
# 这个tensor标量,只有一个值1.2
tf.fill([],1.2)
# 创建1维长度为3的tensor向量,以1.2填充
tf.fill([3],1.2)
# 创建2维的2行2列的tensor矩阵,以1.2填充
tf.fill([2,2],1.2)
3. 随机化初始
3.1 正态分布初始
方法: tf.random.normal(shape, mean=0, stddev=1, dtype=None, seed=None)
shape: 张量的形状shape,必选
mean: 正态分布的均值,默认为0
stddev: 正态分布的标准差,默认为1.0
dtype: 输出的类型,默认为tf.float32
seed: 随机数种子,是一个整数1,2,当设置之后,每次生成的随机数都一样
# 创建一个2行2列的tensor,每个元素满足均值为1,标准差为1的正态分布
tf.random.normal([2,2],mean=1,stddev=1)
3.2 截断正态分布初始
方法: tf.random.truncated_normal()
在原来分布的基础上,截去某一部分元素,限制变量x的取值范围。后续可以优化sigmoid函数。
正态分布则可视为不进行任何截断的截断正态分布,也即自变量的取值为负无穷到正无穷。
# 创建一个2行2列的tensor,每个元素满足均值为0,标准差为1的截断正态分布
tf.random.truncated_normal([2,2],mean=0,stddev=1)
3.3 均匀分布
方法: tf.random.uniform(shape, minval, maxval, dtype=None, seed=None)
shape: 输出张量的形状。
minval: 生成的随机值范围的下限。默认为0。
maxval: 要生成的随机值范围的上限。若dtype是浮点类型,默认是1。
dtype: 输出的类型,默认 tf.float32。
seed: 整数,当设置之后,每次生成的随机数都一样。
tensor中每个元素的范围在最小值和最大值之间,包含最小值,不包含最大值
# 每个元素都是[0,1)之间随机采样,生成2行2列的tensor
tf.random.uniform([2,2])
# 每个元素都是从1,10之间随机采用,整型
tf.random.uniform([2,2],minval=1,maxval=10,dtype=tf.int32)
4. 重新洗牌
对一组数据随机重新排序,可用于打散有相对关系的两组数据
方法: tf.random.shuffle(value,seed=None)
idx = tf.range(10) #一维tensor,包含0-9的10个数
tf.random.shuffle(idx) #对a重新洗牌
5. tf.constant() 方法
将输入的标量、列表、矩阵变成指定数据类型的tensor
方法: tf.constant(value, dtype=None, shape=None, verify_shape=False)
value: 数值、列表、矩阵
dtype: 指定数据类型
shape: 形状,指维数以及每一维的大小。当value是数字时,张量的所有元素都会用该数字填充。当value是一个列表时,注意列表的长度必须小于等于shape的大小(即各维大小的乘积)
verify_shape: 如果修改为True的话,表示检查value的形状与shape是否相符,符合就输出结果,如果不符会报错。
#传入一个标量,2行2列全为1
tf.constant(1,shape=[2,2])
#传入一个列表,指定数据类型
tf.constant([1,2.],dtype=tf.float32)
#传入一个矩阵,判断这个矩阵是否是2行2列
tf.constant([[1.1,2.2],[3.3,4.4]],shape=[2,2])