大家好, 我目前正在坚持这样描述的学校项目:
你的程序应该在in.csv文件中读取,并调整感知器的权重,以便在给定训练的输入时,它提供相应的输出。
实际上,在训练ANN时,错误可能永远不会变为零;我们的目标是希望能够足够聪明地识别大多数情况。对于此项目,启动时的错误为5%或0.05。例如,这意味着人工神经网络正确识别了95/100的输入,05/100被错误地分类。看看你是否可以修改ANN训练过程的参数,使其优于5%,但是你的程序不应该在500,000次迭代后继续尝试修改权重。
样品运行:C:\ percy in.csv 100 5 10
其中可执行文件是percy.exe,输入文件是in.csv,学习率是100/1000 = 0.100,错误是5/100,最大迭代是数千,所以10对应10,000。< / p>
根据以下示例格式化输入文件。行中的前16个字符表示传感器输入,最后一个字符始终为0或1,表示输入对应的类。
0000000001000000,0
0000000001000001,1
0000000001000010,1
0000000001000011,1
0000000001000100,1
这几个数字是正在使用的数据集的一部分,其余的数据集是类似的整数
所以输出应该是这样的:
iterationError = 0.023437500,errCnt = 3,repNum = 72
重量[00]:+ 0.00661wt%[01]:+0.00431wt%[02]:+ 0.00011wt%[03]:+0.00814wt [04]:+ 0.00198wt%[05]:+0.00470wt%[06]:+ 0.00356wt%[07]:+0.00435
wt [08]:+ 0.00761wt%[09]:+0.52254wt%[10]:+ 0.00120wt%[11]: - 0.01169
wt [12]: - 0.00937 wt [13]: - 0.00281 wt [14]: - 0.00157 wt [15]: - 0.00217
STOP *****(将wt [10]设置为0.5232)
但是,当我通过读取.csv数据集运行我的代码(下面)时,程序会一直运行,直到它达到10k次迭代并且错误没有改变,而且我并不完全是确定我的循环或计算可能出错。另外我应该注意,我当前的代码还没有代表正确的输出。
非常感谢任何帮助,谢谢
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define LEARNING_RATE 0.1
#define MAX_ITERATION 10000
float randomFloat()
{
return (float)rand() / (float)RAND_MAX;
}
int calculateOutput(float weights[], int x)
{
float sum = x * weights[0] + weights[1];
return (sum >= 0) ? 1 : -1;
}
int main(int argc, char *argv[])
{
srand(time(NULL));
float weights[2], localError, globalError, MAX_ERROR = 0.05;
float x[208];
int outputs[208], patternCount, i, p, iteration, output;
FILE *fp;
if ((fp = fopen("in.csv", "r")) == NULL) {
printf("Cannot open file.\n");
exit(1);
}
i = 0;
while (fscanf(fp, "%f,%d", &x[i], &outputs[i]) != EOF) {
i++;
}
patternCount = i;
weights[0] = randomFloat();
weights[1] = randomFloat();
iteration = 0;
do {
printf(" Iteration: %d ***********************************\n", iteration);
iteration++;
globalError = 0;
for (p = 0; p < patternCount; p++) {
output = calculateOutput(weights, x[p]);
localError = outputs[p] - output;
weights[0] += LEARNING_RATE * localError * x[p];
weights[1] += LEARNING_RATE * localError;
globalError += (localError*localError);
printf("%.1f \n", weights[0]);
}
globalError = globalError/((float)patternCount);
printf(" iterationError = %.5f\n", globalError);
} while ((globalError > MAX_ERROR) && (i < MAX_ITERATION));
return 0;
}