分类模型:
分类模型涉及的一个比较关键的问题就是输出的10维向量是如何与具体的类别挂钩的。实际上:10维向量的每一位都代表一类,在对于训练集的表达中,如果输入数据是0,则10维向量的第一位赋值为1,其余均为0。即0对应[1,0,0,0,0,0,0,0,0,0]。MLP模型训练完成后,就需要对用户输入的数据所属类别进行判定。这时得到的输出数据基本不可能是正好的所属类为1,其他位置为0。那具体的分类方法就是判断这10位中哪一位最大,则这个输入就属于哪一类。
test_sample = test_set.row(tsample);
//分类器的输出
nnetwork.predict(test_sample, classificationResult);
//输出向量中最大的值即为样本所属的类
// 以下的工作就是找到最大的数是哪个
int maxIndex = 0;
float value=0.0f;
float maxValue=classificationResult.at<float>(0,0);
for(int index=1;index<CLASSES;index++)
{
value = classificationResult.at<float>(0,index);
if(value>maxValue)
{
maxValue = value;
maxIndex=index;
}
}
printf("Testing Sample %i -> class result (digit %d)\n", tsample, maxIndex);
测试集:
测试集是用来测试训练好的模型是否有良好的泛化性,即是否能识别训练集以外的数据。所以这里就要求训练集与测试集最好不要有相同的图片。如果测试结果不满意,则需要增加训练集重新训练或者调整MLP的参数。