跳转至

14.6多分类任务真实案例

14.6 多分类任务 - MNIST手写体识别⚓︎

14.6.1 数据读取⚓︎

把 "ch12-MultipleLayerNetwoek\HelperClass2\data\" 目录下的四个 MNIST 相关的文件拷贝到 "ch14-DnnBasic\ExtendedDataReader\data\" 目录下。

MNIST数据本身是图像格式的,我们用mode="vector"去读取,转变成矢量格式。

def LoadData():
    print("reading data...")
    dr = MnistImageDataReader(mode="vector")
    ......

14.6.2 搭建模型⚓︎

一共4个隐层,都用ReLU激活函数连接,最后的输出层接Softmax分类函数。

图14-18 完成MNIST分类任务的抽象模型

以下是主要的参数设置:

if __name__ == '__main__':
    dataReader = LoadData()
    num_feature = dataReader.num_feature
    num_example = dataReader.num_example
    num_input = num_feature
    num_hidden1 = 128
    num_hidden2 = 64
    num_hidden3 = 32
    num_hidden4 = 16
    num_output = 10
    max_epoch = 10
    batch_size = 64
    learning_rate = 0.1

    params = HyperParameters_4_0(
        learning_rate, max_epoch, batch_size,
        net_type=NetType.MultipleClassifier,
        init_method=InitialMethod.MSRA,
        stopper=Stopper(StopCondition.StopLoss, 0.12))

    net = NeuralNet_4_0(params, "MNIST")

    fc1 = FcLayer_1_0(num_input, num_hidden1, params)
    net.add_layer(fc1, "fc1")
    r1 = ActivationLayer(Relu())
    net.add_layer(r1, "r1")
    ......
    fc5 = FcLayer_1_0(num_hidden4, num_output, params)
    net.add_layer(fc5, "fc5")
    softmax = ClassificationLayer(Softmax())
    net.add_layer(softmax, "softmax")

    net.train(dataReader, checkpoint=0.05, need_test=True)
    net.ShowLossHistory(xcoord=XCoordinate.Iteration)

14.6.3 运行结果⚓︎

我们设计的停止条件是绝对Loss值达到0.12时,所以迭代到6个epoch时,达到了0.119的损失值,就停止训练了。

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

图14-19是训练过程图示,下面是最后几行的打印输出。

......
epoch=6, total_iteration=5763
loss_train=0.005559, accuracy_train=1.000000
loss_valid=0.119701, accuracy_valid=0.971667
time used: 17.500738859176636
save parameters
testing...
0.9697

最后用测试集得到的准确率为96.97%。

代码位置⚓︎

ch14, Level6