文章目录[x]
- 1:什么是Tensor
- 2:创建数据
- 3:Tensor常见属性
- 3.1:tf.device
- 3.2:numpy
- 3.3:ndim 和 tf.rank
- 3.4:name
什么是Tensor
scalar : 1.1
vector : [1.1],[1.1,2.2,...]
matrix : [[1.1,2.2],[3.3,4.4],[5.5,6.6]]
tensor : rank>2(维度大于2,前面几种在tf中也可称为Tensor)
Tensorflow -> Tensor flow(数据(Tensor) 在网络上的 流动(flow))
Tensor支持int,float,double,bool,string数据类型
创建数据
tf.constant(1) #在tf1.0版本中使用constant创建的为常量,不可更改,tf2.0中仅沿用了tf1.0中的函数名称,不代表其声明的是个常量
# <tf.Tensor: id=2, shape=(), dtype=int32, numpy=1> 注意dtype,根据所给参数来确定Tensor类型
tf.constant(1.)
# <tf.Tensor: id=4, shape=(), dtype=float32, numpy=1.0> 注意dtype,根据所给参数来确定Tensor类型
tf.constant(2.2, dtype=int32) #会报错,因为数据格式与dtype不匹配
# TypeError: Cannot convert provided value to EagerTensor
# Provided value: 2.2 Requested dtype: int32
tf.constant(2., dtype=tf.double)
# <tf.Tensor: id=7, shape=(), dtype=float64, numpy=2.0> 注意dtype,在匹配的情况下根据所给dtype参数来确定Tensor类型
tf.constant([True, False])
# <tf.Tensor: id=9, shape=(2,), dtype=bool, numpy=array[[True, False]]> 注意dtype,根据所给参数来确定Tensor类型
tf.constant('hello world.')
# <tf.Tensor: id=14, shape=(), dtype=string, numpy=b'hello world.'> 注意dtype,根据所给参数来确定Tensor类型
Tensor常见属性
tf.device
device属性是一个string值,返回的是目前Tensor所在设备名
# 使用cpu环境创建Tensor
with tf.device("cpu"):
a=tf.constant([1])
a.device #'/job:localhost/replica:0/task:0/device:CPU:0'
# 使用gpu环境创建Tensor
with tf.devide("gpu"):
b=tf.range(4)
b.device #'/job:localhost/replica:0/task:0/device:GPU:0'
# 对于在cpu上的Tensor(a)可进行设备切换
aa=a.gpu()
aa.device #'/job:localhost/replica:0/task:0/device:GPU:0'
# 对于在gpu上的Tensor(b)可进行设备切换
bb=b.cpu()
bb.device #'/job:localhost/replica:0/task:0/device:CPU:0'
Tensor在CPU和GPU上的区别是对于在CPU上的Tensor,只能进行CPU允许的操作,同样,对于在GPU上的Tensor,只能进行GPU允许的操作,tensorflow会自动根据数据属性进行操作选择
numpy
使用numpy可快速得到numpy类型的数据
# 代码接前篇device部分,部分变量在前篇已声明 b.ndim # 1 # b=1,b.ndim=0 # b=[1],b.ndim=1
b.numpy() # array([0, 1, 2, 3], dtype=int32)
ndim 和 tf.rank
可以用ndim获取数据的维度(秩),返回类型为数字
可以用tf.rank获取数据的维度(秩),返回类型为Tensor
# 代码接前篇device部分,部分变量在前篇已声明 b.ndim #1 # b=1,b.ndim=0 # b=[1],b.ndim=1 tf.rank(b) # <tf.Tensor: id=20, shape=(), dtype=int32, numpy=1> tf.rank(tf.ones([3,4,2])) # <tf.Tensor: id=25, shape=(), dtype=int32, numpy=3>
name
name为tf1.0遗留,在tf2.0中并不需要,因为b.name就是b
b.name # Tensor.name is meaningless when eager execution is enabled
未完待续,每日更新中...