跳转至

10.5 实现双弧形二分类

10.5 实现双弧形二分类⚓︎

逻辑异或问题的成功解决,可以带给我们一定的信心,但是毕竟只有4个样本,还不能发挥出双层神经网络的真正能力。下面让我们一起来解决问题二,复杂的二分类问题。

10.5.1 代码实现⚓︎

主过程代码⚓︎

if __name__ == '__main__':
    ......
    n_input = dataReader.num_feature
    n_hidden = 2
    n_output = 1
    eta, batch_size, max_epoch = 0.1, 5, 10000
    eps = 0.08

    hp = HyperParameters2(n_input, n_hidden, n_output, eta, max_epoch, batch_size, eps, NetType.BinaryClassifier, InitialMethod.Xavier)
    net = NeuralNet2(hp, "Arc_221")
    net.train(dataReader, 5, True)
    net.ShowTrainingTrace()

此处的代码有几个需要强调的细节:

  • n_input = dataReader.num_feature,值为2,而且必须为2,因为只有两个特征值
  • n_hidden=2,这是人为设置的隐层神经元数量,可以是大于2的任何整数
  • eps精度=0.08是后验知识,笔者通过测试得到的停止条件,用于方便案例讲解
  • 网络类型是NetType.BinaryClassifier,指明是二分类网络

10.5.2 运行结果⚓︎

经过快速的迭代,训练完毕后,会显示损失函数曲线和准确率曲线如图10-15。

图10-15 训练过程中的损失函数值和准确率值的变化

蓝色的线条是小批量训练样本的曲线,波动相对较大,不必理会,因为批量小势必会造成波动。红色曲线是验证集的走势,可以看到二者的走势很理想,经过一小段时间的磨合后,从第200个epoch开始,两条曲线都突然找到了突破的方向,然后只用了50个epoch,就迅速达到指定精度。

同时在控制台会打印一些信息,最后几行如下:

......
epoch=259, total_iteration=18719
loss_train=0.092687, accuracy_train=1.000000
loss_valid=0.074073, accuracy_valid=1.000000
W= [[ 8.88189429  6.09089509]
 [-7.45706681  5.07004428]]
B= [[ 1.99109895 -7.46281087]]
W= [[-9.98653838]
 [11.04185384]]
B= [[3.92199463]]
testing...
1.0
一共用了260个epoch,达到了指定的loss精度(0.08)时停止迭代。看测试集的情况,准确度1.0,即100%分类正确。

代码位置⚓︎

ch10, Level3