C++元编程——BP神经网络实现

本文介绍了如何使用C++元编程技术实现BP神经网络,通过简洁的代码展示了神经网络的结构,并对之前的元编程矩阵进行了修正,包括转置操作和随机初始化。神经网络的实现清晰易懂,允许用户进行内联优化以提高效率。
摘要由CSDN通过智能技术生成

基于之前的元编程矩阵,接下来就可以实现BP神经网络了。先来看一下实例代码吧:

int main() 
{
	mat<3, 1> mt_input = { 1,2,3 };        // 训练数据集,只有一个数据[1,2,3]
	net<3, 3, 1> n(.01);                    // 定义学习率为0.01,神经元数分别为3,3,1的bp神经网络
	n.print();                            // 打印神经网络权值矩阵
	for (int i = 0; i < 500; ++i)
	{
		auto mt_out = n.forward(mt_input);
		n.backward(mat<1, 1>({ .7 }));    // 以矩阵[.7]为期望值,计算误差并反向传播,更新网络
		std::cout << "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv" << std::endl;
		mt_out.print();                    // 输出结果打印
	}
	std::cout << "=====================================" << std::endl;
	n.print();
	_getch();
	return 0;
}

看上去足够简洁,接下来是基于之前元编程矩阵的一些改正,主要是转置的更正以及初始化的随机极小值。代码如下:

#include <random>

template<typename val_t>
struct mat_m
{
	val_t* p;
	mat_m(const int& sz) :p(nullptr)
	{
		p = (val_t*)malloc(sz * sizeof(val_t));
		static std::default_random_engine e;
		std::uniform_real_distribution<double> ud(0, .001);
		for (int i = 0; i < sz; ++i) 
		{
			p[i] = ud(e);
		}
	}
	~mat_m()
	{
		if (p)
			free(p);
	}
	val_t& get(const int& len_1d, const int& i_1d_idx, const int& i_2d_idx)
	{
		return p[i_2d_idx + len_1d * i_1d_idx];
	}
};

template<int row_num, int col_num, typename val_t = double>
struct mat
{
	typedef val_t vt;
	static constexpr int r = row_num;
	static constexpr int c = col_num;
	std::shared_ptr<mat_m<val_t>> pval;
	bool b_t;
	mat():b_t(false)
	{
		pval = std::make_shared<mat_m<val_t>>(row_num * col_num);
	}
	mat(const mat<row_num, col_num, val_t>& other) :pval(other.pval), b_t(other.b_t)
	{
	}
	mat(const val_t&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

腾昵猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值