这是我用来在具有 10 个神经元的单层感知器上使用反向传播算法对 MNist 数据库的手写数字进行分类的代码。数字保存在扩展1
的(最后一列中的)整数 2d 矩阵images[60000][785]
和中的标签中int tlabels[60000][10]
。每个标签1
在对应于数字值的位置包含 a ,0
在其余部分包含 's(数字是0
- 9
)。
// weights1[785][10] has been initialized to random values on [-0.5,0.5] in the constructor.
// bias of neurons have been taken into account as the last row of the matrix.
// b is the learning rate , equal to 0.5.
const int Ninput=784;
const int Noutput=10;
float result[Noutput];
for (int epoch =0 ; epoch < 30 ; epoch ++) {
float error =0;
for (int sample=0 ; sample < 1000 ; sample++) {
for (int output= 0 ; output< Noutput; output++) {
float sum = 0;
for (int input = 0 ; input < Ninput+1; input++)
sum += weights1[input][output]*images[sample][input];
result[output] = sum;
}
float delta[Noutput];
for (int output= 0 ; output< Noutput; output++) {
delta[output]=(tlabels[sample][output]-sigmoid(result[output]))*sigmoidDerivative(result[output]);
error+= pow((tlabels[sample][output]-sigmoid(result[output])),2.0);
}
for (int output= 0 ; output< Noutput; output++)
for (int input=0 ; input < Ninput+1 ; input++)
weights1[input][output] = weights1[input][output] +b*delta[output]*images[sample][input];
}
cout << error / 1000.0;
}
变量收敛到 0.9 ,这error
意味着此代码将所有数字分类到其中一个类中,即使样本在类之间平均分布。代码中是否存在逻辑错误,或者我应该尝试不同的参数集直到结果变得可以接受?