写在前面
本篇文章主要讲解TensorFlow的一些基础概念以及基础操作,作为初学者,文章内容难免有错误,各位看官发现错误,还请不吝指正!!!🤝
-
基础数据类型以及了解张量的含义
-
张量的创建
-
张量的基础操作
写在中间
一、 基础数据类型
大家在学习过程之中会经常遇到Tensor这个名词,究竟是什么意思呢?不急,看完这两篇文章之后,你就会有有较为清晰的了解。
https://zhuanlan.zhihu.com/p/48982978
https://zhuanlan.zhihu.com/p/140260245
简单概括:0维的张量就是标量,1维的张量就是向量,2维的张量就是矩阵,大于等于3维的张量没有名称,统一叫做张量。
Python五大常用数据类型: 整型( int )、浮点型( float )、双精度浮点型( double )、布尔型( bool )、字符串型( string )
列表( list ): Python内置数据类型,形式可以是 [ 1, 2.3, “Hello”, True],成员的类型可以不同
数组 ( array ): Python内置数据类型中是没有此数据类型的,但是Numpy库中提供了此数据类型。不同于列表和元组,数据成员必须是相同数据类型属性,但对GPU计算没有支持,无自动求导等功能。
张量( tensor)
标量( scalar ):1、2、3.4(零维)
向量( vector ):[1.2]、[1.1, 2.2, 3.3] (一维)
矩阵( matrix ):[ [1.1, 2.2],[3.3, 4.4] ] (二维)
二、Shape的理解方式
在学会创建Tensor之前,必须理解掌握维度和形状(shape)的概念,例如上面的例子之中[ [1.1, 2.2],[3.3, 4.4] ]
,究竟如何判断此张量的维度为二维,shape为(2, 2)
,相信看完下面的解答,这个问题便会迎刃而解!
下面是一种理解方式,用通式来解答
对于张量t,只看它最外面的括号的话,可以看成是:
t = [A, B, C] #这是第一维度
然后这里的A,B,C可以写成:
A = [i, j], B = [k, l], C = [m, n] #这是第二维度
最后,这i, j, k, l, m, n里面分别是:
i = [1, 1, 1], j = [2, 2, 2], k = [3, 3 ,3], l = [4, 4, 4], m = [5, 5, 5], n = [6, 6, 6] # 这是第三维度
至此就可以判断此张量的维度为三维,所以shape就是每个维度下中括号 [ ] 层级里单位的数量,即shape = (3, 2, 3),但实际上我们所遇到的张量可不长这化简后的样子,整理后的张量如下,括号这么多,就可通过寻找左括号对应的右括号,配合上面的方法,来判断是否同一维度:
# 可能会遇到这样的表示方式,相信你能快速的使用上面的方法判断!
t = [[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]], [[5, 5, 5], [6, 6, 6]]]
# 之后还可能遇到这样的表示形式
tf.Tensor(
[[[1 1 1]
[2 2 2]]
[[3 3 3]
[4 4 4]]
[[5 5 5]
[6 6 6]]], shape=(3, 2, 3), dtype=int32)
三、 张量创建(Tensor)
( 1.1 )法一:constant创建
tensorflow.constant(value, shape=维度, dtype=数据类型, verify_shape=False)
-
value
:数字、字符串、布尔值、列表 -
shape
:形状,指维数以及每一维的大小。当第一个参数value是数字时,张量的所有元素都会用该数字填充,shape=[2, 3]。当第一个参数value是一个列表时,注意列表的长度必须小于等于参数shape的大小(即各维大小的乘积) -
dtype
:指定数据类型,如dtype=tf.float64 -
verify_shape
:如果修改为True的话,表示检查value的形状与shape是否相符,如果不符会报错。
( 1.2 )实践操作
import tensorflow as tf
# 定义一个3行3列的张量,每个元素都为1
tensor = tf.constant(1, shape=[3, 3])
print(tensor)
# 定义一个单值张量,值为1.0,默认dtype为float32
tensor = tf.constant(1.)
print(tensor)
# 定义一个值为2.0,dtype为float64的张量
tensor = tf.constant(2., dtype=tf.double)
print(tensor)
# 定义一个包含两个元素的布尔型张量
tensor = tf.constant([True, False])
print(tensor)
# 定义一个字符串类型的张量
tensor = tf.constant("Hello,World!")
print(tensor)
( 1.3 )运行结果
tf.Tensor(
[[1 1 1]
[1 1 1]
[1 1 1]], shape=(3, 3), dtype=int32)
tf.Tensor(1.0, shape=(), dtype=float32)
tf.Tensor(2.0, shape=(), dtype=float64)
tf.Tensor([ True False], shape=(2,), dtype=bool)
tf.Tensor(b'Hello,World!', shape=(), dtype=string)
( 2.1 )法二:tf.zeros()和tf.ones()创建
tf.zeros(shape, dtype=tf.float32, name=None)
:创建全0张量,参数和tf.constant()
相似,其中dtype
默认为tf.float32
,name
为可选参数。
tf.ones(shape, dtype=tf.float32, name=None)
:创建全1张量,参数和tf.constant()
相似,其中dtype
默认为tf.float32
,name
为可选参数。
( 2.2 )实践操作
import tensorflow as tf
# 创建一个3行3列的全0张量,默认dtype为float32
tensor = tf.zeros([3, 3])
print(tensor)
# 创建一个2行2列的全1张量,dtype设置为int32
tensor = tf.ones([2, 2], dtype=tf.int32)
print(tensor)
( 2.3 )运行结果
tf.Tensor(
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]], shape=(3, 3), dtype=float32)
tf.Tensor(
[[1 1]
[1 1]], shape=(2, 2), dtype=int32)
( 3.1 )法三:tf.Variable()创建
tf.Variable()
函数可以创建一个可修改的张量,即变量。变量在模型训练过程中会动态变化,需要进行优化操作。
tf.Variable(initial_value=None, trainable=True, dtype=None, name=None, constraint=None)
initial_value
:张量的初始值,可以是任何类型,不同于tf.constant()
函数,变量在初始化后是可修改的。trainable
:表示变量是否可被训练,即是否可被梯度下降等优化算法调整。dtype
:变量的数据类型,默认为None
。name
:变量的名称,是可选的。constraint
:变量的约束条件,是可选的。
( 3.2 )实践操作
import tensorflow as tf
# 定义一个可修改的张量
tensor = tf.Variable([1, 2, 3])
print(tensor)
# 初始化后可以修改张量的值
tensor.assign([4, 5, 6])
print(tensor)
# 也可以通过assign_add()和assign_sub()方法修改张量的值
tensor.assign_add([1, 1, 1])
print(tensor)
tensor.assign_sub([1, 1, 1])
print(tensor)
( 3.3 )运行结果
<tf.Variable 'Variable:0' shape=(3,) dtype=int32, numpy=array([1, 2, 3], dtype=int32)>
<tf.Variable 'Variable:0' shape=(3,) dtype=int32, numpy=array([4, 5, 6], dtype=int32)>
<tf.Variable 'Variable:0' shape=(3,) dtype=int32, numpy=array([5, 6, 7], dtype=int32)>
<tf.Variable 'Variable:0' shape=(3,) dtype=int32, numpy=array([4, 5, 6], dtype=int32)>
( 4.1 )法四:随机创建
tf.random.uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name=None)
:创建一个随机的均匀分布的张量,参数如下:
-
shape
:张量的形状,可以是一个一维的列表,如[2, 3]
。 -
minval
:均匀分布的最小值,默认为0。 -
maxval
:均匀分布的最大值,默认为1。 -
dtype
:张量的数据类型,默认为tf.float32
。 -
seed
:生成随机数的种子。 -
name
:张量的名称,是可选的。
tf.random.normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
-
shape
:张量的形状,可以是一个一维的列表,如[2, 3]
。 -
mean
:正态分布的均值,默认为0。 -
stddev
:正态分布的标准差,默认为1。 -
dtype
:张量的数据类型,默认为tf.float32
。 -
seed
:生成随机数的种子。 -
name
:张量的名称,是可选的。
( 4.2 )实践操作
import tensorflow as tf
# 创建一个随机的均匀分布的张量
tensor_uniform = tf.random.uniform(shape=[2, 3], minval=0, maxval=10)
# 创建一个随机的正态分布的张量
tensor_normal = tf.random.normal(shape=[2, 3], mean=0, stddev=1)
print(tensor_uniform)
print(tensor_normal)
( 4.3 )运行结果:
tf.Tensor(
[[8.5141573 5.6180024 9.240239 ]
[9.835485 1.1550446 3.1731434 ]], shape=(2, 3), dtype=float32)
tf.Tensor(
[[ 1.3331307 0.61228025 1.1319485 ]
[ 1.2318208 0.5006925 -0.9704096 ]], shape=(2, 3), dtype=float32)
可以看到,随机创建的张量形状由参数shape
指定,而张量的值则是在均匀分布或正态分布中随机抽样得到的。
四、 张量基础操作
( 1 )简单介绍
张量名.ndim
:查看维度,返回int类型
tf.rank(张量名)
:查看维度,返回tensor类型
张量名.shape
:查看tensor的形状
tf.is_tensor(变量)
:判断变量是否是tensor类型,返回布尔类型
isinstance(变量, 数据类型)
:判断变量是否属于该数据类型,返回布尔类型
变量.dtype
:查看变量数据类型,返回数据类型
( 2 )实践操作
import tensorflow as tf # 导入 tensorflow 模块
tensor = tf.range(4) # 定义一个包含 0~3 共 4 个元素的一维张量(tensor)
print(tensor) # 打印张量的值
print(tensor.ndim) # 打印张量的维度数量(这个张量是一维的,因此打印的结果为 1)
print(tf.rank(tensor)) # 打印张量的秩(这个张量是一维的,秩为 1)
print(tensor.shape) # 打印张量的形状(这个张量是一维的,形状为 (4,)
print(tf.is_tensor(tensor)) # 判断张量是否为 tensorflow 张量类型(返回 True)
print(isinstance(tensor, tf.Tensor)) # 判断张量是否为 tensorflow 张量类型(返回 True)
print(tensor.dtype) # 打印张量的数据类型(这个张量的数据类型为默认的 int32)
运行结果:
tf.Tensor([0 1 2 3], shape=(4,), dtype=int32)
1
tf.Tensor(1, shape=(), dtype=int32)
(4,)
True
True
<dtype: 'int32'>
写在最后
👍🏻点赞,你的认可是我创作的动力!
⭐收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!