这次的版本更优秀了的样子!
按照老板说的,每个节点是单独的导出节点(会导致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