前言
深度学习在计算机视觉领域全面超过了传统的机器学习,利用kaggle的Digit Recognizer竞赛来介绍卷积神经网络识别手写数字的基本思路。
数据集
MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片,它也包含每一张图片对应的标签,告诉我们这个是数字几。
创建CNN模型
深度学习解决图像分类问题的基本模型:
- Covolution Layer:卷积层
- Pooling Layer:池化层
- Fully Connected Layer:全连接层
def VGG16():
input = Input(shape=(28, 28, 1))
x = Conv2D(64, (3, 3))(input)
x = Conv2D(64, (3, 3))(x)
x = MaxPooling2D(pool_size=(2,2), strides=(2, 2))(x)
x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D(pool_size=(2,2), strides=(2, 2))(x)
x = Conv2D(256, (3, 3), activation='relu', padding='same')(x)
x = Conv2D(256, (3, 3), activation='relu', padding='same')(x)
x = Conv2D(256, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D(pool_size=(2,2), strides=(2, 2))(x)
x = Conv2D(512, (3, 3), activation='relu', padding='same')(x)
x = Conv2D(512, (3, 3), activation='relu', padding='same')(x)
x = Conv2D(512, (3, 3), activation='relu', padding='same')(x) #x = MaxPooling2D(pool_size=(2,2), strides=(2, 2))(x)
#x = Conv2D(512, (3, 3), activation='relu', padding='same')(x)
#x = Conv2D(512, (3, 3), activation='relu', padding='same')(x)
#x = Conv2D(512, (3, 3), activation='relu', padding='same')(x)
# 展开像素
x = Flatten()(x) #x = Dense(4096, activation='relu')(x)
#x = Dense(4096, activation='relu')(x)
x = Dense(2048, activation='relu')(x)
x = Dense(1000, activation='relu')(x)
output = Dense(10, activation='softmax')(x)
cnn_model = Model(input, output) return cnn_model
上面的代码用Keras实现的CNN模型,这个模型结构是参考了VGG16的模型。(把注释去掉就是完整的VGG16模型,我因为笔记本显存只有2G跑不动,所以简化了网络。)
结果
最后,用表现最好的模型进行预测,并提交到Kaggle。当然喽,成绩很低,有计算资源的可以试试把注释去掉,应该会有一定的提高。
欢迎关注微信公众号:kaggle数据分析,也可以加我们的群,一起打比赛。