事先说明一下:本文所用的是TensorFlow2.5.0版本。在TensorFlow2.0之后,TensorFlow的很多东西都做出了改变,与1.x版本已经有很多不同。整体来说,TensorFlow变得更加的简洁,已经去掉了包括Session(),占位符等。语法形式上,更加和Pytorch有所靠拢。因此有一些内行人认为,Tensorflow2.x与pytorch,只需花费主要经历在一个上面,另一个就可以很容易上手。
整体而言,TensorFlow的数据类型,大体可以分成两大部分:基本数据类型,以及Tensor类型
首先,在基本数据的支持上,TensorFlow支持下列基本数据类型:
整型有符号 | int8:8位整数;int16:16位整数;int32:32位整数;int64:64位整数。 |
---|---|
整型无符号 | uint8:8位无符号整数;uint16:16位无符号整数;uint32:32位无符号整数;uint64:64位无符号整数 |
浮点型 | float16:16位浮点数;float32:32位浮点数;float64:64位浮点数。 double:等同于float64。 |
字符串 | string:字符串 |
布尔 | bool:布尔型 |
复数类型 | tf.complex64:64位复数。 tf.complex128:128位复数 |
容器类型并不是TensorFlow独有的,就比如说numpy当中有array,python本身也有list等等。而在TensorFlow当中,则是:tf.Tensor。
在Numpy当中,其实已经在原本Python的基础上做了数据运算的优化。但是,Numpy却无法适应大数据和深度学习等运算。在现实当中,GPU由于具有多线程运算的特点,因此,整体速率上,要比CPU快很多。但是Numpy却恰恰没法和GPU进行联动。Numpy也没有自动求导的方法,涉及梯度下降等,就会很麻烦。在TensorFlow当中,就由此引入了Tensor类型,可以很好的与GPU进行联动,而且更加适用于大数据与深度学习。
下面,我们就来介绍一下这个张量类型
Tensor整体来说有如下类型:
在TensorFlow当中,很多时候,把维度大于2的数据,也泛泛的称为Tensor
比如说,我们可以创建Constant:虽然这个单词翻译为常量,但是和其他高级语言当中const int a = 10还是不同的。因为其他高级语言当中的const一旦指定,便无法修改。但是TensorFlow当中是允许的。比如说,你写一个
a = tf.constant(1)
a = tf.constant(2.)
放心,不会报错的。
import tensorflow as tf
In [2]: tf.constant(1) # 创建一个int型常量
Out[2]: <tf.Tensor: shape=(), dtype=int32, numpy=1>
In [4]: tf.constant(1.) # 创建浮点型常量
Out[4]: <tf.Tensor: shape=(), dtype=float32, numpy=1.0>
In [5]: tf.constant(2.,dtype=tf.double) # 可以指定数据类型
Out[5]: <tf.Tensor: shape=(), dtype=float64, numpy=2.0>
In [6]: tf.constant([True,False]) # 创建bool类型常量
Out[6]: <tf.Tensor: shape=(2,), dtype=bool, numpy=array([ True, False])>
In [7]: tf.constant('hello world') #创建字符型常量
Out[7]: <tf.Tensor: shape=(), dtype=string, numpy=b'hello world'>
In [9]: with tf.device("cpu"):
...: a = tf.constant([1])
...:
In [10]: with tf.device("gpu"):
...: b = tf.range(4)
...:
In [11]: a.device
Out[11]: '/job:localhost/replica:0/task:0/device:CPU:0'
In [12]: b.device
Out[12]: '/job:localhost/replica:0/task:0/device:GPU:0'
In [13]: aa = a.gpu() # 切换为gpu运行,这个方法极有可能在之后的TensorFlow版本当中删除
In [15]: aa.device
Out[15]: '/job:localhost/replica:0/task:0/device:GPU:0'
In [16]: bb = b.cpu() # 切换为cpu运行,这个方法极有可能在之后的版本当中删除
In [17]: bb.device
Out[17]: '/job:localhost/replica:0/task:0/device:CPU:0'
In [18]: b.numpy() # 由Tensor转换为Numpy
Out[18]: array([0, 1, 2, 3])
In [19]: b.ndim # 查看数据维度
Out[19]: 1
In [20]: tf.rank(b) # 查看数据信息
Out[20]: <tf.Tensor: shape=(), dtype=int32, numpy=1>
In [21]: tf.rank(tf.ones([3,4,2]))
Out[21]: <tf.Tensor: shape=(), dtype=int32, numpy=3>
In [23]: a = tf.constant([1.]) # 创建浮点类型常量
In [24]: b = tf.constant([True,False]) # 创建bool类型常量
In [25]: c = tf.constant("hello world!")# 创建字符串类型常量
In [27]: import numpy as np
In [28]: d = np.arange(4)# 创建numpy类型
In [29]: isinstance(a,tf.Tensor) # 判断a是否是Tensor类型
Out[29]: True
In [30]: tf.is_tensor(b) # is_tensor更推荐使用
Out[30]: True
In [31]: tf.is_tensor(d)
Out[31]: False
In [32]: a.dtype,b.dtype,c.dtype # 查看数据类型
Out[32]: (tf.float32, tf.bool, tf.string)
In [33]: a.dtype==tf.float32
Out[33]: True
In [34]: c.dtype==tf.string
Out[34]: True
In [35]: a = np.arange(5)
In [36]: a.dtype
Out[36]: dtype('int32')
In [37]: aa = tf.convert_to_tensor(a)
In [38]: aa
Out[38]: <tf.Tensor: shape=(5,), dtype=int32, numpy=array([0, 1, 2, 3, 4])>
In [39]: a
Out[39]: array([0, 1, 2, 3, 4])
In [40]: aa = tf.convert_to_tensor(a,dtype=tf.int64)
In [41]: aa
Out[41]: <tf.Tensor: shape=(5,), dtype=int64, numpy=array([0, 1, 2, 3, 4], dtype=int64)>
In [42]: tf.cast(aa,dtype=tf.float32)
Out[42]: <tf.Tensor: shape=(5,), dtype=float32, numpy=array([0., 1., 2., 3., 4.], dtype=float32)>
In [43]: aaa = tf.cast(aa,dtype=tf.double)
In [44]: aaa
Out[44]: <tf.Tensor: shape=(5,), dtype=float64, numpy=array([0., 1., 2., 3., 4.])>
In [45]: tf.cast(aaa,dtype=tf.int32)
Out[45]: <tf.Tensor: shape=(5,), dtype=int32, numpy=array([0, 1, 2, 3, 4])>
# bool与int的相互转换
In [46]: b = tf.constant([0,1])
In [47]: tf.cast(b,dtype=tf.bool)
Out[47]: <tf.Tensor: shape=(2,), dtype=bool, numpy=array([False, True])>
In [48]: bb = tf.cast(b,dtype=tf.bool)
In [49]: bb
Out[49]: <tf.Tensor: shape=(2,), dtype=bool, numpy=array([False, True])>
In [50]: tf.cast(bb,tf.int32)
Out[50]: <tf.Tensor: shape=(2,), dtype=int32, numpy=array([0, 1])>
TensorFlow当中绝大多数的变量操作都是通过Variable来进行初始化和实现的。同时,TensorFlow当中的求导运算等,也都是直接对标Variable类型,因此这个类型在TensorFlow当中非常的重要。Variable方法如下:
tf.Variable.init(initial_value, trainable=True, collections=None, validate_shape=True, name=None)
In [51]: a = tf.range(5)
In [52]: b = tf.Variable(a)
In [53]: b.dtype
Out[53]: tf.int32
In [54]: b.name
Out[54]: 'Variable:0'
In [55]: b = tf.Variable(a,name='input_data')
In [56]: b.name
Out[56]: 'input_data:0'
In [57]: tf.is_tensor(b)
Out[57]: True
In [58]: b.numpy()
Out[58]: array([0, 1, 2, 3, 4])
In [59]: b.trainable
Out[59]: True