机器学习-Tensorflow之Tensor和Dataset学习

好了,我们今天终于进入了现阶段机器学习领域内最流行的一个框架啦——TensorFlow。对的,这款由谷歌开发的机器学习框架很是的简单易用而且获得了几乎全部主流的承认,谷歌为了推广它的这个框架甚至单独开辟了免费学习这个框架的视频教程,惋惜这些教程都是基于TensorFlow1.0版本的,一直没有更新。如今都是TensorFlow2.0版本了,其中的开发的API的变化很是很是大,不少都是不兼容的,很是坑,若是你们仍是以为要跳坑,我不拦着哈。它的应用的官方视频教程的地址是https://developers.google.com/machine-learning/crash-course/ml-intro  ,虽然这个视频的覆盖面比较广,可是它也有几个最大的缺点:1,就像上面指出来的,它的教程是基于1.0版本的,若是你把它放到最新的TensorFlow中去运行,你会发现一大堆的错误;2,它的视频的内容深度很浅很浅,基本就是随便讲几个API;因此综上所述,你们能够参考参考它的视频,可是必定不要钻牛角尖,不然你会发现很痛苦的。好了,那么我们就来进入到我们今天的主题,那就是TensorFlow中的Tensor和dataset对象。正所谓基础不牢,地动山摇,而tensor和dataset就是TensorFlow中的基础中的基础。你们都知道TensorFlow的主要任务就是处理数据的,而TensorFlow中的数据基本格式就是tensor和dataset,因此我们确定得要重视起来。这节内容呢,我们先讲一讲TensorFlow操做对象的数据格式,以及TensorFlow中基本的数据对象。api

  • 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,我们看看下面几个简单的例子dom

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, 结果以下ui

[PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU'), PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

能够看出我们的机器有一个CPU和一个GPU,分别是CPU:0和GPU:0; 有了这个以后,我们就可让我们的数据存储而且运算在指定的硬件上面,我们能够用下面的方式来指定google

#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。spa

  • 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就是处理数据的,若是我们连数据的结构形式都不懂,实在是说不过去嘛。

相关文章
相关标签/搜索