精华内容
下载资源
问答
  • 1.分两个程序①主函数②function函数 2.main clear; clc; %建立机器人模型 % theta d a alpha offset ML1=Link([0 0 0 0 0 ],'modified'); ML2=Link([0 0...

    1.分两个程序①主函数②function函数
    2.main

    clear;
    clc;
    %建立机器人模型
    %       theta    d           a        alpha     offset
    ML1=Link([0       0           0           0          0     ],'modified'); 
    ML2=Link([0       0           0.180      -pi/2       0     ],'modified');
    ML3=Link([0       0           0.600       0          0     ],'modified');
    ML4=Link([0       0.630       0.130      -pi/2       0     ],'modified');
    ML5=Link([0       0           0           pi/2       0     ],'modified');
    ML6=Link([0       0           0          -pi/2       0     ],'modified');
    modrobot=SerialLink([ML1 ML2 ML3 ML4 ML5 ML6],'name','PUMA 560');
    modt06=modrobot.fkine([0,0,pi/2,0,0,pi/2]) %工具箱正解函数
    modmyt06=myfkine(0,0,pi/2,0,0,pi/2)        %手写的正解函数

    3.function

    function [T06]=myfkine(theta1,theta2,theta3,theta4,theta5,theta6)
    MDH=[theta1   0       0         0;
         theta2   0       0.180    -pi/2;
         theta3   0       0.600     0;
         theta4   0.630   0.130    -pi/2;
         theta5   0       0         pi/2;
         theta6   0       0        -pi/2];
    T01=[cos(MDH(1,1))                 -sin(MDH(1,1))                 0               MDH(1,3);
         cos(MDH(1,4))*sin(MDH(1,1))    cos(MDH(1,4))*cos(MDH(1,1))  -sin(MDH(1,4))  -MDH(1,2)*sin(MDH(1,4));
         sin(MDH(1,4))*sin(MDH(1,1))    sin(MDH(1,4))*cos(MDH(1,1))   cos(MDH(1,4))   MDH(1,2)*cos(MDH(1,4));
         0                              0                             0               1];
    T12=[cos(MDH(2,1))                 -sin(MDH(2,1))                 0               MDH(2,3);
         cos(MDH(2,4))*sin(MDH(2,1))    cos(MDH(2,4))*cos(MDH(2,1))  -sin(MDH(2,4))  -MDH(2,2)*sin(MDH(2,4));
         sin(MDH(2,4))*sin(MDH(2,1))    sin(MDH(2,4))*cos(MDH(2,1))   cos(MDH(2,4))   MDH(2,2)*cos(MDH(2,4));
         0                              0                             0               1];
    T23=[cos(MDH(3,1))                 -sin(MDH(3,1))                 0               MDH(3,3);
         cos(MDH(3,4))*sin(MDH(3,1))    cos(MDH(3,4))*cos(MDH(3,1))  -sin(MDH(3,4))  -MDH(3,2)*sin(MDH(3,4));
         sin(MDH(3,4))*sin(MDH(3,1))    sin(MDH(3,4))*cos(MDH(3,1))   cos(MDH(3,4))   MDH(3,2)*cos(MDH(3,4));
         0                              0                             0               1];
    T34=[cos(MDH(4,1))                 -sin(MDH(4,1))                 0               MDH(4,3);
         cos(MDH(4,4))*sin(MDH(4,1))    cos(MDH(4,4))*cos(MDH(4,1))  -sin(MDH(4,4))  -MDH(4,2)*sin(MDH(4,4));
         sin(MDH(4,4))*sin(MDH(4,1))    sin(MDH(4,4))*cos(MDH(4,1))   cos(MDH(4,4))   MDH(4,2)*cos(MDH(4,4));
         0                              0                             0               1];
    T45=[cos(MDH(5,1))                 -sin(MDH(5,1))                 0               MDH(5,3);
         cos(MDH(5,4))*sin(MDH(5,1))    cos(MDH(5,4))*cos(MDH(5,1))  -sin(MDH(5,4))  -MDH(5,2)*sin(MDH(5,4));
         sin(MDH(5,4))*sin(MDH(5,1))    sin(MDH(5,4))*cos(MDH(5,1))   cos(MDH(5,4))   MDH(5,2)*cos(MDH(5,4));
         0                              0                             0               1];
    T56=[cos(MDH(6,1))                 -sin(MDH(6,1))                 0               MDH(6,3);
         cos(MDH(6,4))*sin(MDH(6,1))    cos(MDH(6,4))*cos(MDH(6,1))  -sin(MDH(6,4))  -MDH(6,2)*sin(MDH(6,4));
         sin(MDH(6,4))*sin(MDH(6,1))    sin(MDH(6,4))*cos(MDH(6,1))   cos(MDH(6,4))   MDH(6,2)*cos(MDH(6,4));
         0                              0                             0               1];
    
    T06=T01*T12*T23*T34*T45*T56;
    

    4.结果
    对比robotic toolbox里fkine的结果是一致的。
    这里写图片描述
    PS:这个手写的函数仅适用于改进DH模型。

    展开全文
  • 文章目录 写在最前面的话:本文主要整理深度学习中的损失函数,从原理到作用,详细了解损失函数

    写在最前面的话:本文主要整理深度学习中的损失函数,从原理到作用,详细了解损失函数。

    损失函数

    损失函数(loss function) 是用来评估模型的预测值f(x)与真实值y的不一致程度,它是一个非负值,常用符号 L ( f ( x ) , y ) L(f(x), y) L(f(x),y)表示。损失函数在模型的性能中起关键作用,选择正确的损失函数能帮助模型在数据集中获得最优最快的收敛,起到指导模型学习的作用。它的值越小,说明模型的鲁棒性越好。损失函数是经验风险函数的核心部分,也是结构风险函数的重要组成部分。模型的结构风险函数包括了经验风险项和正则项,通常可以表示为:
    θ ∗ = arg min ⁡ θ 1 N ∑ i = 1 N L ( f ( x i ; θ ) , y i ) + λ Φ ( θ ) \theta^*=\argmin_\theta \frac1N\sum_{i=1}^NL(f(x_i;\theta), y_i)+\lambda\Phi(\theta) θ=θargminN1i=1NL(f(xi;θ),yi)+λΦ(θ)
    其中,加号前面的项为经验风险损失函数,L表示损失函数,加号后面的项为正则化项。

    下面介绍在计算机视觉中一些常用的损失函数。

    Pixel-wise Loss

    pixel-wise:字面上的理解一样,一张图片是由一个个pixel(像素)组成的,这个是图像的基本单位,像素级别的。故,pixel-wise 损失函数是计算预测图像与目标图像的像素间的损失。属于像素间类型的损失函数,常见的有:MSE(L2损失),MAE(L1损失)和交叉熵等。

    MSE 均方误差

    均方误差(Mean Squared Error,MSE) 是指参数估计值与参数真值之差平方的期望值,MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度,通常用在回归问题中作为损失函数
    M S E = 1 N ∑ i = 1 N ( y i − f ( x i ) ) 2 MSE=\frac1N\sum_{i=1}^N(y_i-f(x_i))^2 MSE=N1i=1N(yif(xi))2
    其中, i 表示第 i 个样本,N 表示样本总数。

    MAE 平均绝对误差

    平均绝对误差(Mean Absolute Error,MAE) 是绝对误差的平均值 ,平均绝对误差能更好地反映预测值误差的实际情况,通常用来作为回归算法的性能指标
    M A E = 1 N ∑ i = 1 N ∣ y i − f ( x i ) ∣ MAE=\frac1N\sum_{i=1}^N|y_i-f(x_i)| MAE=N1i=1Nyif(xi)
    其中, i 表示第 i 个样本,N 表示样本总数。

    CE 交叉熵损失

    交叉熵(Cross Entry,CE) 是用来评估当前训练得到的概率分布与真实分布的差异情况,减少交叉熵损失就是在提高模型的预测准确率,通常用作分类问题的损失函数
    C E ( p , q ) = − ∑ i = 1 N p ( x i ) log ⁡ q ( x ( − i ) ) CE(p,q)=-\sum_{i=1}^Np(x_i)\log q(x_{(-i)}) CE(p,q)=i=1Np(xi)logq(x(i))
    其中,p(x)是指真实分布的概率,q(x)是模型通过数据计算出来的概率估计。

    这些损失函数都是对图像中每个像素向量的类预测情况进行评估,所以它们通常都应用在分类和回归问题中。

    Perceputal Loss

    Perceputal loss 中文名叫感知损失,被用在GAN网络中的。对于图像风格化、超分辨率重建等任务来说,早期使用的像素空间的L2 损失得到的图像细节模糊,视觉效果往往是不好的,它与人眼感知的图像质量并不匹配,因此就有学者提出使用Perceputal loss取代L2 loss,能获得细节丰富的结果。

    感知损失是比较图像之间的高级感知和语义差异,它从预训练好的网络中提取前几层的输出指,从而获得图像的底层特征,然后通过简单的像素级损失来比较目标的特征张量和输出值的特征张量的区别。我们都知道,对于一个卷积神经网络CNN来说,浅层的网络是提取简单的特征(如边缘、颜色),而深层的卷积层才能提取更复杂的特征(如特定的形状,模式),因此在网络的前几层捕获的低层次特征都是差不多,这个发现也是支撑迁移学习的理论基础。感知损失的数学表达式为:
    L j = ∣ ∣ V j ( y ) − V j ( f ( x ) ) ∣ ∣ 2 2 C j ∗ H j ∗ W j L_j=\frac{||V_j(y)-V_j(f(x))||^2_2}{C_j*H_j*W_j} Lj=CjHjWjVj(y)Vj(f(x))22
    其中, V j ( f ( x ) ) V_j(f(x)) Vj(f(x))表示预训练网络第j层在处理图像f(x)时的激活情况,其形状为 ( C j , H j , W j ) (C_j,H_j,W_j) (Cj,Hj,Wj),这里使用L2损失的平方,将图像归一化,比较groun truth图像y与预测图像f(x)的激活情况。

    Content-Style Loss

    Content-Style Loss是在风格迁移中的一种损失函数。风格转换是将图像的语义内容转换为不同风格的过程,风格迁移模型的目标是:给定一个内容图像(C)和一个风格图像(S),生成出包含C的内容和S的风格的输出图像。

    风格迁移
    构造风格迁移的损失函数的思路是:

    1. 随机生成一张图像;
    2. 计算其与内容图像C之间的内容损失 L c o n t e n t L_{content} Lcontent
    3. 计算其与风格图像S之间的内容损失 L s t y l e L_{style} Lstyle
    4. 最小化损失函数 L o s s = α L c o n t e n t + β L s t y l e Loss=\alpha L_{content}+\beta L_{style} Loss=αLcontent+βLstyle,其中 α , β \alpha,\beta α,β为超参数。

    在风格迁移中,内容损失与上面的感知损失类似,是比较生成图像P与内容图像C在预训练好的网络中某一层的特征图的相似度,即计算两个特征图的L2距离,用数学表示:
    L c o n t e n t = ∑ i , j ∣ ∣ A i , j l ( C ) − A i , j l ( P ) ∣ ∣ 2 2 2 L_{content}=\frac{\sum_{i,j}||A_{i,j}^l(C)-A_{i,j}^l(P)||_2^2}{2} Lcontent=2i,jAi,jl(C)Ai,jl(P)22
    同样,计算生成图像与风格图像的内容损失,然后就可以得到总的风格损失:
    L o s s = α L c o n t e n t + β L s t y l e Loss=\alpha L_{content}+\beta L_{style} Loss=αLcontent+βLstyle
    其中 α , β \alpha,\beta α,β为超参数。

    Texture Loss

    Texture Loss(纹理损失)也是出现在风格迁移中的一种损失函数,由Gatys et al在2016年引入在风格迁移中。纹理损失是对感知损失的一种改进,适用在捕获图像的风格中,Gatys et al发现:可以通过查看预训练网络中特征图内的值的空间相关性来提取图像的风格表示。纹理损失主要是通过计算Gram矩阵来实现的:
    G i , j l = ∑ k F i , k l F j , k l G_{i,j}^l=\sum_kF_{i,k}^lF_{j,k}^l Gi,jl=kFi,klFj,kl
    其中, F i F_i Fi是预训练网络中 l l l层的特征图。Gram矩阵是向量化特征映射 F i F_i Fi F j F_j Fj l l l层的内积,它捕获了特征在图像不同部分出现的趋势。

    日常科普:n维欧式空间中任意k( k ≤ n k\le n kn)个向量 α 1 , α 2 , . . . , α k \alpha_1,\alpha_2,...,\alpha_k α1,α2,...,αk的内积所组成的矩阵称为k个向量 α 1 , α 2 , . . . , α k \alpha_1,\alpha_2,...,\alpha_k α1,α2,...,αk的格拉姆矩阵(Gram矩阵)。

    因此,纹理损失的数学表示为:
    E l = 1 4 N l 2 M l 2 ∑ i , j ( G i , j 2 − A i , j 2 ) 2 E_l=\frac{1}{4N_l^2M_l^2}\sum_{i,j}(G_{i,j}^2-A_{i,j}^2)^2 El=4Nl2Ml21i,j(Gi,j2Ai,j2)2
    其中, G i , j G_{i,j} Gi,j A i , j A_{i,j} Ai,j分别为模型输出的I层和目标图像在模型中I层的风格样式表示。 N l N_l Nl是第I层中不同特征映射的数量, M l M_l Ml是第I层中特征映射的容量(简单来说,就是通道的宽高), E l E_l El代表I层的纹理损失。

    整个网络的纹理损失是所有层的纹理损失的加权和:
    L s t y l e ( S , P ) = ∑ l = 0 L w l E l L_{style}(S,P)=\sum_{l=0}^Lw_lE_l Lstyle(S,P)=l=0LwlEl
    这里的S是风格图像的纹理,P是生成图像。

    Topological Perceputal Loss

    拓扑感知损失函数(Topological Perceputal Loss)是感知损失的一种延申,主要应用在分割mask预测。 Mosinska等人提出,在图像分割领域中一般使用的是pixel-wise损失,因为图像分割任务的本质还是对像素点的分类,被称为密集预测,所以对于分类问题自然就采用交叉熵损失函数。像素级的损失仅依赖局部测度,不考虑图像中拓扑结构的特征(如连接的形状,或者孔的数量),这导致传统的分类模型会对浅层的结构容易出现分类错误的问题。为了改进像素损失,Mosinska引入了一个惩罚项,该惩罚项基于预训练模型(VGG-19网络)生成的特征图,类似于感知损失,主要考虑补充拓扑信息:
    L t o p = ∑ n = 1 N ∑ m = 1 M ∣ ∣ l n m ( y ) − l n m ( f ( x ) ) ∣ ∣ 2 2 L o s s = L p i x e l + μ L t o p \begin{aligned} L_{top}&=\sum_{n=1}^N\sum_{m=1}^M||l_n^m(y)-l_n^m(f(x))||^2_2\\ Loss&=L_{pixel}+\mu L_{top}\end{aligned} LtopLoss=n=1Nm=1Mlnm(y)lnm(f(x))22=Lpixel+μLtop

    其中, l n m l_n^m lnm表示VGG-19网络的n层的第m个feature map。 μ \mu μ是衡量像素损失和拓扑损失的权重参数。

    GAN Loss

    生成式对抗网络(GAN, Generative Adversarial Networks ) 是一种通过模型中的两个模块相互博弈学习产生较好的输出的网络,这两个模块分别为:生成模型(Generative Model)和判别模型(Discriminative Model)。判别模型的任务是评估当前这张图像是ground truth(真图像)还是由生成模型生成的图像(假图像)。在GAN中,生成模型的损失函数是隐式的,它以判别模型的判别结果作为反馈,在训练过程中不断学习。而判别模型的损失函数则是显式的,因此,在网络训练过程中,生成模型和判别模型都参与其中,它们轮流更新各自的模型权重。

    Min-Max 损失函数

    GAN的计算流程和结构如下图所示。GAN目标函数
    这是原始的GAN提出的loss:
    D i s c r i m i n a t o r → max ⁡ : log ⁡ D ( x ) + log ⁡ ( 1 − D ( G ( z ) ) ) G e n e r a t o r → min ⁡ : log ⁡ ( 1 − D ( G ( z ) ) ) \begin{aligned} Discriminator &\to \max:\log D(x)+\log(1-D(G(z)))\\ Generator &\to \min:\log(1-D(G(z))) \end{aligned} DiscriminatorGeneratormax:logD(x)+log(1D(G(z)))min:log(1D(G(z)))
    这里的 x x x代表真实样本, z z z代表噪声样本, G ( z ) G(z) G(z)表示生成器在随机噪声中生成假的图像。整个损失函数都是在D(判别模型)输出处产生的,D的输出一般是0/1。Discriminator 的损失函数:因为输入采样自真实数据所以我们期望D(x)趋近于1,也就是取max。同理Generator 输入采样自G生成数据,所以我们期望D(G(z))趋近于0更好,也就是取min。但是在实践中发现,这种生成模型的损失函数会饱和。也就是说,如果它不能像判别模型学习得那么快,判别模型赢了,游戏就结束了,模型就不能得到有效的训练。

    不饱和的GAN损失

    为了解决Min-Max损失中的生成模型损失会出现饱和的情况,专门对生成模型的损失函数做了改进:
    G e n e r a t o r → max ⁡ : log ⁡ ( D ( G ( z ) ) ) \begin{aligned} Generator &\to \max:\log(D(G(z))) \end{aligned} Generatormax:log(D(G(z)))

    最小均方GAN损失

    借鉴非GAN网络采用的损失函数一般为MSE,所以又提出了一种最小均方GAN损失:
    D i s c r i m i n a t o r → min ⁡ : ( D ( x ) − 1 ) 2 + ( D ( G ( z ) ) ) 2 G e n e r a t o r → min ⁡ : ( D ( G ( z ) ) − 1 ) 2 \begin{aligned} Discriminator &\to \min: (D(x)-1)^2+(D(G(z)))^2\\ Generator &\to \min:(D(G(z))-1)^2 \end{aligned} DiscriminatorGeneratormin:(D(x)1)2+(D(G(z)))2min:(D(G(z))1)2

    Wasserstein GAN损失

    Martin Arjovsky提出传统GAN的目标是最小化真实图像和生成图像的实际概率分布和预测概率分布之间的距离,即所谓的Kullback-Leibler (KL)散度,使用的Min-Max损失刚好等价于JS散度,由于JS散度存在一个严重的问题:两个分布没有重叠时,JS散度为零,而在训练初期,JS散度是有非常大的可能为零的。所以如果D被训练的过于强,loss会经常收敛到 − 2 log ⁡ 2 -2\log2 2log2而没有梯度。

    科普什么是JS散度?:JS散度度量了两个概率分布的相似度,基于KL散度的变体,解决了KL散度非对称的问题。一般地,JS散度是对称的,其取值是0到1之间。
    KL散度:即相对熵,用来表示两个概率分布之间的差异,但是它并不是对称的。

    对于这个问题,他们建议在地球移动距离上对问题进行建模,该模型根据将一个分布转换成另一个分布的成本来计算两个概率分布之间的距离。因此,WGAN提出了一个新的loss,Wasserstein loss, 也称作地球移动距离:
    W ( P r , P g ) = inf ⁡ r ∼ Π ( P r , P g ) E ( x , y ) ∼ r ∣ ∣ x − y ∣ ∣ W(P_r,P_g)=\inf_{r\sim \Pi(P_r,P_g)}E_{(x,y)\sim r}||x-y|| W(Pr,Pg)=rΠ(Pr,Pg)infE(x,y)rxy
    这个距离的直观含义是,将分布r移动到分布g所需要的距离,所以即使是两个分布没有重叠,这个loss也是有值的。可以证明,该距离可以转化为如下形式:
    W ( P r , P g ) = sup ⁡ ∣ ∣ f ∣ ∣ L ≤ 1 E x ∼ P r [ f ( x ) ] − E y ∼ P g [ f ( y ) ] W(P_r,P_g)=\sup_{||f||_{L\le1}}E_{x\sim P_r}[f(x)]-E_{y\sim P_g}[f(y)] W(Pr,Pg)=fL1supExPr[f(x)]EyPg[f(y)]
    其中f必须满足1-Lipschitz连续,即: ∣ ∣ f ( x ) − f ( y ) ∣ ∣ ≤ ∣ ∣ x − y ∣ ∣ ||f(x)-f(y)||\le||x-y|| f(x)f(y)xy。可以看到,符合1-Lipschitz连续的函数的梯度是受限的,可以有效的防止梯度的爆炸,使训练更加稳定。

    对于GAN来说,f指的是D或G,而D或G都是模型,即由一系列矩阵乘法复合而成的,那么如果矩阵乘法这个运算满足1-Lipschitz连续,那么其复合运算也会满足1-Lipschitz连续,模型也就满足1-Lipschitz连续因此,WGAN 损失就表示为:
    W G A N L o s s ( R e a l I m a g e s ) = 1 ∗ a v g    p r e d i c t e d    s c o r e W G A N L o s s ( F a k e I m a g e s ) = − 1 ∗ a v g    p r e d i c t e d    s c o r e \begin{aligned} WGAN Loss(Real Images) &= 1*avg\; predicted \;score\\ WGAN Loss(Fake Images) &= -1*avg \;predicted \;score \end{aligned} WGANLoss(RealImages)WGANLoss(FakeImages)=1avgpredictedscore=1avgpredictedscore
    使用Wasserstein损失的GAN涉及到将判别器的概念改变为一个更改评估器,比生成器模型更新得更频繁(例如,更新频率是生成器模型的五倍)。评估器用实际的数字而不是预测概率来给图像打分。它还要求模型的权重保持较小。该得分的计算使得真假图像的得分之间的距离最大程度地分离。Wasserstein的损失的好处是,它提供了一个有用几乎无处不在的梯度,允许模型的继续训练。

    循环一致性损失

    循环一致性损失是应用在Cycle GAN网络中的一种损失函数。 CycleGAN本质上是两个镜像对称的GAN,构成了一个环形网络,主要由两个生成器及两个判别器组成,如下图所示。X表示X域的图像,Y表示Y域的图像。X域的图像通过生成器G生成Y域的图像,再通过生成器F重构回X域输入的原图像;Y域的图像通过生成器F生成X域图像,再通过生成器G重构回Y域输入的原图像。判别器Dx和Dy起到判别作用,确保图像的风格迁移。
    cycle GAN
    它的损失函数被定义为:
    L c y c ( G , F ) = E x [ ∣ ∣ F ( G ( x ) ) − x ∣ ∣ 2 ] + E y [ ∣ ∣ G ( F ( y ) ) − y ∣ ∣ 2 ] L ( G , F , D X , D Y ) = L G A N ( G , D Y , X , Y ) + L G A N ( F , D X , Y , X ) + λ L c y c ( G , F ) \begin{aligned} L_{cyc}(G,F) &= E_{x}[||F(G(x))-x||_2]\\ &+E_{y}[||G(F(y))-y||_2]\\ \\ L(G,F,D_X,D_Y)&=L_{GAN}(G,D_Y,X,Y)\\ &+L_{GAN}(F,D_X,Y,X)\\ &+\lambda L_{cyc}(G,F) \end{aligned} Lcyc(G,F)L(G,F,DX,DY)=Ex[F(G(x))x2]+Ey[G(F(y))y2]=LGAN(G,DY,X,Y)+LGAN(F,DX,Y,X)+λLcyc(G,F)

    总结

    本文主要介绍在计算机视觉中不同网络使用的损失函数。
    参考:
    https://mp.weixin.qq.com/s?__biz=MzUxNjcxMjQxNg==&mid=2247497334&idx=4&sn=95926d1ae4e209eff6b361dfc3132dc9&chksm=f9a184f9ced60def1b163d5599421494ea755636af08a845844bf5f465334e7eaea0517b4c1e&mpshare=1&scene=23&srcid=0323DdI1QqBoRgXjzFLEKzfi&sharer_sharetime=1584956360970&sharer_shareid=7f7e7160bc27c0d4e5d25b89aee9e9d5#rd
    https://zhuanlan.zhihu.com/p/72195907
    https://www.jianshu.com/p/64bf39804c80

    展开全文
  • 使用Pytorch进行模型训练,通常可以将train过程写成一个函数,简单的train写法常规的传入参数如下: 数据加载器DataLoader 目标模型model 损失函数criterion 优化器optimizer 较为简单的train函数可以写为如下: d...

    前几个Pytorch学习博客写了使用Pytorch的数据读取、数据增强、数据加载、模型定义,当完成上面几个步骤,就可以进行模型训练了。

    使用Pytorch进行模型训练,通常可以将train过程写成一个函数,简单的train写法常规的传入参数如下:

    • 数据加载器DataLoader
    • 目标模型model
    • 损失函数criterion
    • 优化器optimizer

    较为简单的train函数可以写为如下:

    def train(DataLoader, model, criterion, optimizer):
    	model.cuda()
    	# 指定为train模式
    	model.train()
    
    	for i, (img, target) in tqdm(enumerate(DataLoader)):
    		img = img.cuda()
    		target = target.cuda()
    		# 计算网络输出
    		output = model(img)
    		
    		# 计算损失
    		loss = criterion(output, target)
    		
    		
    		# 计算梯度和做反向传播
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
    

    那么,一个较为完整的使用Pytorch训练分类任务pipeline可以简单的表示如下:

    1. 定义数据加载
    Dataset = torchvision.Dataset(root, transform)
    
    2. 定义模型
    model = torchvision.models.xxxx(num_class)
    
    3. 定义数据加载器
    DataLoader = torch.util.data.DataLoader(Dataset, batch_size, num_workers)
    
    4. 模型训练
    
    # 定义优化器
    optimizer = 
    # 定义损失函数
    criterion = 
    # 定义学习率调整
    scheduler = 
    for i in range(epoch_number):
    	# 根据epoch调整学习率
    	scheduler.step()
    	# 调用训练函数
    	train(train_loader, model, criterion, optimizer)
    
    	# 模型保存
    	torch.save(model.state_dict(), path)
    	
    

    注:以上只是对于使用Pytorch中的API快速做分类任务训练的一个大框架Pipeline的简单伪代码展示,实际编写code中还有其它的一些util函数,比如计算准确率,训练到一定阶段进行验证集评估之类。。。
    仅供参考!!

    展开全文
  • 模型优化、正则化、损失函数

    千次阅读 2018-09-11 17:41:45
    上面已经介绍了主要思想,这个主要是选择最优的模型以及最优的超参数,对于某个模型来说,最优参数与默认参数对模型的提高不会很。 (2)特征选择 特征工程是建模的核心,如果特征选择好,那么模型的效果至少好...

    一、前言

    对于理解机器学习或者深度学习的人来说,需要了解基本的学习框架是什么?无论是聚类、回归,对于参数的求解以及参数的正则化(防止过拟合的措施)来源于什么原理或者基于什么?,这是需要我们理解的。一般而言从误差出发,有式子:
    Loss_function=Est_error+Regularization of parameters

    下面我们来说说估计误差中的损失函数以及模型优化的手段。

    二、常见的损失函数以及应用
    这里写图片描述
    这里写图片描述
    三、train_data、validation_data、test_data之间的联系与区别

    对应某个问题,我们获得样本集合data={(x(i),y(i)),i=1…n},备选的模型有很多,分类问题就可以使用决策树、LR、RF、gbdt等,先假设有备选模型的集合为{M1,M2…Mk}.现在问题是选择哪个模型?该模型对应的参数是多少?模型效果怎样?

    一般地,data分为两个部分(7:3),一部分作为模型的训练,通常叫做train_data;另外一部分作为模型的测试,通常叫做 test_data。

    但是对于多个模型比较或者某个模型它本身具有超参数,此时就需要validation_data,也叫做验证数据,比如神经网络模型,超参数就是隐层层数与隐层节点数。其实就是将原来的 train_test分成了两个部分,训练集合new_train_test(为了区分)以及validation_data。有时候因为前人的多次实践,我们已经知道了最优的超参数,此时就不需要 validation_data来验证,这就是我们常见的只有train_data,test_data。

    一般的过程为:
    这里写图片描述
    这里写图片描述
    四、模型过拟合与欠拟合

    1.过拟合与欠拟合

    假设需要拟合下面的点,得到两个拟合结果:
    这里写图片描述
    左图欠拟合,高偏差,是指模型未训练出数据集的特征,导致模型在训练集、测试集上的精度都很低。

    右图过拟合,高方差(high variance),是指模型训练出包含噪点在内的所有特征,导致模型在训练集的精度很高,但是应用到新数据集时,精度很低。

    2.如何判断过拟合与欠拟合------绘制损失函数随数据集增加的学习曲线
    这里写图片描述
    3.模型欠拟合与过拟合的优化方法
    欠拟合:增加特征、提升模型复杂度、减少正则项权重
    这里写图片描述
    过拟合:增加样本数量、减少特征数目、增加正则项权重
    这里写图片描述
    五、模型优化的方法

    无论是回归还是分类问题,目的都是找到最好或者说比较好的模型去拟合原来的问题,这里的好就就是使得损失函数的值较小且模型的泛化能力好。

    (1)交叉验证

    上面已经介绍了主要思想,这个主要是选择最优的模型以及最优的超参数,对于某个模型来说,最优参数与默认参数对模型的提高不会很大。

    (2)特征选择

    特征工程是建模的核心,如果特征选择好,那么模型的效果至少好了一半,模型准确率提高特征工程是占绝对作用的。常见的特征选择,我们可以从两个方面去考虑:

    1)从已有的特征中选择-----特征选择

    基于AIC\BIC\CP值等统计指标:前进法、后退法、前进后退法
    基于信息熵:决策树(ID3、CD4.5、CART)
    基于编码分箱:woe与iv

    2)获取新的特征--------特征提取

    常见方法:PCA(主成分分析)、ICA(独立成分分析)\CCA(典型相关分析)、LDA(判别分析)、plsr(偏最小二乘回归)、神经网络

    (3)正则化以及常见正则化手段
    这里写图片描述
    六、为何正则化可以避免过拟合?

    1.Dropout为什么可以减少overfitting?

    一般情况下,对于同一组训练数据,利用不同的神经网络训练之后,求其输出的平均值可以减少overfitting。Dropout就是利用这个原理,每次丢掉一定比率的隐藏层神经元,相当于在不同的神经网络上进行训练,这样就减少了神经元之间的依赖性,即每个神经元不能依赖于某几个其他的神经元(指层与层之间相连接的神经元),使神经网络更加能学习到与其他神经元之间的更加健壮robust的特征。在Dropout的作者文章中,测试手写数字的准确率达到了98.7%!所以Dropout不仅减少overfitting,还能提高准确率。

    2.L1、L2正则化为何可以减少overfitting?
    这里写图片描述
    这里写图片描述
    回到为什么会减少overfitting这个问题,两个解释:
    1.从上面可以看出,正则化后效果是均能够使得权值减小。更小的权值w,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀)
    2.过拟合的时候,拟合函数的系数往往非常大,为什么?因为拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。

    参考:
    吴恩达机器学习视频
    The Elements of statistical learning 第二版
    统计学习方法—李航
    机器学习–周志华
    https://hit-scir.gitbooks.io/neural-networks-and-deep-learning-zh_cn/content/chap3/c3s5ss1.html
    https://blog.csdn.net/Mona_yang/article/details/80937802
    https://blog.csdn.net/woniu201411/article/details/80696711

    展开全文
  • DRBF法回顾在上一篇基于动态径向基函数(DRBF)代理模型的优化策略中我们简要介绍了DRBF算法,这种算法收敛次数少,但由于收敛区间只缩小不扩张,该算法有着天然的劣势,如果在几次迭代当中并未搜索到最优解附近的...
  • 函数重载 运算符重载 模板 虚函数 (1)、静态绑定与动态绑定 静态绑定 绑定过程出现在编译阶段,在编译期就已确定要调用的函数。 动态绑定 绑定过程工作在程序运行时执行,在程序运行时才确定将要调用的函数
  • 模型中,假设样本数据是来自于未知的数据分布Pr中采样得到,生成模型的学习过程就是要学习一个Pr的近似概率分布Pθ,其中θ是模型的参数。对于Pθ有两种建模方式: (1)直接用参数θ来描述密度函数。也就是概率密度...
  • Kotlin系列之let、with、run、apply、also函数的使用

    万次阅读 多人点赞 2017-12-12 21:59:53
    标签: Kotlin 常用技巧 目录: 一、回调函数的Kotin的lambda的...、内联扩展函数之also 七、let,with,run,apply,also函数区别 简述: 相比Java, Kotlin提供了不少高级语法特性。对于一个Kotlin的初学者来说
  • 概率图模型中极家族函数的引入  回顾概率图模型03中的内容,我们用联合树算法进行消息传递,本质是在求解某个变量的分布或者条件分布,求解一个分布不单纯局限在联合树算法上,还有其他算法,比如均值场。这些图...
  • 深度学习(一)——MP神经元模型, BP算法, 神经元激活函数, Dropout
  • 自定义评价函数有助于我们灵活观察模型训练过程中的变量变化情况,比如RPN网络中的分类和回归损失在每次迭代过程中的变化情况,或者检测网络的分类和回归损失在每次迭代过程中的变化情况等。当然你还可以自定义mAP的...
  •  在我参加工作两年多的时候,工作不算很忙了,《深入理解C++对象模型》开始进入我的视野;或许是因为我要从Symbian.C++ 转向iOS Objective-C,并开始思考语言本身的一些东西的缘故。  其实在一年前,出于对C++的...
  • Keras笔记():回调函数Callbacks

    千次阅读 2019-04-17 17:11:44
    注:本文转自回调函数Callbacks - Keras中文文档 Keras文档系列 Keras笔记(一):常用函数 Keras笔记(二):优化器optimizers Keras笔记(三):目标函数objectives /loss ...Keras笔记():回调函数Cal...
  • Apollo代码学习()—模型预测控制(MPC)

    万次阅读 多人点赞 2018-11-20 15:39:48
    Apollo代码学习—模型预测控制前言模型预测控制预测模型滚动优化反馈矫正 前言 查看Apollo中关于MPC_controller的代码可以发现,它的主体集成了横纵向控制,在计算控制命令时,计算了横纵向误差: ...
  • 7、函数介绍:run_solvers训练函数 输入:迭代次数(niter)、参数文件solvers(函数五)、迭代间隔(disp_interval) 输出:loss/acc/weights值 def run_solvers (niter, solvers, disp_...
  • 4.使用函数式API实现双输入问答模型 from keras . models import Model from keras import layers from keras import Input text_vocabulary_size = 10000 question_vocabulary_size = 10000 ...
  • 第一张图是当模型为一元一次函数时的情况,以及其loss函数(二元二次函数)的图像是如何由函数的子项形成的,以及二元二次函数梯度的不同对学习率的影响。一般来说采用全量梯度下降时函数图像最陡,批量梯度下降次之...
  • 损失函数

    千次阅读 2019-07-05 14:06:10
    文章目录一、平方损失函数(最小二乘法, Ordinary Least Squares )均方误差ESM均方误差+Sigmoid激活函数:输出...损失函数(loss function)是用来估量模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函...
  • OpenGL() gluLookAt和gluPerspective函数解析

    万次阅读 多人点赞 2016-11-09 23:38:39
    在调用gluLookAt和gluPerspective函数之前一般要先调用一下glLoadIdentity函数,先说一下这个函数是做什么的。 glLoadIdentity glLoadIdentity是一个无参的无值函数,其功能是用一个4*4的单位矩阵来替换...
  • 论文阅读+代价函数+激活函数

    千次阅读 2018-04-02 16:43:21
    =================第一部分 代价函数====================代价函数=损失函数 在机器学习中的每一种算法中,训练模型的过程就是优化代价函数的过程。代价函数对每个参数的偏导数就是梯度下降中提到的梯度,防止过...
  • 统计中经常会涉及到密度函数、分布函数与生存函数的概念,如何透彻的理解这三个函数呢,以下是我的一点理解与看法: 何为生存函数? 电梯用了年还能否继续使用?一个人活了年还能否再活5年?这些问题都是生存...
  • 似然估计与损失函数是如何分别求参数的 极似然估计 参数估计,即估计模型的参数:给定模型p(x|Ɵ)和数据D,选择与数据最匹配的参数Ɵ。 极似然估计用大白话来说是找出一个合适的参数使得似然函数最大 ...
  • GPS从入门到放弃(二十) --- RTKLIB函数解析

    千次阅读 多人点赞 2020-06-07 21:57:21
    GPS从入门到放弃(二十) — RTKLIB函数解析 为了贴合这个系列的标题“从入门到放弃”,在入门之后现在就要放弃此方向了。虽然感觉遗憾,暂时也没有办法。在此附上此系列最后一篇,希望能给大家一些帮助。 此文中...
  • 隐马尔可夫模型是一个双重随机过程----具有一定状态数的隐马尔可夫链和显示随机函数集。自20世纪80年代以来,HMM被应用于语音识别,取得重大成功。到了90年代,HMM还被引入计算机文字识别和移动通信核
  • 互联网广告系统综述六模型

    千次阅读 2014-11-08 23:48:25
    互联网广告系统综述六模型 经过几个博文的啰啰嗦嗦,又是业务又是定向又是系统架构的,给各位的感觉都是在描述一些外围的东西,真正核心的东西还没说到。对于心急得如干柴烈火的热血青年来说,似乎一直在各种前戏,...
  • NLP学习记录()最大熵模型MaxEnt

    千次阅读 2018-06-26 16:28:50
    原理 在叧掌握关于未知分布的部分信息的情况下,符合已知知识的概率分布可能有夗个,但使熵值最大的概率分布最真实地反映了事件的的分布情况,因为熵定义了随机变量...我们的翻译决策模型p给每一个单词或短语分配一...
  • 激活函数总结

    千次阅读 2018-04-25 21:33:36
    一 主要作用激活函数的主要作用就是加入非线性因素,以解决线性模型表达能力不足的缺陷,在整个神经网络起到至关重要的作用。在神经网络中常用的激活函数有Sigmoid、Tanh和relu等,下面逐一介绍。二 Sigmod函数1 ...
  • 这种线程的创建与调度由内核完成,因为这种线程的系统开销比较(但一般来说,比进程开销小) (三)、N:M混合线程模型 NGPT(Next Generation POSIX Threads) N:M混合线程模型提供了两级控制...
  • 一宏观总需求函数 二由AENI模型推导总需求曲线 三由IS-LM模型推导总需求曲线 四AD曲线的公式表达 五总需求曲线的涵义 财政政策与总需求曲线的移动 七货币政策与总需求曲线的移动 八小结 .价格变化对总需求的效应;3...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 131,319
精华内容 52,527
关键字:

六大函数模型