C++元编程——nadam优化的bp神经网络

本文介绍了在C++中应用Nadam优化的BP神经网络,通过对比实验,发现Nadam比Adam更快地收敛,大约在800次迭代后能成功训练,而Adam则需要约1500次。
摘要由CSDN通过智能技术生成

nadam的详细知识就不详细介绍了,前人之述备矣。在之前的bp神经网络上进行了优化,将更新方法独立出来。先展示一下最终测试程序吧,下面这个程序用来根据x^3+2*x+1的值计算x。分别试了adam和nadam,基本上adam能在1500次左右训练成功,nadam稍微快一些,大概800次左右能得到结果。


int main(int argc, char** argv) 
{
	int i_loop_num = 1;
	
	using net_type = net<nadam, 1, 100, 1>;					// 用nadam优化的bp神经网络类型定义
	net_type n;		
	net_type::ret_type& mt_delta = n.get_delta();			// 引用,这样就永远不需要复制了
	int i_max_repeat_count = 0;
	double d_pre_max = 0.0;
	double d_max = -1 * DBL_MAX;
	for (double i = 0; ; i+=1) 
	{
		double d_max_error_j = 0.1;
		for (double j = 0.1; j < 0.6; j+=.01) 
		{
				double d_out = j;
				net_type::ret_type mt_expected({ d_out });		// 期望返回值
				net_type::input_type mt_input = { j * j * j + 2. * j + 1 };
				auto mt_out = n.forward(mt_input);
				n.backward(mt_expected);
				if (d_max < mt_delta.max_abs())
				{
					d_max_error_j = j;
				}
				d_max = d_max < mt_delta.max_abs() ? mt_delta.max_abs() : d_max;
		}
		for (int k = 0; k < 3; ++k)							// 最大误差项进行加强训练
		{
			double d_out = d_max_error_j;
			net_type::ret_type mt_expected({ d_out });		// 期望返回值
			net_type::input_type mt_input = { d_max_error_j * d_max_error_j * d_max_error_j + 2. * d_max_error_j + 1 };
			auto mt_out = n.forward(mt_input);
			n.backward(mt_expected);
		}
		std::cout << d_max << std::endl;
		i_loop_num++;
		if (d_max < 1e-2/* || abs(d_pre_max - d_max) < 1e-11 */)
		{
			i_max_repeat_count++;
			std::cout << "-------" << d_max <<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾昵猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值