首先比较一下Python列表(list)、Numpy数组(ndarray)、Tensorflow张量(Tensor)之间的区别:
>> Python列表:
元素可以使用不同的数据类型,可以嵌套
在内存中不是连续存放的,是一个动态的指针数组
读写效率低,占用内存空间大
不适合做数值计算
>> Numpy数组:
元素数据类型相同
每个元素在内存中占用的空间相同,存储在一个连续的内存区域中
存储空间小,读取和写入速度快
不能够主动检测利用GPU进行运算,只能运行在CPU上
>> TensorFlow张量
可以高速运行于GPU和TPU之上,实现神经网络和深度学习中的复杂算法
*** 张量和numpy数组:
① 张量可看成将numpy数组进一步封装,使其可以执行TensorFlow中的API,且可以运行与GPU/TPU;
② 在TensorFlow中,所有运算都是在张量之间进行的; Numpy数组仅仅是作为输入和输出使用,不参与运算;
③ 张量可以运行于CPU /GPU/TPU; 而Numpy数组只能运行在CPU中。
1、创建Tensor对象 – tf.constant()函数
张量由Tensor类实现,每个张量都是一个Tensor对象。
函数格式:tf.constant(value, dtype, shape)
value: 可以是数字、Python列表、numpy数组、布尔型、字符串等
dtype: 元素的数据类型
shape: 张量的形状
注意点:
1、TensorFlow2中的所有张量,都可以通过 .numpy()的方法,得到它对应的数组
2、TensorFlow创建浮点数张量时,默认是32位浮点数;
3、输出的形状shape=()表示是0维张量/数字/标量;
4、numpy创建浮点数组时,默认是64位浮点数,当使用numpy数组创建张量时,
TensorFlow会接受numpy数组元素的数据类型,使用64位浮点数保存数据
5、布尔型转换为整数--》 0:False, 1:True;
6、整型变量装换为布尔型,将非0数字都视为True; 0视为False。
示例:
import tensorflow as tf
import numpy as np
tf1 = tf.constant([[1,2],[3,4]]) # 1、参数为Python列表
#print(tf1)
#print(tf1.numpy()) # 2、TensorFlow2中的所有张量,都可以通过 .numpy()的方法,得到它对应的数组
tf2 = tf.constant(1.0) # 3、参数为数字 --> 也可以写成 tf.constant(1.)
print(tf2) # 4、 TensorFlow创建浮点数张量时,默认是32位浮点数;输出中 shape=()表示是0维张量/数字/标量
tf3 = tf.constant(np.array([1,2])) # 5、参数为numpy数组。 numpy创建浮点数组时,默认是64位浮点数,当使用numpy数组创建张量时,TensorFlow会接受numpy数组元素的数据类型,使用64位浮点数保存数据
tf.constant(1.0, dtype=tf.float64) # 6、创建张量时,指定元素的数据类型
tf4 = tf.constant(True) # 参数为布尔型
a = tf.constant([True,False])
# 输出:tf.Tensor([1 0], shape=(2,), dtype=int32)
print(tf.cast(a, tf.int32)) # 布尔型转换为整数--》 0:False, 1:True
b = tf.constant([0,1,-1,2])
# 输出:tf.Tensor([False True True True], shape=(4,), dtype=bool)
print(tf.cast(b,dtype= tf.bool)) # 整型变量装换为布尔型,将非0数字都视为True; 0视为False
2、tf.cast()函数 — 改变张量中元素数据类型
函数格式:tf.cast(x, dtype)
PS:在数据类型装换时,一般是将低精度的数据类型向高精度转换,否则可能发生数据溢出,得到错误结果。
示例:
a = tf.constant(np.array([1,2]))
b = tf.cast(a,dtype=tf.float32)
print(b.dtype)
3、tf.convert_to_tensor()函数 – 创建张量
tf.convert_to_tensor(数组/列表/数字/布尔型/字符串)
4、tf.is_tensor()函数 – 判断是否是张量
5、Python中isinstance()函数判断类型
示例:
import tensorflow as tf
import numpy as np
na = np.arange(12).reshape(3,4)
ta = tf.convert_to_tensor(na)
print(type(na)) # <class 'numpy.ndarray'>
print(type(ta)) # <class 'tensorflow.python.framework.ops.EagerTensor'>
print(tf.is_tensor(ta)) # True
print(isinstance(ta,tf.Tensor)) # True
6、创建特殊值的张量
创建全为0的张量: tf.zeros(维度,dtype)
创建全为1的张量: tf.ones(维度,dtype)
创建全为指定值的张量: tf.fill(维度,指定值)
PS: 1、维度(维度也可以用小括号表示):
一维 直接写个数
二维 用[行,列]
多维 用[n,m,j,k...]
2、tf.fill()没有dtype参数,根据指定值自动判断数据类型。
3、 tf.zeros()、 tf.ones()的dtype类型默认是32位浮点数.
4、也可以使用tf.constant(指定值,shape)创建全为指定值的张量
示例:
import tensorflow as tf
tf1 = tf.ones([1,2],dtype=tf.float64)
tf2 = tf.zeros((2,2))
print(tf1)
print(tf2)
tf3 = tf.fill([2,3],9)
print(tf3)
tf4 = tf.constant(9,shape=[2,3])
print(tf4)
运行结果:
tf.Tensor([[1. 1.]], shape=(1, 2), dtype=float64)
tf.Tensor(
[[0. 0.]
[0. 0.]], shape=(2, 2), dtype=float32)
tf.Tensor(
[[9 9 9]
[9 9 9]], shape=(2, 3), dtype=int32)
tf.Tensor(
[[9 9 9]
[9 9 9]], shape=(2, 3), dtype=int32)
7、创建随机数张量
(1) 生成正态分布的随机数,默认均值为0,标准差为1
tf.random.normal(维度,mean=均值,stddev=标准差,dtype)
(2)生成截断式正态分布的随机数(生成值在均值附近)
tf.random.truncated_normal(维度,mean=均值,stddev=标准差,dtype)
例如:
tf1 = tf.random.normal([2,2],mean = 0.0,stddev = 2.0)
tf2 = tf.random.truncated_normal([2,2])
(3)生成均匀分布随机数 [ minva,maxval ) 前闭后开区间
tf.random.uniform(维度,minval=最小值,maxval=最大值,dtype)
8、tf.random.set_seed() — 设置随机种子
设置随机种子,可以产生同样的随机数张量。
例如,执行下面代码多次,生成的随机数是相同的。
tf.random.set_seed(8)
print(tf.random.normal([2,2]))
9、tf.random.shuffle() 函数-- 随机打乱张量的第一维度
示例:
import tensorflow as tf
import numpy as np
x = tf.constant([[1,2],[3,4],[5,6]])
print(tf.random.shuffle(x))
y = [1,2,3,4,5]
print(tf.random.shuffle(y))
z = np.arange(5)
print(tf.random.shuffle(z))
运行结果:
tf.Tensor(
[[5 6]
[1 2]
[3 4]], shape=(3, 2), dtype=int32)
tf.Tensor([3 1 2 5 4], shape=(5,), dtype=int32)
tf.Tensor([0 3 4 1 2], shape=(5,), dtype=int64)
10、tf.range()函数 – 创建序列
函数格式: tf.range(start, limit, delta=1, dtype)
PS:区间【start,limit) 数据范围是 前闭后开区间
示例:
import tensorflow as tf
import numpy as np
a = tf.range(10)
print(a)
b = tf.range(10,delta=2)
print(b)
运行结果:
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)
tf.Tensor([0 2 4 6 8], shape=(5,), dtype=int32)
创建张量小结:
11、 Tensor对象的属性 – ndim、shape、dtype
ndim: 查看对象的维度
shape: 对象形状
dtype: 对象类型
使用 变量名.属性名 访问获取。
示例:
import tensorflow as tf
a = tf.constant([[1,2],[3,4]])
print(a.ndim)
print(a.dtype)
print(a.shape)
运行结果:
2
<dtype: 'int32'>
(2, 2)
12、TensorFlow的 shape(),size(),rank()方法 — 获取张量的形状、元素总量和维度。
示例:
a = tf.constant([[1,2],[3,4]])
print(tf.shape(a))
print(tf.size(a))
print(tf.rank(a))
运行结果:
tf.Tensor([2 2], shape=(2,), dtype=int32)
tf.Tensor(4, shape=(), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)