深度学习入门线性函数拟合前后传播过程 C++版本
c++源码
代码里面包涵了前向传播和反向传播的基本过程,对这一块的理解很有帮助,可以自己设置样本,通过观察成本,调整学习率和迭代次数。
#include <iostream>
using namespace std;
//y=3x+2
//a学习率,dw db为梯度,
int x[10]={0,1,2,3,4,5,6,7,8,9};
int y[10]={2,5,8,11,14,17,20,23,26,29};
int epoch=500;//迭代次数
int m=10;//样本数量
int main()
{ float w=1.0,b=1.0,a=0.01,dw=0,db=0,dwAll=0.0,dbAll=0.0,J=0;
for(int i=0;i<epoch;i++)
{
dwAll=0;
dbAll=0;
J=0;
for(int j=0;j<10;j++)
{
dwAll+=2*(w*x[j]+b-y[j])*x[j];
dbAll+=2*(w*x[j]+b-y[j]);
J+=(w*x[j]+b-y[j])*(w*x[j]+b-y[j]);
}
dw=dwAll/m;
db=dbAll/m;
J=J/m;
w=w-a*dw;
b=b-a*db;
cout<<"y="<<w<<"x+"<<b<<" cost:"<<J<<endl;
}
return 0;
}
贴出最后几次w,b变化的结果
y=3.00012x+1.99927 cost:3.9881e-07
y=3.00012x+1.99928 cost:3.87233e-07
y=3.00011x+1.99929 cost:3.76572e-07
y=3.00011x+1.9993 cost:3.66034e-07
y=3.00011x+1.99931 cost:3.5567e-07
y=3.00011x+1.99932 cost:3.46122e-07
y=3.00011x+1.99933 cost:3.36539e-07
y=3.00011x+1.99934 cost:3.26613e-07
y=3.0001x+1.99935 cost:3.17665e-07
y=3.0001x+1.99936 cost:3.08892e-07
y=3.0001x+1.99937 cost:2.99917e-07
y=3.0001x+1.99937 cost:2.91569e-07
y=3.0001x+1.99938 cost:2.83226e-07
y=3.00009x+1.99946 cost:2.19096e-07
原理
这里的w,b最小值是可以直接求出来的,可是函数不同,求出来可能计算太大,甚至无法计算。具体可以看吴恩达老师的讲解。