深度学习(5)TensorFlow基础操作一: TensorFlow数据类型
Data Container(数据载体)
(1) list 优点: 非常灵活,在list中间可以添加任何类型的数据,例如: [1, 1.2, ‘Hello’, (1, 2), layers, …] ,而且可以随意添加删除编辑; 缺点: 遇到大数据时,例如一张图片维度是[224, 224],那么使用list所消耗的内存空间是巨大的,而且读取写入的效率低; (2) np.array 优点: 专门解决同类型数据运算而设计的数据载体,可以很方便地将大数据(例如一组图片的维度是[64, 224, 224, 3])进行存储和运算; 缺点: Numpy是在深度学习出现之前就已经设计好的科学计算库,所以它不能很好地支持GPU计算或者自动求导功能; (3) tf.Tensor 与Numpy地位相等,添加了一些深度学习的方法和工具; 更加偏向于神经网络方面的操作,为了更好地入门,其API设计与Numpy的API设计相近;
What’s Tensor
- scalar: 1.1
标量; dim = 0; - vector: [1.1], [1.1, 2.2, …]
向量; dim = 1; - matrix: [[1.1, 2.2], [3.3, 4.4], [5.5, 6.6]]
矩阵; dim = 2; [1.1, 2.2]、[3.3, 4.4]、[5.5, 6.6]均是作为一行存在; - tensor:
r
a
n
k
>
2
rank>2
rank>2
其实所有数据都可以叫做tensor,不只是维度大于2的数据,scalar、vector、matrix都可以叫做tensor,但是常见实战时各叫各的,方便区分,这样解释是为了方便理解tensor。 Tensor Flow in Graph
TF is a computing lib(科学计算库)
- int(整型数据),float(单精度浮点型数据),double(双精度浮点型数据)
- bool(布尔类型数据)
- string(字符串类型数据)
创建不同类型的数据
tf.constant() 为创建一个Tensor;
Tensor Property(Tensor属性)
(1) tf.device(“cpu”) : 指定创建的数据在CPU上计算; tf.device(“gpu”) : 指定创建的数据在GPU上计算; 注: 如果a和b都在CPU或者都在GPU上是可以一起运算的,但是如果a在CPU上而b在GPU上,或者a在GPU而b在CPU上时,是不可以一起运算的,需要进行CPU/GPU转换 (2) aa = a.gpu() : 将a由在CPU计算转换为在GPU计算并赋值给aa; bb = b.cpu : 将b由在GPU计算转换为在CPU计算并赋值给bb; (3) b.numpy() : 将b由tensor数据类型转换为numpy数据类型; (4) b.ndim() : 返回b的维度; (5) b.shape() : 返回b的结构; (6) tf.rank() : 返回tensor类型数据的维度; (7) b.name : 无需理解,为TensorFlow1.0版本的起名问题;
Check Tensor Type(判断数据类型)
(1) tf.is_tensor(b) : 判断b是否为tensor类型的数据; (2) a.dtype : 返回a的数据类型; (3) a.dtype = tf.float32 : 查看a的数据类型是否为tensor数据类型中的float32;
Convert(数据类型转换)
(1) a = np.arange(5) : 创建a,默认存储的数据类型为int64; (2) aa = tf.convert_to_tensor(a) : 将a转换为tensor类型的数据,转换后数据类型保持不变,依然为int64; (3) aa = tf.convert_to_tensor(a, dtype = tf.int32) : 将a转换为tensor类型的数据,并且改变a的数据类型为int32; (4) tf.cast(aa, dtype = tf.float32) : cast是一个专业的数据类型转换工具,将aa由int32转换为float32;
bool & int(布尔型和整型数据之间的转换)
在计算时我们往往会将布尔类型的数据转换为整型数据,方便计算,因此,布尔型和整型数据之间的相互转换非常常见。
(1) tf.cast(b, dtype = tf.bool) : 将b由整型数据转换为布尔型数据。其中,0转换为False,1转换为True; (2) tf.cast(b, dtype = tf.bool) : 将bb由布尔型数据转换为整型数据。其中,False转换为0,True转换为1;
tf.Variable(可以优化参数的一种数据类型)
例如:
y
=
w
?
x
+
b
y=w*x+b
y=w?x+b,这里的
w
w
w和
b
b
b都是参数,那么
w
w
w和
b
b
b除了是tensor类型的数据以外,还有一个额外的属性,就是Variable,就是说我们可以认为: w = tf.Variable(w) ,这样的话,一个tensor类型的数据经过Variable包装后,会自动具有了一些可求导的特性,经过包装后会有name 和trainable 两个属性,其中name 属性无需考虑,是TensorFlow1.0中的概念; trainable 属性是可以训练的意思,就是说当
w
w
w和
b
b
b需要进行向后传播或者求导的时候,需要trainable 这个属性进行对
w
w
w和
b
b
b的跟踪,会自动记录
w
w
w和
b
b
b的梯度信息。
注: isinstance() 并不推荐使用,更推荐使用tf.is_tensor() 。
To numpy(如何将数据由tensor类型转换为numpy类型)
tensor数据一般是运行在GPU上的,我们可能需要在CPU上完成一些额外的控制,所以我们需要将数据由tensor类型转换为numpy类型。
(1) a.numpy() : 将a转换为numpy类型的数据; (2) 如果a是scalar(即标量)数据的话,我们可以直接使用int(a) 或者float(a) 来对a的数据类型进行转换;
参考文献: [1] 龙良曲:《深度学习与TensorFlow2入门实战》 [2] https://playground.tensorflow.org
|