tensorflow教程 学习笔记 之 Eager execution 急切执行
链接:https://tensorflow.juejin.im/get_started/
学习它主要为了解决yunyang tensorflow-yolov-3GPU多线程调用的问题
文章目录
- 坑1
- 啥是Eager Execution?
- Eager Execution 有啥优点?
- 啥是张量?
- 张量的基本创建与使用
- 张量的属性
- NumPy array和TensorFlow张量之间最明显的区别
- TensorFlow张量和NumPy nararrays之间的转换
- 坑2
- GPU加速
- (1)设备名称
- (2)显示设备配置
- 坑3
- 数据集
- (1)创建源数据集
- (2)应用transformations
- (3)迭代
坑1
开始学习 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) # <dtype: 'int32'>张量的属性
每个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.]]坑2
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 tftf.enable_eager_execution()x = tf.random_uniform([3, 3])print("Is there a GPU available: ") print(tf.test.is_gpu_available()) # Trueprint("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操作显式放置在特定设备上。例如:
Wocalei,我在pycharm上跑半天没跑起来,最后放到ipython上才跑起来的!!!
C:\Users\Dontla>ipython Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] Type 'copyright', 'credits' or 'license' for more information IPython 7.9.0 -- An enhanced Interactive Python. Type '?' for help.In [1]: import tensorflow as tf...:...:...: def time_matmul(x):...: %timeit tf.matmul(x, x)...:...:...: # Force execution on CPU...: print("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 #0 if available...: if tf.test.is_gpu_available():...: with tf.device("GPU:0"): # Or GPU:1 for the 2nd GPU, GPU:2 for the 3rd etc....: x = tf.random_uniform([1000, 1000])...: assert x.device.endswith("GPU:0")...: time_matmul(x)...: On CPU: 608 µs ± 40.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 2019-12-09 11:33:50.419224: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 2019-12-09 11:33:51.356242: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1411] Found device 0 with properties: name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.6575 pciBusID: 0000:0e:00.0 totalMemory: 11.00GiB freeMemory: 9.10GiB 2019-12-09 11:33:51.533039: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1411] Found device 1 with properties: name: GeForce GT 710 major: 3 minor: 5 memoryClockRate(GHz): 0.954 pciBusID: 0000:05:00.0 totalMemory: 2.00GiB freeMemory: 1.67GiB 2019-12-09 11:33:51.546476: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1461] Ignoring visible gpu device (device: 1, name: GeForce GT 710, pci bus id: 0000:05:00.0, compute capability: 3.5) with Cuda compute capability 3.5. The minimum required Cuda capability is 3.7. 2019-12-09 11:33:51.567213: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1490] Adding visible gpu devices: 0 2019-12-09 11:33:53.149081: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] Device interconnect StreamExecutor with strength 1 edge matrix: 2019-12-09 11:33:53.164773: I tensorflow/core/common_runtime/gpu/gpu_device.cc:977] 0 1 2019-12-09 11:33:53.172301: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990] 0: N N 2019-12-09 11:33:53.182373: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990] 1: N N 2019-12-09 11:33:53.187598: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1103] Created TensorFlow device (/device:GPU:0 with 8789 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:0e:00.0, compute capability: 6.1) 620 µs ± 48.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)In [2]:不过,在我搞了半天之后,终于能使程序再pycharm上运行了:
# -*- 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 """from timeit import timeit import tensorflow as tfdef func(x):tf.matmul(x, x)def time_matmul(x):print(timeit('func', 'from __main__ import func', number=1))# Force execution on CPU print("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 #0 if available if tf.test.is_gpu_available():with tf.device("GPU:0"): # Or GPU:1 for the 2nd GPU, GPU:2 for the 3rd etc.x = tf.random_uniform([1000, 1000])assert x.device.endswith("GPU:0")time_matmul(x)结果:
D:\20191031_tensorflow_yolov3\python\python.exe D:/20191031_tensorflow_yolov3/needed/test_tensorflow-gpu/191208_test_Eager_execution_once_cls.py On CPU: 2019-12-10 09:56:02.601521: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 6.209648925078723e-07 2019-12-10 09:56:03.389699: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1411] Found device 0 with properties: name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.6575 pciBusID: 0000:0e:00.0 totalMemory: 11.00GiB freeMemory: 9.10GiB 2019-12-10 09:56:03.537904: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1411] Found device 1 with properties: name: GeForce GT 710 major: 3 minor: 5 memoryClockRate(GHz): 0.954 pciBusID: 0000:05:00.0 totalMemory: 2.00GiB freeMemory: 1.67GiB 2019-12-10 09:56:03.538533: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1461] Ignoring visible gpu device (device: 1, name: GeForce GT 710, pci bus id: 0000:05:00.0, compute capability: 3.5) with Cuda compute capability 3.5. The minimum required Cuda capability is 3.7. 2019-12-10 09:56:03.539099: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1490] Adding visible gpu devices: 0 2019-12-10 09:56:05.750966: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] Device interconnect StreamExecutor with strength 1 edge matrix: 2019-12-10 09:56:05.751268: I tensorflow/core/common_runtime/gpu/gpu_device.cc:977] 0 1 2019-12-10 09:56:05.751452: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990] 0: N N 2019-12-10 09:56:05.751652: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990] 1: N N 2019-12-10 09:56:05.752012: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1103] Created TensorFlow device (/device:GPU:0 with 8789 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:0e:00.0, compute capability: 6.1) 9.314473379262722e-07Process finished with exit code 0以上我是重新定义了一个func()函数了,但并未抓住问题的本质,以下才是:
# -*- 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 """from timeit import timeit import tensorflow as tfdef time_matmul(x):print(timeit('tf.matmul(x, x)', 'from __main__ import tf,x', number=1))# Force execution on CPU print("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 #0 if available if tf.test.is_gpu_available():with tf.device("GPU:0"): # Or GPU:1 for the 2nd GPU, GPU:2 for the 3rd etc.x = tf.random_uniform([1000, 1000])assert x.device.endswith("GPU:0")time_matmul(x)结果:
D:\20191031_tensorflow_yolov3\python\python.exe D:/20191031_tensorflow_yolov3/needed/test_tensorflow-gpu/191208_test_Eager_execution_once_cls.py On CPU: 2019-12-10 10:45:10.788751: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 0.0006731259434785336 2019-12-10 10:45:11.520722: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1411] Found device 0 with properties: name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.6575 pciBusID: 0000:0e:00.0 totalMemory: 11.00GiB freeMemory: 9.10GiB 2019-12-10 10:45:11.647470: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1411] Found device 1 with properties: name: GeForce GT 710 major: 3 minor: 5 memoryClockRate(GHz): 0.954 pciBusID: 0000:05:00.0 totalMemory: 2.00GiB freeMemory: 1.67GiB 2019-12-10 10:45:11.648053: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1461] Ignoring visible gpu device (device: 1, name: GeForce GT 710, pci bus id: 0000:05:00.0, compute capability: 3.5) with Cuda compute capability 3.5. The minimum required Cuda capability is 3.7. 2019-12-10 10:45:11.648577: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1490] Adding visible gpu devices: 0 2019-12-10 10:45:13.033777: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] Device interconnect StreamExecutor with strength 1 edge matrix: 2019-12-10 10:45:13.034072: I tensorflow/core/common_runtime/gpu/gpu_device.cc:977] 0 1 2019-12-10 10:45:13.034252: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990] 0: N N 2019-12-10 10:45:13.034427: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990] 1: N N 2019-12-10 10:45:13.034762: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1103] Created TensorFlow device (/device:GPU:0 with 8789 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:0e:00.0, compute capability: 6.1) 0.0015999160455466566Process finished with exit code 0坑3
数据集
演示如何使用tf.data.Dataset API构建pipelines以将数据提供给模型。它涵盖:
- 创建数据集。
- 在启用了eager execution的情况下对数据集进行迭代。
我们建议使用数据集API从简单,可重复使用的部分构建高性能,复杂的pipelines,这些部分将为模型的训练或评估循环提供支持。
如果您熟悉TensorFlow图,则在启用eager execution时,构建数据集对象的API保持完全相同,但迭代数据集元素的过程稍微简单一些。您可以对tf.data.Dataset对象使用Python迭代,而不需要显式创建tf.data.Iterator对象。因此,在启用eager执行时,TensorFlow指南中对迭代器的讨论无关紧要。
(1)创建源数据集
使用其中一个工厂函数(如Dataset.from_tensors,Dataset.from_tensor_slices)或使用从TextLineDataset或TFRecordDataset等文件读取的对象创建源数据集。
# -*- 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 tftf.enable_eager_execution()ds_tensors = tf.data.Dataset.from_tensor_slices([1, 2, 3, 4, 5, 6]) # print(type(ds_tensors)) # <class 'tensorflow.python.data.ops.dataset_ops.TensorSliceDataset'> # print(ds_tensors) # TensorSliceDataset shapes: (), types: tf.int32># Create a CSV file import tempfile# tempfile.mkstemp()返回os.open返回的文件描述符和文件名 _, filename = tempfile.mkstemp(dir='./') # print(_) # 3 # print(filename) # D:\20191031_tensorflow_yolov3\needed\test_tensorflow-gpu\tmpjrwgapybwith open(filename, 'w') as f:f.write("""Line 1 Line 2 Line 3""")ds_file = tf.data.TextLineDataset(filename)with open(filename, 'r') as f:print(f.read()) # Line 1 # Line 2 # Line 3(2)应用transformations
使用map,batch,shuffle等转换函数将转换应用于数据集的记录。(啥意思??)
ds_tensors = ds_tensors.map(tf.square).shuffle(2).batch(2)ds_file = ds_file.batch(2)(3)迭代
启用eager执行时,Dataset对象支持迭代。如果您熟悉TensorFlow图中数据集的使用,请注意不需要调用Dataset.make_one_shot_iterator()或get_next()。
print('Elements of ds_tensors:') for x in ds_tensors:print(x) # Elements of ds_tensors: # tf.Tensor([4 9], shape=(2,), dtype=int32) # tf.Tensor([16 25], shape=(2,), dtype=int32) # tf.Tensor([ 1 36], shape=(2,), dtype=int32)print('\nElements in ds_file:') for x in ds_file:print(x) # Elements in ds_file: # tf.Tensor([b'Line 1 ' b'Line 2'], shape=(2,), dtype=string) # tf.Tensor([b'Line 3'], shape=(1,), dtype=string)引用文章:tensorflow之Eager execution基础
总结
以上是生活随笔为你收集整理的tensorflow教程 学习笔记 之 Eager execution 急切执行的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: tensorflow tf.matmul
- 下一篇: 计算机中 什么是同步执行和异步执行?