tensorflow學習之 Eager execution

ckxllf發表於2019-12-09

  學習它主要為了解決yunyang tensorflow-yolov-3GPU多執行緒呼叫的問題

  一、開始學習 TensorFlow 最簡單的方法是使用 Eager Execution,官方提供的教程為Colab notebook,打不開需要梯子,參考其他的吧,比如這個:tensorflow之Eager execution基礎

  從tensorflow之Eager execution基礎中,我瞭解到:

  啥是Eager Execution?

  「Eager Execution」,它是一個命令式、由執行定義的介面,一旦從 Python 被呼叫,其操作立即被執行。

  這使得入門 TensorFlow 變的更簡單,也使研發更直觀。

  Eager Execution 有啥優點?

  1、快速除錯即刻的執行錯誤並透過 Python 工具進行整合

  2、藉助易於使用的 Python 控制流支援動態模型

  3、為自定義和高階梯度提供強大支援

  4、適用於幾乎所有可用的 TensorFlow 運算

  啥是張量?

  張量是一個多維陣列。與NumPy ndarray物件類似,Tensor物件具有資料型別和形狀。

  此外,Tensors可以駐留在加速器(如GPU)記憶體中。

  TensorFlow提供了豐富的操作庫(tf.add,tf.matmul,tf.linalg.inv等),

  它們使用和生成Tensors。這些操作自動轉換本機Python型別。

  張量的基本建立與使用

  # -*- coding: utf-8 -*-

  """

  @File : 191206_test_Eager_execution.py

  @Time : 2019/12/6 11:11

  @Author : Dontla

  @Email : sxana@qq.com

  @Software: PyCharm

  """

  # 匯入tensorflow

  import tensorflow as tf

  tf.enable_eager_execution()

  # 建立和使用張量

  print(tf.add(1,2)) # tf.Tensor(3, shape=(), dtype=int32)

  print(tf.add([1, 2], [3, 4])) # tf.Tensor([4 6], shape=(2,), dtype=int32)

  print(tf.square(5)) # tf.Tensor(25, shape=(), dtype=int32)

  print(tf.reduce_sum([1, 2, 3])) # tf.Tensor(6, shape=(), dtype=int32)

  print(tf.encode_base64("hello world")) # tf.Tensor(b'aGVsbG8gd29ybGQ', shape=(), dtype=string)

  print(tf.square(2) + tf.square(3)) # tf.Tensor(13, shape=(), dtype=int32)

  x = tf.matmul([[1]], [[2, 3]])

  print(x) # tf.Tensor([[2 3]], shape=(1, 2), dtype=int32)

  print(x.shape) # (1, 2)

  print(x.dtype) #

  張量的屬性

  每個Tensor都有一個形狀和資料型別

  x = tf.matmul([[1]], [[2, 3]])

  print(x.shape)

  print(x.dtype)

  NumPy array和TensorFlow張量之間最明顯的區別

  張量可以由加速器記憶體(如GPU,TPU)支援。

  張量是不可改變的。

  TensorFlow張量和NumPy nararrays之間的轉換

  TensorFlow操作自動將NumPy ndarrays轉換為Tensors。

  NumPy操作自動將Tensors轉換為NumPy ndarrays。

  透過在Tensors上呼叫.numpy()方法,可以將張量顯式轉換為NumPy ndarrays。這些轉換通常很容易,因為如果可能,陣列和Tensor共享底層記憶體表示。但是,共享底層表示並不總是可行的,因為Tensor可能託管在GPU記憶體中,而NumPy陣列總是由主機記憶體支援,因此轉換將涉及從GPU到主機記憶體的複製。

  import tensorflow as tf

  import numpy as np

  tf.enable_eager_execution()

  ndarray = np.ones([3, 3])

  print(ndarray)

  # [[1. 1. 1.]

  # [1. 1. 1.]

  # [1. 1. 1.]] 鄭州人流醫院哪家好

  print("TensorFlow operations convert numpy arrays to Tensors automatically")

  tensor = tf.multiply(ndarray, 42)

  print(tensor)

  # tf.Tensor(

  # [[42. 42. 42.]

  # [42. 42. 42.]

  # [42. 42. 42.]], shape=(3, 3), dtype=float64)

  print("And NumPy operations convert Tensors to numpy arrays automatically")

  print(np.add(tensor, 1))

  # [[43. 43. 43.]

  # [43. 43. 43.]

  # [43. 43. 43.]]

  print("The .numpy() method explicitly converts a Tensor to a numpy array")

  print(tensor.numpy())

  # [[42. 42. 42.]

  # [42. 42. 42.]

  # [42. 42. 42.]]

  二、GPU加速

  透過使用GPU進行計算,可以加速許多TensorFlow操作。在沒有任何註釋的情況下,TensorFlow會自動決定是使用GPU還是CPU進行操作(如有必要,還可以複製CPU和GPU記憶體之間的張量)。由操作產生的張量通常由執行操作的裝置的儲存器支援。例如:

  # -*- coding: utf-8 -*-

  """

  @File : 191208_test_Eager_execution_once_cls.py

  @Time : 2019/12/8 12:25

  @Author : Dontla

  @Email : sxana@qq.com

  @Software: PyCharm

  """

  import tensorflow as tf

  tf.enable_eager_execution()

  x = tf.random_uniform([3, 3])

  print("Is there a GPU available: ")

  print(tf.test.is_gpu_available()) # True

  print("Is the Tensor on GPU #0: "),

  print(x.device) # /job:localhost/replica:0/task:0/device:GPU:0

  print(x.device.endswith('GPU:0')) # True

  (1)裝置名稱

  Tensor.device屬性提供託管Tensor內容的裝置的完全限定字串名稱。此名稱對一組詳細資訊進行編碼,例如,正在執行此程式的主機的網路地址的識別符號以及該主機中的裝置。這是分散式執行TensorFlow程式所必需的,但我們暫時不會這樣做。如果張量位於主機上的第N個張量上,則字串將以GPU:結尾。

  (2)顯示裝置配置

  TensorFlow中的術語“placement"指的是如何為執行裝置分配(放置)各個操作。如上所述,當沒有提供明確的指導時,TensorFlow會自動決定執行操作的裝置,並在需要時將Tensors複製到該裝置。但是,可以使用tf.device上下文管理器將TensorFlow操作顯式放置在特定裝置上。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2667493/,如需轉載,請註明出處,否則將追究法律責任。

相關文章