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