参考《HCIA-AI2.0培训教材》《HCIA-AI2.0实验手册》

认证要求:

  1. 了解TensorFlow2.0是什么以及其特点
  2. 掌握TensorFlow2.0基础和高阶操作方法
  3. 熟悉TensorFlow2.0中的Keras API

简介:

TensorFlow是目前最为流行的深度学习框架,是人工智能领域的第一主要工具。从发布至今,共经历了0.1,1.0,2.0三个版本,认证考试要求掌握的是最新的2.0版本。

TensorFlow1.X中创建Tensor后,不能直接返回结果,只是创建计算图graph,需要在之后使用session会话机制才能运行,这种风格更像是一种硬件编程语言VHDL。

另外,TensorFlow1.X调试困难,API混乱,入门不易,使用更难,很多研究人员转向了PyTorch,但是比如在移动端的部署还是非常头疼。

TensorFlow2.0最大的特性就是去掉了graph和session机制,变得像Python和PyTorch一样,所见即所得。计算图、会话、变量管理与共享、Define-and-Run这些概念将一去不返了。

TensorFlow2.0包括了TensorFlow核心库,JavaScript,Lite,Extend。构成了一个完整的TensorFlow生态系统。

Why TensorFlow?

TensorFlow成为当下最流行的框架主要因为以下几个优势:

  • 支持GPU加速
  • 支持自动求导
  • 丰富的深度学习API

GPU可以对矩阵的加减乘除做并行加速:

import tensorflow as tf
import timeit
with tf.device('/cpu:0'):cpu_a = tf.random.normal([10000,1000])cpu_b = tf.random.normal([1000,2000])print(cpu_a.device,cpu_b.device)def cpu_run():with tf.device('/cpu:0'):c = tf.matmul(cpu_a,cpu_b)return cwith tf.device('/gpu:0'):gpu_a = tf.random.normal([10000,1000])gpu_b = tf.random.normal([1000,2000])print(gpu_a.device,gpu_b.device)def gpu_run():with tf.device('/gpu:0'):d = tf.matmul(gpu_a,gpu_b)return d# warm up
cpu_time = timeit.timeit(cpu_run,number=10)
gpu_time = timeit.timeit(gpu_run,number=10)print('warm up: ',cpu_time,gpu_time)# run time
cpu_time = timeit.timeit(cpu_run,number=10)
gpu_time = timeit.timeit(gpu_run,number=10)print('run time: ',cpu_time,gpu_time)

i7-9700 v.s. RTX 2070 S

自动求导tf.Gradient(Tape):

import tensorflow as tfa = tf.constant(1.)
b = tf.constant(2.)
c = tf.constant(4.)with tf.GradientTape() as tape:tape.watch([a,b,c])y = a**2 + b*c + c[da,db,dc] = tape.gradient(y,[a,b,c])print(da)
print(db)
print(dc)

da=2*a=2,db=c=4,dc=b+1=3

TensorFlow提供大量的深度学习API:


Tensorflow2.0 GPU环境搭建(linux平台下)

Nvidia显卡驱动:需要在Nvidia官网https://www.nvidia.com/Download/index.aspx?lang=en-us查询显卡对应的驱动包,下载。下面提供了一个适合RTX 20XX系列的安装包的百度云链接。链接:https://pan.baidu.com/s/1b1daIaMaz7-oy28sMLjysA 密码:4jeg

下载后进入tty3命令行模式,关闭lightdm,禁用nouveau显卡驱动,并安装Nividia显卡驱动程序,最后重启lightdm回到图形界面。

执行nvidia-smi,验证是否安装成功。

CUDA10.0:下面是CUDA10.0的百度云下载链接。链接:https://pan.baidu.com/s/1L8OyM28D3UZi_IVPaceILA 密码:8e9t

注意在~/.bashrc配置环境变量,否则tensorflow会找不到.so文件。

执行nvcc -V,验证是否安装成功。

cudnn:用于神经网络运算加速。百度云链接:https://pan.baidu.com/s/1bAc8jrRUBeSIA1QQGTuHNg 密码:jc31

miniconda3:使用conda管理python环境,下载地址

Tsinghua Open Source Mirror​mirrors.ustc.edu.cn

安装后创建tensorflow2.0实验环境:

conda create -n tf2.0 python=3.6
conda activate tf2.0
pip install ( -i 清华或豆瓣源) tensorflow_gpu == 2.0.0

验证GPU加速可用:

import tensorflow as tf
print(tf.test.is_gpu_available()) # 输出True则成功


TensorFlow2.0基础操作

1.常见的数据类型载体

  • list:灵活,可以随意插入、添加和编辑,内存的管理不是很连续,对高维数据的读取和写入效率很低
  • np.array:专门用来解决同类型数据运算的一个载体,很方便高效完成数据吞吐和计算。但没有很好的GPU支持,也不能支持自动求导
  • tf.Tensor:和np.array地位相似。为了方便使用NumPy的开发者能够更便利的转到TensorFlow,一些API命名也很相似。功能上更偏重于神经网络计算。TensorFlow中,标量、向量、矩阵、多维数组都被叫做tensor。

2.TensorFlow2.0中的数据类型

  • int:tf.constant(1,dtype=tf.int32)
  • float:tf.constant(1.,dtype=tf.float32)
  • double:tf.constant(1.,dtype=tf.double) = tf.constant(1.,dtype=tf.float64),double是float64的别名
  • bool:tf.constant([True,False])
  • string:tf.constant('hello world')

3.查看数据所在设备-device

with tf.device('cpu'):a = tf.constant(1)with tf.device('gpu'):b = tf.range(4)print(a.device)
print(b.device)

如果需要在设备间相互转移,则a.gpu();b.cpu()即可 。

4.查看数据维度

  • a.ndim #返回数据维度 ,注意若用tf.rank(a),则会返回一个标量的tensor
  • a.shape #返回数据shape

这里和numpy是一样的。另外,注意维度和形状的区别,比如shape=(batchsize,h,w,3),它的维度是4,相当于ndim = len(shape)

5.判断是否是tensor

  • tf.is_tensor(a)
  • isinstance(a,tf.Tensor)

6.数据类型查看与转化

  • 用a.dtype属性查看数据类型
  • tf.cast(a,dtype=XX)做类型转化 ,cast是投,投射的意思。
  • a.numpy()可以直接将Tensor转成np.ndarray
a = tf.constant(1)
print(a.dtype)
a = tf.cast(a,dtype=tf.float32)
print(a.dtype)

7.用Variable包装Tensor

Variable包装后的变量就具有了可求导的特性,是专门为nn参数设计的属性。

a = tf.range(5)
b = tf.Variable(a)
print(b.name)
print(isinstance(b,tf.Tensor))
print(isinstance(b,tf.Variable))
print(tf.is_tensor(b))

我原来看过一个比方,说Tensor就是赤裸裸的钱,但Variable是支付宝,它不仅装着你的钱,还记录你的钱的流通和去向等信息,可以管理你的钱。

8.创建Tensor

和NumPy及其相似,可参考

傅分析:Python の NumPy​zhuanlan.zhihu.com

  • tf.convert_to_tensor(python_list or numpy_array )
  • tf.zeros(shape) / tf.ones(shape) 同numpy
  • tf.fill(shape,value) 千万注意在numpy里叫full
  • tf.random.normal(shape[,mean,stddev]) 正态
  • tf.random.uniform(shape[,minval,maxval]) 均匀
  • tf.random.shuffle(a) 随机打乱
import numpy as np
a = tf.convert_to_tensor([1,1])
print(a)
b = tf.convert_to_tensor(np.ones((2,)))
print(b)
c = tf.ones((2,))
print(c)
d = tf.fill((2,),1)
print(d)

另外,和numpy的random.shuffle()一样,这里也是对axis=0做随机打乱

9.索引与切片

索引方式与NumPy完全相同,不赘述。

切片:

  • [start:end:step] / [::step]
  • [::-1]是倒序切片的技巧
  • ...是任意长的:序列,可以有效规避[::,::,::,0]这种冗长的表达,替换为[...,0]
  • tf.gather可以指定索引的轴,并指定顺序
a = tf.random.normal((4,5,5,3))
b = a[...,0:2]
print(b.shape)  # (4, 5, 5, 2)
c = tf.gather(a,axis=3,indices=[0,1])
print(c.shape)  # (4, 5, 5, 2)

10.维度变换

view的概念:

  • [b,28,28] 原始
  • [b,28*28] √
  • [b,2,14*28] √
  • [b,28,28,1] √

一堆数据存在那,怎么理解数据的shape就是view,但是不能改变数据的存储位置。比如[n,h,w,3]的数据,每个像素点的rgb像素都连续存储,你通过view,想view到[n,3,h,w],即想通过view来让三通道分离,那是万万不可能的,你可以reshape它为[n,3,h,w]但不能达到你要的分离通道的效果,因为数据的存储位置是不变的。若你要改变数据的存储位置,那就不是维度变换的概念了,维度变换就是变化视角,变化view。

a = tf.random.normal((4,5,5,3))
b = tf.reshape(a,(4,-1,3)) # -1 会自动计算
print(b.shape) # (4,25,3)

注意,numpy中可以a.reshape(shape),但Tensor没有这个属性,只能tf.reshape()

11.维度转置

刚才说的那个改变数据存储位置的三通道分离的操作,要通过转置实现。

a = tf.random.normal((4,5,5,3))
b = tf.transpose(a,perm=[0,3,1,2])
print(b.shape) # (4,3,5,5)

转置会改变数据存储真实的位置关系,会比较慢。

12.维度增减

  • 扩张维度用tf.expend_dims(a,axis),注意是dims不是dim ,另外axis只能是single value,即不能一次扩展多维。
  • a:[classes,students,courses]->[4,35,8]可以描述成4个班级,每个班35个学生,每个学生有8门课。增加学校的维度:[1,4,35,8]
# expand dim
a = tf.random.normal((4,35,8))
b = tf.expand_dims(a,axis=0)
print(b.shape)
c = tf.expand_dims(a,axis=-1) # 等同于axis=3
print(c.shape)

  • 压缩维度用tf.squeeze(a,axis),如果不声明axis,那么将压缩所有数值为1的维度。
a = tf.zeros((1,2,1,3))
b = tf.squeeze(a,axis=2)
print(b.shape)
c = tf.squeeze(a)
print(c.shape)

13.broadcasting(广播)

  • Broadcasting:本质是张量维度扩张的一个手段,指对某个维度上重复n次但没有真正的复制一个数据。
  • (4,32,32,3) + (3,)可以对shape为(3,)的Tensor进行广播,(3,)->(1,1,1,3)->(4,32,32,3)。
  • 这样比再定义一个同等shape的Tensor大大节省了内存。
  • 系统会自动判断是否可以进行广播。

14.数学运算

  • +,-,*,/
  • **,pow,square
  • //,%
  • exp,log(注意tf.exp(),tf.math.log())
  • @,matmul (矩阵乘法)

TensorFlow2.0高阶操作

1.张量合并

  • tf.concat((a,b,...),axis)用于多个张量的拼接
  • 待拼接的轴对应的维度数值可以不等,但其他维度形状需一致
  • 不会产生新的维度,只会在原来维度的数值上有所改变
a = tf.ones((2,3))
b = tf.zeros((1,3))
c= tf.concat((a,b),axis=0)
print(c)

  • tf.stack((a,b,...),axis)用于多个张量的堆叠
  • 带堆叠张量的所有维度数值必须相等
  • 根据指定的axis,产生新的一个维度
a = tf.ones((2,3))
b = tf.zeros((2,3))
c= tf.stack((a,b),axis=0)
print(c)

a = tf.ones((2,3))
b = tf.zeros((2,3))
c= tf.stack((a,b),axis=-1)
print(c)

2.张量分割

  • tf.unstack(a,axis)是stack的逆操作
  • 在指定的axis上,把原张量拆开
  • 原张量在axis上值为多少,就需要有多少个新变量去承接
abc = tf.ones((3,3))
a,b,c = tf.unstack(abc,axis=0)
print(a)
print(b)
print(c)

  • tf.split(a,axis,num_or_size_splits) 是unstack基础上更灵活的分法
  • unstack会把指定axis上全部拆开,但split可以指定拆分的个数或方式
a = tf.ones((4,3))
a1,a2 = tf.split(a,axis=0,num_or_size_splits=2)
print(a1.shape,a2.shape) # (2,3) (2,3)
a1,a2,a3 = tf.split(a,axis=0,num_or_size_splits=[1,2,1])
print(a1.shape,a2.shape,a3.shape) # (1,3) (2,3) (1,3)

3.数据统计

  • tf.reduce_min() tf.reduce_max() tf.reduce_mean()若不指定axis,则完成整个张量的求值,指定axis,则返回每个axis上的求解值。
  • tf.argmax() tf.argmin()分别返回最大最小值所在位置,默认的axis=0,和上面reduce_xxx不一样。
  • tf.equal()返回两个张量的比较结果,每个位置上都会有一个True or False。
  • tf.unique()会去除一维张量中重复的元素 ,第一个返回值是去重后的张量,第二个返回值是对应索引。
a = tf.ones((2,2))
b = tf.ones((2,2))
c = tf.equal(a,b)
print(f'c:{c}') # shape is (2,2)
c = tf.reshape(c,(-1,)) # 必须reshape成(4,)
unique,idx = tf.unique(c) # tf.unique只接受一维张量
print(f'unique:{unique}')
print(f'idx:{idx}')

equal和unique配合使用,可以判断两个多维张量是否全等。

4.张量排序

  • tf.sort() tf.argsort()分别完成对某个维度的排序和获取排序后的索引位置。
a = tf.random.shuffle(tf.range(5))
print(f'a:{a}')
a_sort = tf.sort(a,direction="DESCENDING") # 降序排列
print(f'a_sort:{a_sort}')
a_argsort = tf.argsort(a,direction="DESCENDING")
print(f'a_argsort:{a_argsort}')

  • tf.math.top_k()可查看最大的k个元素的值或索引
a = tf.random.uniform((3,3),maxval=10,dtype=tf.int32)
print(f'a:n{a}')
res = tf.math.top_k(a,2)
print(f'values:n{res.values}')
print(f'indices:n{res.indices}')

5.张量填充

tf.pad()

对一批图像a = (n,h,w,c),只有h和w需要padding,tf.pad(a,[[0,0],[2,2],[2,2],[0,0]]) 即可填充两行两列0项到图像。

a = tf.random.normal((8,32,32,3))
b = tf.pad(a,[[0,0],[2,2],[2,2],[0,0]])
print(b.shape) # (8,36,36,3)

6.张量复制

tf.tile()

指定张量沿着各轴复制多少次,比如a.shape=(2,2),要求a沿0轴复制2次,1轴复制3次,则:

a = tf.ones((2,2))
b = tf.tile(a,(2,3)) # 元组里的每个数值对应该轴复制次数
print(b)

7.随机种子

tf.random.set_seed()

mybatis-plus对datetime返回去掉.0_华为AI认证-TensorFlow2.0编程基础相关推荐

  1. mybatis-plus对datetime返回去掉.0_0欧姆电阻只能当导线用?12种用法来学习下

    1.在电路中没有任何功能,只是在PCB上为了调试方便或兼容设计等原因. 2.可以做跳线用,如果某段线路不用,直接不贴该电阻即可(不影响外观) 3.在匹配电路参数不确定的时候,以0欧姆代替,实际调试的时 ...

  2. mybatis-plus对datetime返回去掉.0_0欧姆电阻到底有没有用?这12个作用说明其不可或缺...

    1.在电路中没有任何功能,只是在PCB上为了调试方便或兼容设计等原因. 2.可以做跳线用,如果某段线路不用,直接不贴该电阻即可(不影响外观) 3.在匹配电路参数不确定的时候,以0欧姆代替,实际调试的时 ...

  3. 华为 HCIA-Cloud Computing V4.0(基础知识)

    HCIA-Cloud Computing V4.01.云计算简介1.1 初始云计算及云计算的优势云计算的优势:1.2云计算的定义.发展史和分类云计算服务模式2.计算虚拟化简介2.1 计算虚拟化介绍 什 ...

  4. 华为AI认证_图像处理实验(图像预处理)

    实验一:灰度变化 代码: import cv2 import numpy as npdef liner_trans(org,k,b=0):"""灰度变化:param im ...

  5. internetreadfile读取数据长度为0_【完结】TensorFlow2.0 快速上手手册

    大家好,这是专栏<TensorFlow2.0>的第五篇文章,我们对专栏<TensorFlow2.0>进行一个总结. 我们知道全新的TensorFlow2.0 Alpha已经于2 ...

  6. 给定一个字符串s,返回去掉子串mi后的字符串。

    2019独角兽企业重金招聘Python工程师标准>>> 给定一个字符串s,返回去掉子串"mi"后的字符串.(注:删除n个mi后,仍包含mi应一同删除,如ammim ...

  7. python 时间格式 工作日_python使用time、datetime返回工作日列表实例代码

    最近在学习python,动手做了一个自动填写日报的小工具:由于请求中包含时间,格式如:2016-08-04:所以就了解了一下python的时间日期相关函数:这里做简单记录. 函数功能非常简单:获取当月 ...

  8. mybatis添加记录时返回主键id

    参考:mybatis添加记录时返回主键id 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作. 在使用mybatis作为ORM组件时,可以很方便地达到这 ...

  9. mybatis插入数据后返回自增主键ID详解

    1.场景介绍: ​ 开发过程中我们经常性的会用到许多的中间表,用于数据之间的对应和关联.这个时候我们关联最多的就是ID,我们在一张表中插入数据后级联增加到关联表中.我们熟知的mybatis在插入数据后 ...

最新文章

  1. flash h5录音_博乐h5网站建设案例-AI优网络
  2. php中查询结果展示
  3. python绘制条形图用什么函数_Python绘制正余弦函数图像完整代码
  4. mongodb不等于某个值_MongoDb进阶实践之四 MongoDB查询命令详述
  5. volatile的学习总结
  6. 终端、虚拟控制台与伪终端
  7. php 百度云 上传,求个PHP版百度云BOS上传文件的dome
  8. VMware安装VMwaretools
  9. /usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory 报错解决
  10. solr6.6+jetty+centos+mysql
  11. 【华为云技术分享】大数据容器化,头部玩家尝到了甜头
  12. 使用ubuntu的新立德下载和安装的Eclipse无法在其help菜单中连接并安装ADT
  13. 对PV操作问题的理解综合
  14. 微服务领域是不是要变天了?Spring Cloud Alibaba正式入驻Spring Cloud官方孵化器!...
  15. linux用openssl制作自签名数字证书
  16. 2020年最全易语言安装与配置使用教程
  17. dorado 7 注意总结
  18. wps如何设置分段页眉
  19. 小白量化《穿云箭集群量化》(1)小白草根超级量化软件介绍
  20. TE TM TEM模的区别

热门文章

  1. ATS中的命令行工具解读
  2. Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D C#: Learn To Code Making 3D Games
  3. 使用dd查看磁盘前4个扇区的内容
  4. c潭州课堂25班:Ph201805201 MySQL第二课 (课堂笔记)
  5. jquery判断一个元素是否为某元素的子元素
  6. 图论:关于二分图的总结(转载)
  7. jquery通知插件toastr
  8. python数据库学习--Mysql
  9. 从iso镜像升级ubuntu
  10. 特征点匹配+特征检测方法汇总