机器学习BP神经网络,任意拓扑结构 (C++)

这次的版本更优秀了的样子!

按照老板说的,每个节点是单独的导出节点(会导致sigmod训练变慢,原因sigmod层数多了,梯度会下降很快导致爆炸。)


换个激活函数就行了。

net<10>表示网咯有10个节点

然后input.txt里的文件格式大概是

n

0 1

1 2

3 4

....

n表示有n行,每行2个数字,表示2个点有边。(0下标开始,不超过net初始化的节点数量)。任意拓扑结构都可以运行。


#include <bits/stdc++.h>
#include "recordlog.h"
#include <memory>

using std::cin;
using std::endl;
using std::cout;
#define pr(x)	cout<<#x<<" = "<<x<<" "
#define prln(x)	cout<<#x<<" = "<<x<<endl


#define NODE		(neurons[node])
#define NODE_GAIN	(NODE.energy)
#define NODE_THETA	(NODE.loss_energy)			//node节点的theta,也就是阈值
#define NODE_VALUE	(NODE_GAIN + NODE_THETA)	//node节点的实际能量(获得能量+theta)
#define NODE_OUTPUT 	(NODE.output)				//node节点的实际输出
#define NODE_PE		(NODE.partial_derivative)		//node节点output,对最终答案的导数
#define D_NODE		(derivative(NODE_VALUE))		//node节点获得的所有能量(加过theta的),对于node节点output的导数



#define NEXT_NODE		(neurons[nextnode.first])
#define NEXT_NODE_OUTPUT 	(NEXT_NODE.output)				//node节点的实际输出
#define NEXT_NODE_GAIN		(NEXT_NODE.energy)
#define NEXT_NODE_PE		(NEXT_NODE.partial_derivative)			//node节点output,对最终答案的导数
#define NEXT_NODE_THETA		(NEXT_NODE.loss_energy)				//node节点的theta,也就是阈值
#define NEXT_NODE_VALUE		(NEXT_NODE_GAIN + NEXT_NODE_THETA)	//node节点的实际能量(获得能量+theta)
#define D_NEXT_NODE		(derivative(NEXT_NODE_VALUE))			//node节点获得的所有能量(加过theta的),对于node节点output的导数
#define NODE_TO_NEXTNODE_WEIGHT (nextnode.second)

class neuron_t;
typedef std::pair<int, double> 		PID;
typedef std::vector<PID> 		neuron_array_t;
typedef std::vector<int>	  	vector_map_t;
typedef std::unique_ptr<neuron_t>	neuron_ptr_t;

class neuron_t
{
	public:
		double 			energy;
		double			output;
		int 			number;
		double 			loss_energy;
		neuron_array_t 		neuron_array;
		double			partial_derivative;
		bool			is_input;
		bool			is_output;
};

template<int neuron_size>
class net_t
{
	public:
		neuron_t		neurons[neuron_size];
		vector_map_t		vector_map[neuron_size];
		std::string		activation_way;			//激活函数的选择,默认ReLU

		std::vector<double>	input_weight;

		std::vector<int> 	output_number;
		std::vector<int> 	input_number;
		int 			tmp[neuron_size];		//临时数组,生成过n的全排列,和拓扑排序中记录入度。
		int 			height[neuron_size];		//辅助构图的高度数组
		int			topology[neuron_size];		//拓扑序
		double			rate;				//学习率
		int			userful_neuron_size;

		static double sigmoid(double 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值