神经网络不学习
Neural network not learning
我尝试创建一个具有 1 个隐藏层的神经网络(假设数据向量包含 4 个值,输入层有 3 个神经元,隐藏层有 3 个神经元,输出层有 1 个神经元)。我有两个数据向量和两个已知结果。
我使用第一组数据教授网络,然后应用第二组。使用反向传播方法校正权重。问题是如果我尝试在权重校正后预测第一组的值,我得到的结果非常接近第二个结果。所以,神经网络"forgets"第一次训练
我程序的完整代码在这里https://gist.github.com/edtechd/63aace5d88dee1ab6835
教学期间和之后的权重值在这里https://gist.github.com/edtechd/7f19f0759bb808a31a3f
这里是NN训练函数
public void Train(double[] data, double expectedResult)
{
double result = Predict(data);
double delta = Perceptron.ActivationFunction(expectedResult) - Perceptron.ActivationFunction(result);
double eta = 20;
// Calculate layer 2 deltas
for (int i = 0; i < size2; i++)
{
deltas2[i] = delta * weights3[i];
}
// Calculate layer 1 deltas
for (int i = 0; i < size1; i++)
{
deltas1[i] = 0;
for(int j=0; j < size2; j++) {
deltas1[i] += deltas2[j] * weights2[j * size1 + i];
}
}
// Correct layer 1 weights
for (int i = 0; i < data.Length; i++)
{
for (int j = 0; j < size1; j++)
{
weights1[j * data.Length + i] += eta * deltas1[j] * values1[j] * (1 - values1[j]) * data[i];
}
}
// Correct layer 2 weights
for (int i = 0; i < size1; i++)
{
for (int j = 0; j < size2; j++)
{
weights2[j * size1 + i] += eta * deltas2[j] * values2[j] * (1 - values2[j]) * values1[i];
}
}
double resultA = Perceptron.ActivationFunction(result);
for (int i = 0; i < size2; i++)
{
weights3[i] += eta * delta * resultA * (1 - resultA) * values2[i];
}
}
我是不是漏掉了什么?
问题解决了
在教学步骤中,我反复向网络展示第一个示例,直到结果接近预期,然后我展示了第二个示例。
A A A A A B B B B B B
如果我依次重复显示两个示例,神经网络会收敛并正确识别示例。
A B A B A B A B A B A B
我尝试创建一个具有 1 个隐藏层的神经网络(假设数据向量包含 4 个值,输入层有 3 个神经元,隐藏层有 3 个神经元,输出层有 1 个神经元)。我有两个数据向量和两个已知结果。
我使用第一组数据教授网络,然后应用第二组。使用反向传播方法校正权重。问题是如果我尝试在权重校正后预测第一组的值,我得到的结果非常接近第二个结果。所以,神经网络"forgets"第一次训练
我程序的完整代码在这里https://gist.github.com/edtechd/63aace5d88dee1ab6835
教学期间和之后的权重值在这里https://gist.github.com/edtechd/7f19f0759bb808a31a3f
这里是NN训练函数
public void Train(double[] data, double expectedResult)
{
double result = Predict(data);
double delta = Perceptron.ActivationFunction(expectedResult) - Perceptron.ActivationFunction(result);
double eta = 20;
// Calculate layer 2 deltas
for (int i = 0; i < size2; i++)
{
deltas2[i] = delta * weights3[i];
}
// Calculate layer 1 deltas
for (int i = 0; i < size1; i++)
{
deltas1[i] = 0;
for(int j=0; j < size2; j++) {
deltas1[i] += deltas2[j] * weights2[j * size1 + i];
}
}
// Correct layer 1 weights
for (int i = 0; i < data.Length; i++)
{
for (int j = 0; j < size1; j++)
{
weights1[j * data.Length + i] += eta * deltas1[j] * values1[j] * (1 - values1[j]) * data[i];
}
}
// Correct layer 2 weights
for (int i = 0; i < size1; i++)
{
for (int j = 0; j < size2; j++)
{
weights2[j * size1 + i] += eta * deltas2[j] * values2[j] * (1 - values2[j]) * values1[i];
}
}
double resultA = Perceptron.ActivationFunction(result);
for (int i = 0; i < size2; i++)
{
weights3[i] += eta * delta * resultA * (1 - resultA) * values2[i];
}
}
我是不是漏掉了什么?
问题解决了
在教学步骤中,我反复向网络展示第一个示例,直到结果接近预期,然后我展示了第二个示例。
A A A A A B B B B B B
如果我依次重复显示两个示例,神经网络会收敛并正确识别示例。
A B A B A B A B A B A B