我一直在尝试训练以下网络并获得合适的重量,但它一直在运行。任何人都可以告诉我代码中可能有什么问题吗?这里输入{8,1},{-1}}是使用signum函数的预期输出。
import java.util.Arrays;
public class ANN {
public static void main(String args[]) {
double threshold = 1.2;
double learningRate = 0.08;
// Init weights
double[] weights = { -1.4, 1.8 };
int[][][] trainingData = {
{{8, 1}, {-1}},
{{3, 2}, {-1}},
{{6, 3}, {-1}},
{{1, 4}, {-1}},
{{9, 5}, {1}},
{{5, 6}, {1}},
{{2, 7}, {1}},
{{4, 8}, {1}},
{{7, 9}, {1}},
};
// Start training loop
while (true) {
int errorCount = 0;
// Loop over training data
for (int i = 0; i < trainingData.length; i++) {
System.out.println("Starting weights: " + Arrays.toString(weights));
// Calculate weighted input
double weightedSum = 0;
for (int ii = 0; ii < trainingData[i][0].length; ii++) {
weightedSum += trainingData[i][0][ii] * weights[ii];
}
// Calculate output
int output = 0;
if (threshold <= weightedSum) {
output = 1;
}
System.out.println("Target output: " + trainingData[i][1][0]
+ ", " + "Actual Output: " + output);
// Calculate error
int error = trainingData[i][1][0] - output;
System.out.println("Error: " + error);
// Increase error count for incorrect output
if (error != 0) {
errorCount++;
}
// Update weights
for (int ii = 0; ii < trainingData[i][0].length; ii++) {
weights[ii] += learningRate * error
* trainingData[i][0][ii];
}
System.out.println("New weights: " + Arrays.toString(weights));
System.out.println();
}
// If there are no errors, stop
if (errorCount == 0) {
System.out
.println("Final weights: " + Arrays.toString(weights));
System.exit(0);
}
}
}
}
编辑:我认为问题来自计算输出的代码片段。它应该被翻转,以便如果总和大于阈值,则输出为1,否则为0。
// Calculate output
int output = 0;
if (weightedSum > threshold) {
output = 1;
}
答案 0 :(得分:1)
我已经运行了你的代码并在(errorCount == 0)检查之前添加了一行:
System.out.println(errorCount);
这似乎在6到7之间振荡,这意味着神经网络总是生成无效的训练数据估计,无论训练量是多少。如果培训数据没有达到100%正确的训练数据,那么预计这将永远持续下去。
希望这有帮助!
答案 1 :(得分:1)
您的错误可能是积极的,也可能是消极的。在第一次运行中,错误为-1。因此,errorCount会递增,并且永远不会执行退出循环的代码。
完整培训的条件应该基于错误本身,而不是错误计数。当错误达到最低水平(您将根据您的输入设置)时,培训将被视为已完成。