1. 深度学习框架
① 主流框架:封装了优化器和反向传播算法等
Google的Tensorflow、Facebook的Pytorch、华为的MindSpore、Caffe、theano、MXNet、CNTK
② Pytorch的特点:Python优先:保证代码基本跟原生的python实现一致
动态神经网络:Pytorch的程序可以在执行时动态构建/调整计算图
易于Debug:运行时可以生成动态图,开发者可以在调试器中停掉解释器并查看某个节点的输出
Pytorch提供了支持 CPU和 GPU的Tensor,加速计算
Tensorflow1.x的弊端:静态计算图(调试困难,API混乱)
TensorFlow1.0里在创建了Tensor之后,不能直接返回结果。而是需要创建session会话机制
,包含graph的概念在里面,而且需要session.run才能运行。
Tensorflow2.x的优点:Keras高级接口、去掉了graph和session机制、标准化了API、动态图机制:Eager execution
多语言、多平台:Python、C++、go、java; 从手机到计算机集群都能生成你的训练模型
分布式、运算性能强:多进程,不同服务器并行运算;在谷歌的AI芯片TPU上运行性能是最好的
2. TensorFlow2基础理论
① 张量(tensor):一个多维的数组;常量:储存超参数;变量:存储权重和矩阵
② 常量创建方式:
const_a = tf.constant([[1,2,3,4]],shape=[2,2],dtype=tf.float32) # 创建常量tensor浮点型2x2矩阵
a.numpy() --> [[1. 2.] [3. 4.]] # 常量数值读取
zeros_b = tf.zeros(shape=[2, 3], dtype-tf.int32) # 创建2x3矩阵,元素值均为0
zeros_like_c = tf.zeros_like(const_a) # 全零矩阵和张量const_a的形状是一样的
fill_d = tf.fil1([3,3],8) # 用一个具体值充满张量
random_e = tf.random.normal([5,5],mean=0,stddev=1.0) # 创建正态分布的张量,均值为0,标准差为1
list_f =[1,2,3,4,5,6]
tensor_f = tf.convert_to_tensor(list_f,dtype=tf.float32) # 转化为张量类型,变成6维向量
③ 变量的创建方式:
var_1 = tf.Variable(tf.ones([2,3])) # 创建变量,只需提供初始值
var_1.read_value()
tf.Tensor([[1. 1. 1.][1. 1. 1.]],shape=(2,3),dtype=float32) # 变量数值读取
var_1.assign_add(tf.ones([2,3])) # 变量加法,每个数字加1
④ 张量的切片与索引:
索引:
tensor_h= tf.random.normal([4,100,100,3]) # 包含4张图片,每张图片大小100*100*3
tensor_h[0][20][40][1] # 取出第一张图片第二个通道中在[20,40]位置的像素点
tf.Tensor: shape=o, dtype=float32,numpy=-1.8221084> # CPU:MHWC 样本数量 高 宽 维度; GPU(CUDA):NCHW
indices = [0,1,3] tf.gather(tensor_h,axis=O,indices=indices) # 取出tensor_h([4,100,100,3])中的第1,2,4张图像。
indices =[[0,1,1,0],[1,2,2,0]] # 取出tensot_h([4,100,100,3])中,
tf.gather_nd(tensor_h,indices=indices) # 第一张图像第一个维度[1,1]的像素点;第二张图片第一像素点[2,2]的像素点
切片:
tensor_h[0, :, :, :] # 取出第一张图片
tensor_hl[: : 2, ...] # 每两张图片取出一张的切片
tensor_hl[: : -1] # 倒序切片
[start: end] # 从tensor的开始位置到结束位置的数据切片;
[start :end :step]或者[::step] # 从tensor的开始位置到结束位置每隔step的数据切片
[::-1] # 负数表示倒序切片
‘...’ # 任意长
⑤ 张量的维度变化
# 查看维度常用的三种方式
const_d_1.shape (2,2)
const_d_1.get_shape() (2,2)
tf.shape(const_d_1) tf.Tensor([2 2],shape=(2,),dtype=int32) # 输出为张量类型对象
# 维度重组
reshape_l = tf.constant([[1,2,3],[4,5,6]])
tf.reshape(reshape_1,(3,2)) # 将2*3重组为3*2
# 维度增加(在cpu中的NHWC数据格式)
expand_sample_1.shape # 原始数据尺寸:(100,100,3)
tf.expand_dims(expand_sample_1,axis=0).shape) # 在第一个维度前增加:(1,100,100,3)
tf.expand_dims(expand_sample_l,axis=1).shape) # 在第二个维度前增加:(100,1,100,3)
,tf.expand_dims(expand_sample_l, axis=-1).shape) # 在最后一个维度后增加:(100,100,3,1)
# 维度减少(数据可视化用matplotlib、opencv)
squeeze_sample_1.shape # 原始数据尺寸:(1,100,100,3)
t