本小节通过tflearn库的CNN算法来识别验证码,由于本书多篇章节讲解MNIST图集的识别算法,故而本节主要重点关注在CNN的使用方法。
1、数据集特征化
X, Y, testX, testY = mnist.load_data(one_hot=True)
X = X.reshape([-1, 28, 28, 1])
testX = testX.reshape([-1, 28, 28, 1])
X, mean = du.featurewise_zero_center(X)
testX = du.featurewise_zero_center(testX, mean)
2、CNN模型构建
# Building Residual Network
net = tflearn.input_data(shape=[None, 28, 28, 1])
net = tflearn.conv_2d(net, 64, 3, activation='relu', bias=False)
# Residual blocks
net = tflearn.residual_bottleneck(net, 3, 16, 64)
net = tflearn.residual_bottleneck(net, 1, 32, 128, downsample=True)
net = tflearn.residual_bottleneck(net, 2, 32, 128)
net = tflearn.residual_bottleneck(net, 1, 64, 256, downsample=True)
net = tflearn.residual_bottleneck(net, 2, 64, 256)
net = tflearn.batch_normalization(net)
net = tflearn.activation(net, 'relu')
net = tflearn.global_avg_pool(net)
# Regression
net = tflearn.fully_connected(net, 10, activation='softmax')
net = tflearn.regression(net, optimizer='momentum',
loss='categorical_crossentropy',
learning_rate=0.1)
3、数据集训练
# Training
model = tflearn.DNN(net, checkpoint_path='model_resnet_mnist',
max_checkpoints=10, tensorboard_verbose=0)
model.fit(X, Y, n_epoch=100, validation_set=(testX, testY),
show_metric=True, batch_size=256, run_id='resnet_mnist')
4、运行结果
代码设置为100轮,这里取第7轮的结果看一下,已经达到98%以上,准确率非常高。
......
| Momentum | epoch: 007 | loss: 0.16483 - acc: 0.9811 -- iter: 54016/55000
Training Step: 1502 | total loss: 0.15167 | time: 908.693s
| Momentum | epoch: 007 | loss: 0.15167 - acc: 0.9830 -- iter: 54272/55000
Training Step: 1503 | total loss: 0.14124 | time: 912.850s
| Momentum | epoch: 007 | loss: 0.14124 - acc: 0.9839 -- iter: 54528/55000
Training Step: 1504 | total loss: 0.13150 | time: 916.792s
| Momentum | epoch: 007 | loss: 0.13150 - acc: 0.9843 -- iter: 54784/55000
Training Step: 1505 | total loss: 0.12219 | time: 935.480s
| Momentum | epoch: 007 | loss: 0.12219 - acc: 0.9851 | val_loss: 0.04868 - val_acc: 0.9882 -- iter: 55000/55000
5、完整代码
from __future__ import division, print_function, absolute_import
import tflearn
import tflearn.data_utils as du
# Data loading and preprocessing
import tflearn.datasets.mnist as mnist
X, Y, testX, testY = mnist.load_data(one_hot=True)
X = X.reshape([-1, 28, 28, 1])
testX = testX.reshape([-1, 28, 28, 1])
X, mean = du.featurewise_zero_center(X)
testX = du.featurewise_zero_center(testX, mean)
# Building Residual Network
net = tflearn.input_data(shape=[None, 28, 28, 1])
net = tflearn.conv_2d(net, 64, 3, activation='relu', bias=False)
# Residual blocks
net = tflearn.residual_bottleneck(net, 3, 16, 64)
net = tflearn.residual_bottleneck(net, 1, 32, 128, downsample=True)
net = tflearn.residual_bottleneck(net, 2, 32, 128)
net = tflearn.residual_bottleneck(net, 1, 64, 256, downsample=True)
net = tflearn.residual_bottleneck(net, 2, 64, 256)
net = tflearn.batch_normalization(net)
net = tflearn.activation(net, 'relu')
net = tflearn.global_avg_pool(net)
# Regression
net = tflearn.fully_connected(net, 10, activation='softmax')
net = tflearn.regression(net, optimizer='momentum',
loss='categorical_crossentropy',
learning_rate=0.1)
# Training
model = tflearn.DNN(net, checkpoint_path='model_resnet_mnist',
max_checkpoints=10, tensorboard_verbose=0)
model.fit(X, Y, n_epoch=100, validation_set=(testX, testY),
show_metric=True, batch_size=256, run_id='resnet_mnist')