当前位置: 首页 > news >正文

网站前端做报名框代码北京网站优化培训

网站前端做报名框代码,北京网站优化培训,惠州网站外包,做网站如何被收录文章目录 使用Tensorflow解决XOR问题激活函数正向传播和反向传播解决过拟合权重正则化Dropout正则化批量正则化 BatchNormal权重初始化残差连接 选择优化算法传统梯度更新算法动量算法NAG算法AdaGrad算法RMSProp算法Adam算法如何选择优化算法 使用tf.keras构建神经网络使用Sequ… 文章目录 使用Tensorflow解决XOR问题激活函数正向传播和反向传播解决过拟合权重正则化Dropout正则化批量正则化 BatchNormal权重初始化残差连接 选择优化算法传统梯度更新算法动量算法NAG算法AdaGrad算法RMSProp算法Adam算法如何选择优化算法 使用tf.keras构建神经网络使用Sequential按层顺序构建模型构建函数式模型构建子类模型Fashion-MNIST 分类任务实战 万能近似定理(Universal Approximation theorem)是神经网络的重要理论其说明了多层网络在足够多的神经元的情况下是可以拟合任何函数的。Understanding the Universal Approximation Theorem – Towards AI 单层神经网络构造很简单 y ^ f ( W X ) \hat{y}f(WX) y^​f(WX) 单层神经网络在分类问题中对线性可分或者近似线性可分的数据有很好的效果对线性不可分数据则效果不理想Minsky 在1969年出版的 perceptron 书中详细的用数学理论证明了单层神经网络无法解决XOR分类问题。 多层神经网络的构造开始复杂起来了 y ^ f 2 ( W 2 f 1 ( W 1 X ) ) \hat{y}f_2(W_2f_1(W_1X)) y^​f2​(W2​f1​(W1​X)) 由于先经过了一次激活函数在隐藏层的结果是非线性的对非线性函数再进行激活其得到的函数构造就会很复杂。 使用Tensorflow解决XOR问题 其中 X O R O R − A N D XOROR - AND XOROR−AND该问题主要是利用 X 1 X_1 X1​ X 2 X_2 X2​去推测 X O R XOR XOR X 1 X_1 X1​ X 2 X_2 X2​ANDORXOR00000010111001111110训练代码如下 import tensorflow as tf import pandas as pd import matplotlib.pyplot as plt %matplotlib widgettf.random.set_seed(30)X tf.constant([[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]]) y tf.constant([0,1,1,0], dtypetf.float32)class CustomModel(tf.keras.Model):def __init__(self):super(CustomModel, self).__init__()self.dense_1 tf.keras.layers.Dense(2, activationrelu)self.dense_2 tf.keras.layers.Dense(1)def call(self, x):x self.dense_1(x)# x self.dense_2(x)x self.dense_2(x)return xmodel CustomModel() model.compile(losstf.keras.losses.mse,optimizertf.keras.optimizers.Adam(learning_rate0.01) )history model.fit(X, y, epochs1000) pd.DataFrame(history.history).plot()由于初始化参数随机设置以及 relu 导致的神经元死亡问题这里得到的结果不一定稳定如果需要稳定输出可以把relu改成leaky_relu这样神经元死亡不了 利用matplotlib画图代码如下 x_ tf.linspace(0,1,50) y_ tf.linspace(0,1,50)X_, Y_ tf.meshgrid(x_,y_)temp tf.transpose(tf.concat([tf.reshape(X_, [1,-1]), tf.reshape(Y_, [1,-1])], axis0), [1, 0])Z tf.reshape(model(temp), [50,50])fig plt.figure() ax plt.axes(projection3d) ax.plot_surface(X_,Y_,Z) plt.show()可以发现relu类似于把纸张对折了 激活函数 激活函数是神经网络的核心利用激活函数可以把线性函数修正为非线性函数拟合结果神经网络的激活函数要满足下面三个条件 非线性为提高模型的学习能力如果是线性的无论层多深都只相当于单层神经网络可微性在一些点可导单调性保证模型简单 激活函数一般存储在tf.nn或者tf.keras.activations下 常用的激活函数 sigmoid f ( x ) 1 1 e − x f(x) \frac{1}{1e^{-x}} f(x)1e−x1​ 优点可以把输出映射在0-1区间内 可以表示概率或者输入的归一化单调连续适用于输出层求导容易 缺点具有软饱和性一旦数据落入饱和区一阶导数变得接近于0会导致梯度消失 softmax σ i ( z ) e z i ∑ e z j \sigma_i(z)\frac{e^{z_i}}{\sum e^{z_j}} σi​(z)∑ezj​ezi​​ 优点可以处理多分类问题将数值变成概率 缺点计算量比较大 tanh f ( x ) e x − e − x e x e − x f(x)\frac{e^x - e^{-x}}{e^x e^{-x}} f(x)exe−xex−e−x​ 优点相较于sigmoid其输出区间为[-1, 1]同时其斜率更为陡峭收敛要快于sigmoid 缺点和sigmoid一样具有软饱和性会导致梯度消失 ReLU f ( x ) { 0 x 0 x x ≥ 0 \begin{align} f(x) \begin{cases} 0 \quad x0 \\ x \quad x\geq0 \end{cases} \end{align} f(x){0x​x0x≥0​​​ ReLU能够在 x 0 x0 x0的时候梯度不发生衰减可以有效的解决梯度消失问题其选择性的让输入掉入硬饱和区导致权重无法更新这种现象叫做“神经元死亡” 优点计算简单 缺点当大批量输入掉入硬饱和区域会出现loss不更新现象 Leaky-ReLU f ( x ) { a x x 0 x x ≥ 0 \begin{align} f(x) \begin{cases} ax \quad x0 \\ x \quad x\geq0 \end{cases} \end{align} f(x){axx​x0x≥0​​​ 如其名字所言在 x 0 x0 x0区域进行倾斜这里 α \alpha α 一般设置为0.5 优点解决硬饱和问题 缺点不对称问题会导致拟合函数出现不光滑现象 softplus f ( x ) l o g ( 1 e x ) f(x)log(1e^x) f(x)log(1ex) 优点非常平滑 缺点计算量太大容易越界 正向传播和反向传播 正向传播是从输入到输出的过程而反向传播是从输出到输入的过程其中反向传播是利用链式法则求导的过程不知道为啥叫算法没什么高级的 解决过拟合 在深度学习中随着网络层数的增多一般会出现以下几个问题 增加计算资源的消耗通过GPU和分布式处理解决模型容易出现过拟合多采集数据使用正则化方式有效避免或者缓解出现梯度消失或者梯度爆炸选择合适的激活函数批量正则化BN信息丢失残差连接 权重正则化 权重正则化采取的方法是对权重添加一个惩罚系数后加入到损失之中最常见的方式是利用范数的方式 L l ∣ ∣ w ∣ ∣ l ∑ ∣ w i ∣ l l L_l||w||_l\sqrt[l]{\sum|w_i|^l} Ll​∣∣w∣∣l​l∑∣wi​∣l ​ 使用权重正则化最常见的例子就是Lasso回归( L 1 L_1 L1​)和Ridge回归( L 2 L_2 L2​)当然还有Elastic回归( L 1 L_1 L1​, L 2 L_2 L2​) L 1 L_1 L1​和 L 2 L_2 L2​的区别 L1减少的是一个常量L2减少的是权重的固定比例L1使权重稀疏L2使权重平滑L1优点是能够获得sparse模型对于large-scale的问题来说这一点很重要因为可以减少存储空间L2优点是实现简单能够起到正则化的作用。缺点就是L1的优点无法获得sparse模型 Dropout正则化 Dropout是2014年论文Dropout: a simple way to prevent neural networks from overfitting提出的一种方法其通过在每次训练的时候随机丢掉一部分神经元的方式来训练模型这样输入的特征都可能被丢掉所以模型不会依赖于任何一个输入特征也就是说不会给任何一个神经元过大的权重网络模型对神经元特定的权重不会那么敏感反过来提升了模型的泛化能力不容易过拟合 在测试模型的时候会等比例缩小模型的权重以适应丢掉的神经元带来的放大效果即乘以 Dropout rate 在什么情况下使用Dropout 通常 Dropout rate 控制在20%-50%比较好太低起不到效果太高会导致模型欠拟合在大的网络模型上应用当Dropout用在较大的模型时更有可能提升效果应为此时模型有更多的机会学习到多种独立表征在输入层和隐藏层都使用Dropout对于不同的层设置的Dropout rate不同一般来说对神经元较少的层会将Dropout rate设置为0或者接近于0的数对于神经元多的层会将Dropout rate设置得较大如0.5或者更大增加学习率和冲量把学习率扩大10-100倍冲量调高的0.9-0.99限制网络模型的权重大的学习速率往往导致比较大的权重值对网络的权重值做最大范数的正则化被证明可以提升模型性能 批量正则化 BatchNormal 数据归一化数据标准化都是对输入数据而言的在实际训练中由于神经元的权重计算仍然会出现隐藏层各个神经元的数值分布不均匀导致梯度消失或者不起作用的情况。例如如果数据分布在两侧采用sigmoid或者tanh激活时两侧的导数近似于0这就会导致梯度消失的情况。 BatchNormal通过修改Batch数据的均值和方差来解决由于数据不均匀导致梯度消失这一问题可以让调试超参数更加简单在提高训练模型效率的同时让神经网络模型泛化能力更高 首先计算Batch数据的均值和方差 μ 1 m ∑ x i σ 2 1 m ∑ ( x i − μ ) 2 \mu \frac{1}{m}\sum x_i \quad \sigma^2 \frac{1}{m}\sum (x_i-\mu)^2 μm1​∑xi​σ2m1​∑(xi​−μ)2 再对Batch数据进行放缩 x ^ i x i − μ σ 2 ϵ \hat{x}_i\frac{x_i-\mu}{\sqrt{\sigma^2 \epsilon}} x^i​σ2ϵ ​xi​−μ​ 最后对Batch数据进行反标准化 y i γ x ^ i β NB γ , β ( x i ) y_i\gamma \hat{x}_i \beta\text{NB}_{\gamma,\beta}(x_i) yi​γx^i​βNBγ,β​(xi​) 这里 ϵ \epsilon ϵ 是自定义的一个很小的值 γ \gamma γ 和 β \beta β 类似于权重参数是可以学习的也就是说一个BatchNormal层是有两个学习权重的 BN作用在非线性映射前也就是激活函数前面一般在神经网络训练中遇到收敛速度很慢或梯度爆炸等无法训练的情况时使用在一般情况下也可以使用BN来加快模型训练速度提高模型精度进而提高训练模型的效率BN的具体功能如下 可以使用比较大的学习率让训练速度加倍因为这个算法收敛很快不用再去理会过拟合中的DropoutL2正则化项参数的选择问题采用BN后可以移除这两项正则化方法或者使用更小参数的L2正则约束参数不需要使用局部响应归一化层LRN(这个层基本弃用了)可以把训练速度彻底打乱 权重初始化 不同的初始值会导致模型收敛到不同的极值点这里的XOR问题应该已经说明了问题常见的模型权重初始化有零值初始化随机初始化均匀分布初始化正态分布初始化正交分布初始化等等一般来说采用正态分布或者均匀分布的初始值经过实践证明这能带来更好的效果 残差连接 残差连接的思想很简单 F ( x ) f ( x ) x F(x) f(x)x F(x)f(x)x 从信息论的角度来看由于数据处理不等式的存在在正向传播的过程中由于层数的加深每一层所包含的信息准层减少而残差连接保证了后一层是前一层的信息加上处理后的信息 选择优化算法 传统梯度更新算法 传统梯度更新算法的基本思想是设定一个学习率 λ \lambda λ参数沿梯度反向移动 θ ← θ − λ g \theta \leftarrow \theta - \lambda g θ←θ−λg 优点算法简洁当学习率设置恰当时可以收敛到全局最优点 缺点对超参数学习率过于敏感过小导致收敛速度过慢过大将越过极值点由于学习率不发生变化容易卡在鞍点在平坦区域由于梯度接近于0容易提前结束迭代 动量算法 顾名思义利用上一次计算到的梯度加权结合本次计算到的梯度 用公式表述过程如下 v t a v t − 1 − λ g t θ t 1 ← θ t v t v_t av_{t-1}-\lambda g_t \quad \theta_{t1} \leftarrow \theta_t v_t vt​avt−1​−λgt​θt1​←θt​vt​ 动量有一个明显的优点是可以冲 假设每个点的梯度相似根据等比数列可以得到 v k λ g 1 − a v_k\frac{\lambda g}{1-a} vk​1−aλg​ 当 a a a 等于0.50.9时其速度是梯度下降法的2倍和10倍 NAG算法 NAG和动量的区别在于NAG计算两次梯度一次超前梯度一次原来梯度将两次梯度合并 NAG 是 动量算法 的一种改进算法可以防止大幅震荡不会错过最小值对参数更新更为敏感 AdaGrad算法 AdaGrad 算法 是自适应算法可以从梯度方向及学习率两个维度进行优化 其计算方法为 r ← r g ^ ⊙ g ^ Δ θ ← − λ δ r ⊙ g ^ θ ← θ Δ θ r \leftarrow r \hat{g} \odot \hat{g} \quad\quad \Delta \theta \leftarrow -\frac{\lambda}{\delta \sqrt{r}} \odot \hat{g} \quad\quad \theta \leftarrow \theta \Delta \theta r←rg^​⊙g^​Δθ←−δr ​λ​⊙g^​θ←θΔθ 随着训练步数的增长 r r r 的值越来越大AdaGrad 算法的学习率会越来越小这样就不容易错过极值点这里的 δ \delta δ 一般取一个较小的值如 1 0 − 7 10^{-7} 10−7该参数避免分母为0 RMSProp算法 RMSProp算法 也是 自适应算法 在AdaGrad算法的基础上做了修改可以使优化器在非凸背景下效果更好RMSProp采用指数加权的移动平均代替梯度平方和 其计算方法为 r ← ρ r ( 1 − ρ ) g ^ ⊙ g ^ Δ θ ← − λ δ r ⊙ g ^ θ ← θ Δ θ r \leftarrow \rho r (1-\rho) \hat{g} \odot \hat{g} \quad\quad \Delta \theta \leftarrow -\frac{\lambda}{\delta \sqrt{r}} \odot \hat{g} \quad\quad \theta \leftarrow \theta \Delta \theta r←ρr(1−ρ)g^​⊙g^​Δθ←−δr ​λ​⊙g^​θ←θΔθ 由于 ρ \rho ρ 的限制 r r r 有衰减项不会无限增长但是RMSProp相较于AdaGrad多了一个 ρ \rho ρ这里的 δ \delta δ 一般取一个较小的值如 1 0 − 7 10^{-7} 10−7该参数避免分母为0 Adam算法 Adam(Adaptive Moment Estimation) 算法 又叫自适应矩估计算法其本质是带有动量项的RMSProp利用梯度的一阶矩估计和二阶矩估计来调整学习率 矩估计计算如下 s ← ρ 1 s ( 1 − ρ 1 ) g ^ r ← ρ 2 r ( 1 − ρ 2 ) g ^ ⊙ g ^ s \leftarrow \rho_1s(1-\rho_1)\hat{g} \quad r \leftarrow \rho_2r(1-\rho_2)\hat{g} \odot \hat{g} \quad s←ρ1​s(1−ρ1​)g^​r←ρ2​r(1−ρ2​)g^​⊙g^​ 修正矩估计这里 t t t 是指时间步第 t t t 次梯度更新 s ^ s 1 − ρ 1 t r ^ r 1 − ρ 2 t \hat{s} \frac{s}{1-\rho_1^t} \quad \hat{r} \frac{r}{1-\rho_2^t} s^1−ρ1t​s​r^1−ρ2t​r​ 更新梯度 r ← ρ r ( 1 − ρ ) g ^ ⊙ g ^ Δ θ ← − λ s ^ δ r ^ θ ← θ Δ θ r \leftarrow \rho r (1-\rho) \hat{g} \odot \hat{g} \quad\quad \Delta \theta \leftarrow -\lambda \frac{\hat{s}}{\delta \sqrt{\hat{r}}} \quad\quad \theta \leftarrow \theta \Delta \theta r←ρr(1−ρ)g^​⊙g^​Δθ←−λδr^ ​s^​θ←θΔθ 这里需要给的超参数有学习率 λ \lambda λ ρ 1 \rho_1 ρ1​ ρ 2 \rho_2 ρ2​ ρ \rho ρ初始化后 s s s r r r t t t 都等于0 这里的 δ \delta δ 一般取一个较小的值如 1 0 − 7 10^{-7} 10−7该参数避免分母为0 如何选择优化算法 综合考虑算法早期阶段SGD对参数的调整和初始化非常敏感经验算法先使用Adam优化算法进行训练既能大幅节省时间又能避免初始化和参数调整问题用Adam算法调整好后再使用SGD动量优化算法以达到最佳性能 使用tf.keras构建神经网络 Keras 是一个主要由 Python 语言开发的开源神经网络计算库最初由 François Chollet 编写它被设计为高度模块化和易扩展的高层神经网络接口使得用户可以不需要过多的专业知识就可以简洁、快速地完成模型的搭建与训练。Keras 库分为前端和后端其中后端可以基于现有的深度学习架构实现如TensorFlow、Theano、CNTK等。 TensorFlow 与 Keras 存在既竞争又合作的关系甚至连 Keras 创始人都在Google 工作。早在2015年11月TensorFlow被加入Keras后端支持。从2017年开始Keras的大部分组件被整合到TensorFlow架构中。在2019年6月发布TensorFlow 2版本时Keras 被指定为TensorFlow官方高级 API用于快速简单的模型设计和训练。现在只能使用 Keras的接口来完成TensorFlow层方式的模型搭建与训练。在TensorFlow中Keras被实现在tf.keras模块中。下文如无特别说明Keras均指代tf.keras实现而不是以往的 Keras实现。 主要模块功能概述activations内置的激活函数applications预先训练权重的罐装架构Keras应用程序Callbacks在模型训练期间的某些时刻被调用的实用程序Constraints约束模块对权重施加约束的函数datasetstf.keras数据集模块包括boston_housingcifar10fashion_mnistimdb mnistreutersestimatorKeras估计量APIinitializers初始序列化/反序列化模块layersKeras层API包括卷积层、全连接层、池化层、Embedding层等losses内置损失函数metircs内置度量函数mixed_precision混合精度模块models模型克隆的代码以及与模型相关的APIoptimizers内置的优化器模块preprocessingKeras数据的预处理模块regularizers内置的正则模块 使用Sequential按层顺序构建模型 import tensorflow as tf from tensorflow import keras from tensorflow.keras import layersmodel tf.keras.Sequential() model.add(layers.Dense(32, activationrelu)) model.add(layers.Dense(32, activationrelu)) model.add(layers.Dense(10, activationsoftmax)) model.compile(optimizertf.keras.optimizers.Adam(0.001),losstf.keras.losses.categorical_crossentropy,metrics[tf.keras.metrics.categorical_accuracy] )构建函数式模型 import tensorflow as tf from tensorflow import kerasinputs tf.keras.Input(shape(3,)) input keras.layers.Input(shape[], nameinput) hidden1 keras.layers.Dense(60, activationrelu)(input) hidden2 keras.layers.Dense(60, activationrelu)(input) concat keras.layers.concatenate([hidden1, hidden2]) output keras.layers.Dense(1, nameoutput)(concat) model keras.Model(inputs[input], outputs[output])构建子类模型 import tensorflow as tf class MyModel(tf.keras.Model):def __init__(self):super(MyModel, self).__init__()self.dense1 tf.keras.layers.Dense(4, activationtf.nn.relu)self.dense2 tf.keras.layers.Dense(5, activationtf.nn.softmax)def call(self, inputs):x self.dense1(inputs)return self.dense2(x) model MyModel()Fashion-MNIST 分类任务实战 Fashion-MNIST 是一个图片分类任务其输入是一张张图片而输出是0-9个类别 导入数据并进行数据预处理 import tensorflow as tf(x_train, y_train), (x_test, y_test) tf.keras.datasets.fashion_mnist.load_data() (x_train, y_train), (x_test, y_test) (x_train/255.0, y_train), (x_test/255.0, y_test) # x_train.shape, y_train.shape, x_test.shape, y_test.shape # ((60000, 28, 28), (60000,), (10000, 28, 28), (10000,))构建模型这里使用class的方式构建 class CustomModel(tf.keras.Model):def __init__(self):super(CustomModel, self).__init__()self.flatten tf.keras.layers.Flatten()self.dense_1 tf.keras.layers.Dense(512, activationrelu)self.dense_2 tf.keras.layers.Dense(128, activationrelu)self.dense_3 tf.keras.layers.Dense(32, activationrelu)self.dense_4 tf.keras.layers.Dense(10, activationsoftmax)def call(self, x):x self.flatten(x)x self.dense_1(x)x self.dense_2(x)x self.dense_3(x)x self.dense_4(x)return xmodel CustomModel() model.compile(losstf.keras.losses.sparse_categorical_crossentropy,optimizertf.keras.optimizers.Adam(learning_rate0.001),metrics[tf.keras.metrics.sparse_categorical_accuracy] )训练模型并使用tensorboard可视化 def get_logdir():root_logdir os.path.join(os.curdir, my_logs) run_id time.strftime(run_%Y%m%d-%H%M%S)return os.path.join(root_logdir, run_id)logdir get_logdir()tensorboard_cb keras.callbacks.TensorBoard(logdir) history se_model.fit(x_train, y_train, epochs10,callbacks[tensorboard_cb])tensorboard --logdir文件目录 打开tensorboard 最后可以得到分类准确率在90%
http://www.dnsts.com.cn/news/17724.html

相关文章:

  • 做网站需要注意的问题网页制作网站图片
  • 太原晋民网站建设公司在北京网站建设的岗位
  • html5个性个人网站湛江做网站建设
  • 搜索引擎对网站推广的作用交友软件网站建设
  • 外贸做编织袋常用网站公司企业邮箱怎么查询
  • 南宁企业网站设计公司雨花台网站建设
  • 牡丹江市建设局网站搜索引擎优化涉及到内容
  • 网站好友邀请链接生成 php做网站时尺寸多大
  • 本地网站开发环境搭建东莞商场
  • ps做网站对齐技巧无代码快速搭建网站
  • 免费的建站平台网站备案期间可以建站
  • 领地网怎么编辑个人网站做网站对象存储
  • 静态网站更新菜谱设计制作图片
  • 怎么才能搜索到自己做的网站淘宝网首页登录网页版
  • 如何网站做外贸生意网络服务费的资金产出有哪些
  • 上海做网站设计阿里巴巴官网电脑版登录入口
  • 直播网站开发计划书京山大洪山旅游开发有限公司 做网站
  • 创新的福州网站建设项目立项流程图
  • 北京建设商业网站河南省新闻联播视频
  • 哪里可以找人做网站wordpress 女装小说
  • 企业网站优化费用著名食品包装设计的案例
  • 白山北京网站建设中国纪检监察报网评文章
  • seo门户网站建设方案深圳 购物商城网站建设
  • 海南建站中心上海网站建设上海员君
  • 苏州免费模板建站甘肃省seo关键词优化
  • 做网站推广可行吗外贸销售工作内容
  • 网站备案 取名资讯通不过收费下载网站源码
  • 沈阳做网站软件长沙网站开发智
  • 在c盘做网站可以吗wordpress 最新文章展示
  • 湖北网站建设联系电话建设企业网银怎么转账