输出层的神经元个数,一般应该与输出结果的分类数相同。
数字手写识别,是一个10分类任务,共有10种不同的输出,因此,输出层就应该拥有10个神经元。
当输出层的某个神经元被激活时,就代表图片被识别为其所代表的数字。
这里一般用softmax函数实现多分类。
先把来自上一层的输入,映射为0~1之间的实数,进行归一化处理,保证多分类的概率之和刚好为1。
然后用softmax分别计算10个数字的概率,选择其中最大的一个,激活对应的神经元,完成整个网络的输出。
至于隐藏层的数量,以及其中包含的神经元数目,并没有什么一定的规范,完全可以随意设置。
隐藏层越多,模型的学习能力和表现力就越强,但也更加容易产生过拟合。
所以需要权衡利弊,选取一个最优的方案。
起步阶段,暂时先设定一个隐藏层,其中包含100个神经元,然后在实践中,根据反馈效果慢慢调整……
确定了网络的拓扑结构后,接下来就可以编写代码并调试了。
调试通过,就加载数据集,进行训练,最后用训练好的网络,进行预测。
就是这么一个过程。
江寒先写了一个标准的fcn模板,让其能利用训练数据集,进行基本的训练。
理论上来说,可以将18万条数据,整体放进网络中进行训练。
但这种做法有很多缺点。
一来消耗内存太多,二来运算压力很大,训练起来速度极慢。
更严重的是,容易发生严重的过拟合。
要想避免这些问题,就要采取随机批次训练法。