mybatis-plus对datetime返回去掉.0_华为AI认证-TensorFlow2.0编程基础
参考《HCIA-AI2.0培训教材》《HCIA-AI2.0实验手册》
认证要求:
- 了解TensorFlow2.0是什么以及其特点
- 掌握TensorFlow2.0基础和高阶操作方法
- 熟悉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)
自动求导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)
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 Mirrormirrors.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 の NumPyzhuanlan.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编程基础相关推荐
- mybatis-plus对datetime返回去掉.0_0欧姆电阻只能当导线用?12种用法来学习下
1.在电路中没有任何功能,只是在PCB上为了调试方便或兼容设计等原因. 2.可以做跳线用,如果某段线路不用,直接不贴该电阻即可(不影响外观) 3.在匹配电路参数不确定的时候,以0欧姆代替,实际调试的时 ...
- mybatis-plus对datetime返回去掉.0_0欧姆电阻到底有没有用?这12个作用说明其不可或缺...
1.在电路中没有任何功能,只是在PCB上为了调试方便或兼容设计等原因. 2.可以做跳线用,如果某段线路不用,直接不贴该电阻即可(不影响外观) 3.在匹配电路参数不确定的时候,以0欧姆代替,实际调试的时 ...
- 华为 HCIA-Cloud Computing V4.0(基础知识)
HCIA-Cloud Computing V4.01.云计算简介1.1 初始云计算及云计算的优势云计算的优势:1.2云计算的定义.发展史和分类云计算服务模式2.计算虚拟化简介2.1 计算虚拟化介绍 什 ...
- 华为AI认证_图像处理实验(图像预处理)
实验一:灰度变化 代码: import cv2 import numpy as npdef liner_trans(org,k,b=0):"""灰度变化:param im ...
- internetreadfile读取数据长度为0_【完结】TensorFlow2.0 快速上手手册
大家好,这是专栏<TensorFlow2.0>的第五篇文章,我们对专栏<TensorFlow2.0>进行一个总结. 我们知道全新的TensorFlow2.0 Alpha已经于2 ...
- 给定一个字符串s,返回去掉子串mi后的字符串。
2019独角兽企业重金招聘Python工程师标准>>> 给定一个字符串s,返回去掉子串"mi"后的字符串.(注:删除n个mi后,仍包含mi应一同删除,如ammim ...
- python 时间格式 工作日_python使用time、datetime返回工作日列表实例代码
最近在学习python,动手做了一个自动填写日报的小工具:由于请求中包含时间,格式如:2016-08-04:所以就了解了一下python的时间日期相关函数:这里做简单记录. 函数功能非常简单:获取当月 ...
- mybatis添加记录时返回主键id
参考:mybatis添加记录时返回主键id 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作. 在使用mybatis作为ORM组件时,可以很方便地达到这 ...
- mybatis插入数据后返回自增主键ID详解
1.场景介绍: 开发过程中我们经常性的会用到许多的中间表,用于数据之间的对应和关联.这个时候我们关联最多的就是ID,我们在一张表中插入数据后级联增加到关联表中.我们熟知的mybatis在插入数据后 ...
最新文章
- flash h5录音_博乐h5网站建设案例-AI优网络
- php中查询结果展示
- python绘制条形图用什么函数_Python绘制正余弦函数图像完整代码
- mongodb不等于某个值_MongoDb进阶实践之四 MongoDB查询命令详述
- volatile的学习总结
- 终端、虚拟控制台与伪终端
- php 百度云 上传,求个PHP版百度云BOS上传文件的dome
- VMware安装VMwaretools
- /usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory 报错解决
- solr6.6+jetty+centos+mysql
- 【华为云技术分享】大数据容器化,头部玩家尝到了甜头
- 使用ubuntu的新立德下载和安装的Eclipse无法在其help菜单中连接并安装ADT
- 对PV操作问题的理解综合
- 微服务领域是不是要变天了?Spring Cloud Alibaba正式入驻Spring Cloud官方孵化器!...
- linux用openssl制作自签名数字证书
- 2020年最全易语言安装与配置使用教程
- dorado 7 注意总结
- wps如何设置分段页眉
- 小白量化《穿云箭集群量化》(1)小白草根超级量化软件介绍
- TE TM TEM模的区别