[keras]用CNN来刷Kaggle的digit手写数据集比赛
来源:互联网 发布:pdf修改软件 编辑:程序博客网 时间:2024/05/22 02:30
keras实战
keras是比较适合新手的深度框架,不说废话,一切代码全是手敲,有问题可以留言共同交流。
1.处理数据
从kaggle官方下载数据集,地址:https://www.kaggle.com/c/digit-recognizer/data
拿到手之后是主要是train.csv 和 test.csv ,提交结果类型是out.csv
import kerasfrom keras.models import Sequentialfrom keras.layers import Dense,Dropout,Flatten,MaxPool2D,Conv2Dimport pandas as pdimport numpy as npfrom keras import backend as K
首先import 需要的包
BATCH_SIZE = 128 #每次训练或者test时的大小NUM_CLASSES = 10 # 结果分成十类 从 0-9EPOCHS = 12 # 我们训练12轮img_rows ,img_cols = 28,28 图片原始大小时 28 * 28 其实我们拿到的时已经拉平的数据
定义一些常量
train_data = pd.read_csv('train.csv') # 读取train数据test_data = pd.read_csv('test.csv') # 读取test 数据train_x ,train_y = train_data.values[:,1:] , train_data.values[:,0] # 分割数据把label拿出来test_x = test_data.values # ## 将 train_y 进行都热向量编码 ont_hot编码 其实就是把结果搞成稀疏矩阵train_y = keras.utils.np_utils.to_categorical(train_y,num_classes=NUM_CLASSES)print(train_y)
将数据进行一些shape变换,因为一会要用来做卷积
train_x = np.reshape(train_x,[-1, 28, 28, 1])print(np.shape(train_x))test_x = np.reshape(test_x,[-1, 28, 28, 1])print(np.shape(test_x))
这个时候我们打印一下 keras的图片格式
print(K.image_data_format())
数据归一化
train_x = train_x.astype('float32') / 255test_x = test_x.astype('float32') / 255input_shape = (img_rows, img_cols, 1)
构造网络模型 我们采用序贯模型
model = keras.models.Sequential()
增加 通道为32 的 卷积核大小为3 的卷积 激活函数为relu 输入图片的大小为 28 * 28 * 1
model.add(Conv2D(32,(3,3), activation='relu', input_shape=(28,28,1) ))
再来一层
model.add(Conv2D(64,(3,3), activation='relu', input_shape=(28,28,1) ))
加一个 池化层 和dropout层
model.add(MaxPool2D(pool_size=(2,2)))model.add(Dropout(0.5))
## 增加flattern层 把结果拉成一个列向量model.add(Flatten())## 加一个全连接层model.add(Dense(128,activation='relu'))model.add(Dropout(0.5))## 再加一个全链接层 softmax来预测全概率model.add(Dense(NUM_CLASSES,activation='softmax'))#编译模型model.compile(loss=keras.metrics.categorical_crossentropy,optimizer=keras.optimizers.Adam(),metrics=['accuracy'])model.fit(train_x, train_y, batch_size=BATCH_SIZE, epochs=EPOCHS, verbose=1)CLASSES = model.predict_classes(test_x,batch_size=BATCH_SIZE)#print(CLASSES)#输出结果 在kaggle上可以直接提交pd.DataFrame( {"ImageId": range(1, len(CLASSES) + 1), "Label": CLASSES}).to_csv('output.csv', index=False, header=True)print('done.')
完整代码在这里:
# coding: utf-8## kears mnistimport kerasfrom keras.models import Sequentialfrom keras.layers import Dense,Dropout,Flatten,MaxPool2D,Conv2Dimport pandas as pdimport numpy as npfrom keras import backend as KBATCH_SIZE = 128NUM_CLASSES = 10EPOCHS = 12img_rows ,img_cols = 28,28train_data = pd.read_csv('train.csv')test_data = pd.read_csv('test.csv')train_x ,train_y = train_data.values[:,1:] , train_data.values[:,0]test_x = test_data.values## 将 train_y 和test_y 进行都热向量编码train_y = keras.utils.np_utils.to_categorical(train_y,num_classes=NUM_CLASSES)## 将 traion_x 和 test_x 进行reshapetrain_x = np.reshape(train_x,[-1, 28, 28, 1])print(np.shape(train_x))test_x = np.reshape(test_x,[-1, 28, 28, 1])print(np.shape(test_x))print(K.image_data_format())## 归一化train_x = train_x.astype('float32') / 255test_x = test_x.astype('float32') / 255input_shape = (img_rows, img_cols, 1)## 构造网络模型model = keras.models.Sequential()# 增加 通道为32 的 卷积核大小为3 的卷积 激活函数为relu 输入图片的大小为 28 * 28 * 1model.add(Conv2D(32,(3,3), activation='relu', input_shape=(28,28,1) ))model.add(Conv2D(64,(3,3), activation='relu', input_shape=(28,28,1) ))## 池化层model.add(MaxPool2D(pool_size=(2,2)))# 增加dropout层model.add(Dropout(0.5))## 增加flattern层 把结果拉成一个列向量model.add(Flatten())## 加一个全连接层model.add(Dense(128,activation='relu'))model.add(Dropout(0.5))## 再加一个全链接层 softmax来预测全概率model.add(Dense(NUM_CLASSES,activation='softmax'))## 编译模型model.compile(loss=keras.metrics.categorical_crossentropy,optimizer=keras.optimizers.Adam(),metrics=['accuracy'])model.fit(train_x, train_y, batch_size=BATCH_SIZE, epochs=EPOCHS, verbose=1)CLASSES = model.predict_classes(test_x,batch_size=BATCH_SIZE)pd.DataFrame( {"ImageId": range(1, len(CLASSES) + 1), "Label": CLASSES}).to_csv('output.csv', index=False, header=True)print('done.')
模型可视化 //TODO 这一点还没找到可靠的解决方案
我们希望能够看到自己构建的model到底长什么样子,keras提供了可视化的方法:
注意这个错误:
Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.
解决方案:http://blog.csdn.net/hahajinbu/article/details/72859849
from keras.utils import plot_modelplot_model(model, to_file='model.png')
思考TODO
1.如何进一步的提高准确率,在之前用PCA和SVM配合使用的情况效果也不错,是否可以用PCA先进行一下数据特征抽取和降低维度,是否对CNN有所帮助
2.训练数据时耗时并且麻烦的,是否可以直接用迁移学习的迁移模型比如VGG等
3….
代码是比较简单的,但是背后的知识点还是很多的
阅读全文
0 0
- [keras]用CNN来刷Kaggle的digit手写数据集比赛
- Kaggle Digit Recognizer使用keras实现手写数字识别 A1
- 使用CNN模型来测试Kaggle入门比赛
- kaggle的手写识别比赛(python sklearn-KNN)
- 在Kaggle手写数字数据集上使用Spark MLlib的RandomForest进行手写数字识别
- kaggle-Digit Recognition(手写数字识别)
- Keras基于Cifar-10数据集的CNN实现
- keras下基于mnist数据集的cnn
- keras 实现CNN 进行手写字符识别
- Keras入门例子:cnn实现手写识别
- Kaggle Digit Recognizer 基于sklearn实现的手写数字识别 for MNIST data
- 在Kaggle手写数字数据集上使用Spark MLlib的朴素贝叶斯模型进行手写数字识别
- kaggle数据挖掘比赛经验
- Kaggle入门模板:以手写识别Digit Recognizer为例
- DeepLearning&Keras学习笔记3__mnist数据集CNN
- Keras入门课3 -- 使用CNN识别cifar10数据集
- 03-Keras之用MNIST数据集训练一个CNN
- Keras入门课2 -- 使用CNN识别mnist手写数字
- Shiro进认证不进授权的情况之一及解决方法
- VLAN及划分
- 例题8-17 不公平竞赛(Foul Play, ACM/ICPC NWERC 2012, UVa1609)
- php简单数字验证码
- transform、transition方法详解及scale、zoom差异性说明
- [keras]用CNN来刷Kaggle的digit手写数据集比赛
- ros kinetic 安装 以及 rosdep init 出错
- JVM垃圾回收机制
- 奔小康赚大钱
- Retrofit源码解读(一)--Retrofit简单流程
- VC目标代码的阅读理解2
- 使用cJSON解析JSON字符串
- 蓝桥杯 合并石子
- 数据库2-设计