导图社区 AI学习计划
清晰易懂得AI基本知识介绍,包括模型、loss、optimazition、model、layerdnn、cnn、rnn、lstn原理及公式推导,值得大家收藏学习哦!
编辑于2021-07-22 09:13:41AI学习计划
7.16
输出学习文档
tensorflow基本概念
tensor、variable等
1.形状shape、类型dtype、值numpy()2.zero_vector = tf.zeros(shape=(2), dtype=tf.int32)3.print(A.shape)、print(A.dtype)、print(A.numpy()) 4.x = tf.Variable(initial_value=3.) #tf.Variable() 声明, initial_value 参数指定初始值
变量与普通张量的一个重要区别是其默认能够被 TensorFlow 的自动求导机制所求导,因此往往被用于定义机器学习模型的参数。
operation
1. tf.add(A, B) # 计算矩阵A和B的和2. tf.matmul(A, B) # 计算矩阵A和B的乘积3.偏导数 X = tf.constant([[1., 2.], [3., 4.]]) y = tf.constant([[1.], [2.]]) w = tf.Variable(initial_value=[[1.], [2.]]) b = tf.Variable(initial_value=1.) # 在 tf.GradientTape() 的上下文内用于求导 with tf.GradientTape() as tape: L = tf.reduce_sum(tf.square(tf.matmul(X, w) + b - y)) # 计算L(w, b)关于w, b的偏导数 w_grad, b_grad = tape.gradient(L, [w, b])
tf.square() 操作代表对输入张量的每一个元素求平方,不改变张量形状。 tf.reduce_sum() 操作代表对输入张量的所有元素求和,输出一个形状为空的纯量张量(可以通过 axis 参数来指定求和的维度,不指定则默认对所有元素求和)
优化器 keras.optimizers
SGD
SGDM
Adagrad
AdaDelta / RMSProp
Adam
Nadam
#声明了一个梯度下降优化器 (Optimizer),其学习率为 5e-4 optimizer = tf.keras.optimizers.SGD(learning_rate=5e-4)#TensorFlow自动根据梯度更新参数 optimizer.apply_gradients(grads_and_vars=zip(grads, variables))ex:X = tf.constant(X)y = tf.constant(y)a = tf.Variable(initial_value=0.)b = tf.Variable(initial_value=0.)variables = [a, b]num_epoch = 10000optimizer = tf.keras.optimizers.SGD(learning_rate=5e-4)for e in range(num_epoch): with tf.GradientTape() as tape: y_pred = a * X + b loss = tf.reduce_sum(tf.square(y_pred - y)) grads = tape.gradient(loss, variables) optimizer.apply_gradients(grads_and_vars=zip(grads, variables))#更新模型参数的方法 optimizer.apply_gradients() 需要提供参数 grads_and_vars,#即待更新的变量(如上述代码中的 variables )及损失函数关于这些变量的偏导数(如上述代码中的 grads )。#使用 Python 的 zip() 函数将 grads = [grad_a, grad_b] 和 variables = [a, b] 拼装在一起
激活函数 tf.nn
给网络赋予了非线性,从而使得神经网络能够拟合任意复杂的函数
sigmoid
将实数压缩到0到1之间,一般只在二分类的最后输出层使用。主要缺陷为存在梯度消失问题,计算复杂度高,输出不以0为中心
softmax
sigmoid的多分类扩展,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类
tanh
将实数压缩到-1到1之间,输出期望为0。主要缺陷为存在梯度消失问题计算复杂度高
relu
修正线性单元,最流行的激活函数。一般隐藏层使用。主要缺陷是:输出不以0为中心,输入小于0时存在梯度消失问题(死亡relu)
leaky_relu
对修正线性单元的改进,解决了死亡relu问题
elu
指数线性单元。对relu的改进,能够缓解死亡relu问题。
selu
扩展型指数线性单元。在权重用tf.keras.initializers.lecun_normal初始化前提下能够对神经网络进行自归一化。不可能出现梯度爆炸或者梯度消失问题。需要和Dropout的变种AlphaDropout一起使用
swish
自门控激活函数。谷歌出品,相关研究指出用swish替代relu将获得轻微效果提升
在keras模型中使用激活函数一般有两种方式,一种是作为某些层的activation参数指定,另一种是显式添加layers.Activation激活层ex:import numpy as npimport pandas as pdimport tensorflow as tffrom tensorflow.keras import layers,modelstf.keras.backend.clear_session()model = models.Sequential()#通过activation参数指定model.add(layers.Dense(32,input_shape = (None,16),activation = tf.nn.relu)) model.add(layers.Dense(10))# 显式添加layers.Activation激活层model.add(layers.Activation(tf.nn.softmax)) model.summary()
量化
ann
感知机
bnn
dnn
DNN前向传播算法
DNN的前向传播算法也就是利用我们的若干个权重系数矩阵W,偏倚向量b来和输入值向量x进行一系列线性运算和激活运算,从输入层开始,一层层的向后计算,一直到运算到输出层,得到输出结果为值。
DNN反向传播算法
BP算法的学习过程由正向传播过程和反向传播过程组成。在正向传播过程中,输入信息通过输入层经隐含层,逐层处理并传向输出层。如果在输出层得不到期望的输出值,则取输出与期望的误差的平方和作为目标函数,转入反向传播,逐层求出目标函数对各神经元权值的偏导数,构成目标函数对权值向量的梯量,作为修改权值的依据,网络的学习在权值修改过程中完成。误差达到所期望值时,网络学习结束
import tensorflow as tfmnist = tf.keras.datasets.mnist(x_train, y_train), (x_test, y_test) = mnist.load_data()x_train, x_test = x_train / 255.0, x_test / 255.0model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(100, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax')])model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])model.fit(x_train, y_train, epochs=5)model.evaluate(x_test, y_test, verbose=2)
cnn
rnn
keras
模型 tf.keras.Model
模型则将各种层进行组织和连接,并封装成一个整体,描述了如何将输入数据通过各种层以及运算而得到输出相关概念: 模型的构建: tf.keras.Model 和 tf.keras.layers 模型的损失函数: tf.keras.losses 模型的优化器: tf.keras.optimizer 模型的评估: tf.keras.metrics
层 tf.keras.layers
全链接:tf.keras.layers.Dense
Fully-connected Layer是 Keras 中最基础和常用的层之一,对输入矩阵 A 进行 f(AW + b) 的线性变换 + 激活函数操作。如果不指定激活函数,即是纯粹的线性变换 AW + b。主要参数如下: units :输出张量的维度; activation :激活函数,对应于 f(AW + b) 中的 f ,默认为无激活函数( a(x) = x )。常用的激活函数包括 tf.nn.relu 、 tf.nn.tanh 和 tf.nn.sigmoid ; use_bias :是否加入偏置向量 bias ,即 f(AW + b) 中的 b。默认为 True ; kernel_initializer 、 bias_initializer :权重矩阵 kernel 和偏置向量 bias 两个变量的初始化器。默认为 tf.glorot_uniform_initializer 1 。设置为 tf.zeros_initializer 表示将两个变量均初始化为全 0;
池化
卷积
Dropout
在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征
损失函数losses
mean_squared_error
mean_absolute_error
mean_absolute_percentage_error
Huber
binary_crossentropy
categorical_crossentropy
sparse_categorical_crossentropy
hinge
kld
cosine_similarity
损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的模型用的损失函数一般也不一样。
评估指标metrics
numpy基本用法
7.22
输出学习文档及demo代码
了解rnn
当前面的输入和后面的输入是相关得,dnn无法处理(只能单独的取处理一个个的输入,前一个输入和后一个输入不相关。)
rnn框架概念
Recurrent Neural Network
多层rnn概念
双向rnn
完形填空,机器翻译等
t+1时刻,获取了t和t+2时刻得信息
lstm
rnn的一种:三个gate;input gate:output gate:memory cell gate:有了memory cell的forget gate,memory cell的值不一定在每次来input的时候都会更新,所以多了long的修饰;
t时刻:z:输入|zi\z0\zf:gate的输入gate激活函数选择sigmoid:gate的打开程度,0是关闭,1是全开1.z输入,通过activation func得到gz2.同样fzi,fz0,fzf3.c:t-1时刻,memory中存储值3.对于momery中的值处理,如果input gate打开(input gate=1),则memory中值肯定刷新,刷新后的值是input决定还是input和c共同决定,由forget gate来决定,forget gate=1则共同决定,=0则遗忘t-1时刻的值如果input gate关闭,则memory值由forget gate单独决定,=1保留留t-1时刻值,=0则复位为04.当input gate打开时,forget gate关闭,则是普通得dnn模型; forget gate打开,则out put受当前input和memory存得t-1时刻值影响,为rnn模型
ex:只展示t0时刻输入输出得值;activation选择sigmoid
rnn lstn主要不同,lstn解决长序列训练过程中的梯度消失和梯度爆炸问题(即远距离传递导致的信息丢失问题)。
RNN的梯度弥散与爆炸
根据BPTT推导结果:如果W的最大特征值小于1,则公式(18)和(19)的左边将以指数形式下降,造成梯度消失问题;类似的,如果W的最大特征值大于1,则公式(18)和(19)的左边将以指数形式上升,造成梯度爆炸问题。其实如果把W看作一个标量,如果这个标量小于1,则它的指数次方肯定就非常小了,导致左边出现梯度消失;类似的,如果这个标量大于1,则它的指数次方就非常大,导致左边梯度爆炸。
梯度弥散
导致在序列长度很长时,无法在较后的时间步中,按照梯度更新较前时间步的 w,导致无法根据后续序列来修改前向序列的参数,使得前向序列无法很好地做特征提取,使得在长时间步过后,模型将无法再获取有效的前向序列记忆信息。
概要
梯度爆炸
掌握如何训练rnn
BPTT
了解rnn工作原理
7.26
输出学习文档及demo代码
了解tflite
了解并尝试转换 dnn, rnn 到 tflite 和 tflite for mcu
7.31
输出学习文档及demo代码
了解onnx
开放神经网络交换(Open Neural Network Exchange),微软和Facebook提出用来表示深度学习模型的开放格式。使用何种训练框架训练模型(比如TensorFlow/Pytorch/OneFlow/Paddle),在训练完毕后你都可以将这些框架的模型统一转换为ONNX这种统一的格式进行存储。注意ONNX文件不仅仅存储了神经网络模型的权重,同时也存储了模型的结构信息以及网络中每一层的输入输出和一些其它的辅助信息。将Pytorch或者TensorFlow模型转化为ONNX模型(ONNX模型一般用于中间部署阶段),然后再拿转化后的ONNX模型进而转化为我们使用不同框架部署需要的类型。典型的几个线路: Pytorch -> ONNX -> TensorRT Pytorch -> ONNX -> TVM TF – onnx – ncnn
尝试转换onnx到tflite