机器学习-Tensorflow之Tensor和Dataset学习
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
机器学习-Tensorflow之Tensor和Dataset学习Tensor
Tensor其实翻译过来就是张量的意思,这⾥我不解释什么是张量,咱们就把它看成⼀个对象object,然后这个object⾥⾯有存储数据和其他⼀些属性,例如shape,dtype等等。
为了更加形象的展⽰⼀下在TensorFlow中tensor到底长什么样⼦,咱们来看⼀个⼩例⼦如下
<tf.Tensor: id=835, shape=(2,), dtype=int32, numpy=array([4, 6])>
从上⾯咱们可以看出,Tensor对象有⼀个id属性;⼀个shape属性,它是个tuple;⼀个dtype属性;咱们的核⼼也是重点是在他的numpy属性,这⾥也可以看出它是⼀个ndarray类型的数据。
它的形式就是这么的简单,虽然简单,但是⼤家⼀定要理解它的意思以及本质,不要跟其他的数据类型搞混了,例如numpy中的array,Python中的list,他们虽然长得很像,很多情况下也相互兼容,但是他们实质上是属于不同的数据类型。
那么既然咱们已经知道了tensor长什么样⼦,也知道tensor中的内容含义,那么咱们如何创建⼀个tensor呢?其实任何⼀种Python或者numpy中的data,只要是通过TensorFlow中的运算符来计算过,那么就⾃动转成并且返回tensor类型了,对的,你没有听
错,TensorFlow中也有他⾃⼰的加减乘除等运算的api,咱们看看下⾯⼏个简单的例⼦
tf.add(1,2)
tf.add([1,2],[3,4])
tf.square(5)
tensor = tf.constant([1,2,3,4,5])
上⾯的返回结果分别是
<tf.Tensor: id=859, shape=(), dtype=int32, numpy=3>
<tf.Tensor: id=862, shape=(2,), dtype=int32, numpy=array([4, 6])>
<tf.Tensor: id=864, shape=(), dtype=int32, numpy=25>
<tf.Tensor: id=865, shape=(5,), dtype=int32, numpy=array([1, 2, 3, 4, 5])>
根据前⾯对于tensor结构的分析,结合上⾯的例⼦,咱们就能更加深⼊的理解tensor这个数据对象了;那么这⾥问题⼜来了,如果咱们有Python的数据或者numpy的数据,我们如何能将他们转化成tensor,甚⾄于他们能够相互转化呢这是⼀个经常遇到的需求,咱们当然有办法啦,看下⾯的代码
"2. converting between Tensor and numpy array"
ndarray = np.ones([3,3])
#2.1 from numpy array to tensor (through tensorflow operations)
tensor = tf.multiply(ndarray,1)
#2.2 from tensor to numpy array (through explicitly numpy())
tensor_to_numpy = tensor.numpy()
哈哈,是不是超级简单,从numpy转成tensor,只需要TensorFlow乘以1就OK啦,相反地,从tensor转成numpy只需要调⽤tensor的函数numpy()就⾏了。
是不是so easy. TensorFlow都为咱们想好了。
补充:这⾥稍微补充⼀个⼩知识点,那就是GPU和CPU。
在TensorFlow的应⽤中,或者说机器学习领域,⼀般都是⼤数据的处理,⼀般情况下,GPU对于数据的处理量和处理速度都⼤于CPU(因为CPU⾥⾯有很多⾮常复杂的逻辑单元和中断系统等等),所以咱们⼀般都会将Tensor或者Dataset存储在GPU中进⾏运算。
那么问题来了,咱们怎么获取我们机器的这些硬件信息呢?咱们如何把tensor存储到制定的硬件⾥⾯去呢??
print(tf.config.experimental.list_physical_devices())#show the available devices
上⾯的代码可以打印出咱们机器⾥⾯可⽤的CPU和GPU, 结果如下
[PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU'), PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
可以看出咱们的机器有⼀个CPU和⼀个GPU,分别是CPU:0和GPU:0; 有了这个之后,咱们就可以让咱们的数据存储并且运算在指定的硬件上⾯,咱们可以⽤下⾯的⽅式来指定
#force execuion on CPU
with tf.device("CPU:0"):
x = tf.random.uniform([1000,1000])
#assert x.device.endswith("CPU:0")
time_matmul(x)
#force execution on GPU
print("On GPU")
with tf.device("GPU:0"):
x=tf.random.uniform([1000,1000])
#assert x.device.endswith("GPU:0")
time_matmul(x)
从上⾯咱们可以看出,咱们可以⽤with这个关键字来指定咱们的tensor存储在哪⾥。
上⾯代码的第⼀部分是指定到CPU,第⼆部分是指定到GPU。
Dataset
Dataset顾名思义就是数据集的意思,虽然他的定义⽐较抽象,但是其实⼤家可以把它想象成⼀个装Tensor的容器,⼀个dataset可能只来⾃于⼀个tensor,也可以是多个Tensor。
但是这⾥的⼀个⼩细节需要注意,那就是当⼀个dataset来⾃于多个Tensor的时候,那么这些tensors
的第⼀个dimension必须要是相同的,否则会产⽣incompatible errors错误哦。
⼤家需要主要澳。
那么咱们先来看看如何创建⼀个Dataset 呢??
tensor1 = tf.multiply([1,2,3,4,5],1)
dataset1 = tf.data.Dataset.from_tensor_slices(tensor1)
咱们从上⾯可以看出来,第⼀句代码是创建⼀个tensor对象,第⼆句就是创建dataset的过程,咱们最常⽤的创建dataset的API就是
from_tensor_slicers这个⽅法,它后⾯的参数可以是⼀个tensor也可以是多个tensors. 那么上⾯是⼀个最简单的dataset,接下来咱们看⼀个堪忧2个tensor的dataset:
c1 = tf.random.uniform([4])
c2= tf.random.uniform([4,10])
dataset2 = tf.data.Dataset.from_tensor_slices((
c1,c2
))
咱们可以看出来,上⾯的代码也是先创建2个tensor,分别是C1, C2。
同样的咱们通过from_tensor_slices这个⽅法创建dataset对象,但是咱们可以看出它⾥⾯的参数是⼀个tuple,这个tuple⾥⾯的元素就是2个tensors。
注意:这⾥2个tensor的第⼀维(first dimension)是⼀样的,记住这个必须⼀样,否则必报错哈。
既然咱们已经创建了dataset,那么咱们如何获取⾥⾯的值呢在以前的TensorFlow版本都是通过创建iterator的⽅式来获取dataset⾥⾯的element,那么在最新的版本中,这个⽅法已经被deprecate了,取⽽代之的是⽤for-in是⽅式遍历了,如下所⽰,咱们去这个dataset2的第⼀条数据来演⽰
for element in dataset2:
print(element)
break
咱们看看dataset2的第⼀条数据长成啥样哈?
(<tf.Tensor: id=67, shape=(), dtype=float32, numpy=0.8284787>, <tf.Tensor: id=68, shape=(10,), dtype=float32, numpy=
array([0.46768987, 0.4085338 , 0.06623507, 0.16808486, 0.7843472 ,
0.6430875 , 0.94050014, 0.79995286, 0.35672653, 0.97420156],
dtype=float32)>)
仔细分析⼀下,它是⼀个tuple,这个tuple⾥⾯装有两个tensor对象。
咱们这下应该全明⽩了tensor和dataset是啥了以及他们之间的关系了吧。
总结
那么咱们现在来总结⼀下哈,本节主要介绍了TensorFlow中基本的数据格式,分别是tensor和dataset。
上⾯分别讲述了tensor和dataset的结构,创建过程,内容获取等⽅⾯的知识到。
虽然TensorFlow是兼容咱们的numpy数据类型,但是有些情况下还是会有⼀些问题,所以咱们在后⾯学习TensorFlow应⽤的过程中尽量还是将数据转化成tensor,即使tensor也是基于numpy的。
这节的重点是看懂tensor对象的内部参数的意思,以及dataset的结构。
这是整个TensorFlow的根基,毕竟TensorFlow就是处理数据的,如果咱们连数据的结构形式都不懂,实在是说不过去嘛。