機器學習-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就是處理數據的,若是我們連數據的結構形式都不懂,實在是說不過去嘛。

相關文章
相關標籤/搜索