c++ - C++ 神经网络实现 XOR.Output 总是接近 0.5
问题描述
我正在尝试在 C++ 上实现简单的神经网络。但是,在使用 HOR 对其进行测试时,它总是给出接近 0.5 的输出。我尝试改变 bies 神经元的学习率、动量、值,但没有任何帮助。
网络本身就是结构的二维向量(神经元)
struct Neuron
{
vector<double> weights;
vector<double> deltaWeights;
vector<double> gradient;
double value;
double delta;
};
typedef vector<Neuron> Layer;
class Network
{
public:
Network(vector<unsigned>& Topology);
double Sigmoid(double& x) { return 1 / (1 + exp(-x)); };
double SigmoidDerivative(double& x) { return Sigmoid(x) * (1 - Sigmoid(x)); };
double RandomWeights() { return ((double)rand() / RAND_MAX); };
double ErrorFactor(vector<double>& TargetVals);
void FeedForward(vector<double>& inputVals);
void BackPropagation(vector<double>& targetVals);
private:
vector<Layer> Net;
const double alpha = 0.15; //learning rate
const double epsilon = 0.3; //momentum
};
我尝试使用 const 权重进行前馈,我认为反向传播算法存在错误
反向传播算法:
void Network::BackPropagation(vector<double>& targetVals)
{
for (unsigned i = 0; i < Net.back().size() - 1; i++) //delta for output neurons
{
Net.back()[i].delta = (targetVals[i] - Net.back()[i].value) * SigmoidDerivative(Net.back()[i].value);
}
for (int i = Net.size()-2; i >= 0; i--) //delta for hiden neurons
{
for (unsigned j = 0; j < Net[i].size(); j++)
{
Net[i][j].delta = 0;
for (unsigned l = 0; l < Net[i][j].weights.size(); l++)
{
Net[i][j].delta += (Net[i][j].weights[l] * Net[i + 1][l].delta);
}
Net[i][j].delta *= SigmoidDerivative(Net[i][j].value);
}
}
for (unsigned i = 0; i < Net.size() - 1; i++) //gradient
{
for (unsigned j = 0; j < Net[i].size(); j++)
{
for (unsigned l = 0; l < Net[i][j].weights.size(); l++)
{
Net[i][j].gradient[l] = Net[i][j].value * Net[i + 1][l].delta;
}
}
}
for (unsigned i = 0; i < Net.size() - 1; i++) //changing weigths
{
for (unsigned j = 0; j < Net[i].size(); j++)
{
for (unsigned l = 0; l < Net[i][j].weights.size(); l++)
{
Net[i][j].deltaWeights[l] = (Net[i][j].gradient[l] * epsilon + Net[i][j].deltaWeights[l] * alpha);
Net[i][j].weights[l] += Net[i][j].deltaWeights[l];
}
}
}
}
解决方案
推荐阅读
- angular - AngularnVMWare清晰的vcenter搜索组件——源在哪里?
- javascript - 未捕获的类型错误:无法读取反应组件上未定义的属性“包含”
- javascript - 使用 JQuery 将选择移动到 html 中的下一个列表项
- php - session.name 不能为数字或空
- google-apps-script - 错误:未授予访问权限或已过期。通过服务帐户和域范围的委派访问 Google Admin Directory API 时
- java - 如何将一个 docx 插入另一个 docx 的预定行
- node.js - 运行连接到 MongoDB 云集群的 nodejs 应用程序时,Docker-compose 给出:“node|SyntaxError: Unexpected token import”错误
- python-3.x - Python中磁盘/分区的大小与linux命令不同
- javascript - 如何等待 Http 请求完成?
- css - 当间隙设置为 0(响应式地图)时,为什么 CSS 网格中的图块之间存在小的像素间隙?