分析赛题
1.本题任务为实现手写数字识别
2.属于典型的多分类任务
3.主要应用Neural Network,Decision Tree等算法
4.使用pandas,numpy,keras等常用库完成任务
5.赛题内容和数据集见官网kaggle.com
数据导入与处理
1.导入数据处理相关包
import pandas as pd
import numpy as np
2.载入下载好的数据集
path = 'D:\\data\\digit-recognizer\\' #自己数据集保存的位置
train = pd.read_csv(path+'train.csv') #训练集载入
test = pd.read_csv(path+'test.csv') #测试集载入
3.查看数据集大小和内容,便于后续对数据集进行划分等处理
print('train data shape:',train.shape)
print('test data shape:',test.shape)
train data shape: (42000, 785)
test data shape: (28000, 784)
train.head()
通过以上可知,训练集中有42000个样本。train第1列为标签,第2-785列为一张图片的数据(每个图片大小为28×28,在这里以大小为28*28=784的一维形式存储)
4.划分训练数据和标签,并进行格式转换
X_train = train.iloc[:,1:].values.astype('float32') #取出第2-785列作为训练数据,并转换格式
Y_train = train.iloc[:,0].values.astype('int32') #取出第1列作为训练数据的标签,并转换格式
X_test = test.values.astype('float32') #测试集直接转换格式
X_train.shape #查看此时的X_train大小
由于我们采用LeNet网络,因此需要将训练数据转换为网络的输入形式,即(N,W,H,C)。N为数据数量,在此应为42000;W,H为图片大小,在此为28,28;C为通道数,在此为1,若是RGB图像则为3。
X_train = X_train.reshape(X_train.shape[0],28,28,1)
X_test = X_test.reshape(X_test.shape[0],28,28,1)
X_train.shape #输出应为(42000,28,28,1)
5.对标签进行onehot编码
from keras.utils.np_utils import to_categorical
y_train = to_categorical(Y_train,len(np.unique(Y_train)))
print(y_train.shape) #输出应为(42000,10)
6.定义标准化函数
mean = X_train.mean().astype(np.float32)
std = X_train.std().astype(np.float32)
def standard(x):
return (x-mean)/std
对数据进行Z-score标准化,处理后的数据符合标准正态分布。
神经网络模型构建
在数据处理结束后,进行模型构建
1.包导入
from keras.models import Sequential
from keras.layers.core import Lambda , Dense, Flatten
from keras.layers import Convolution2D , MaxPooling2D
from keras.optimizers import Adam
2.模型构建与编译
采用LeNet网络,网络结构如下图所示:
基于上述结构,构建模型如下:
def LeNet_model():
model = Sequential([
Lambda(standard, input_shape=(28,28,1)), #standard为之前定义的标准化函数
Convolution2D(6,(5,5), activation='relu'),
MaxPooling2D((2,2)),
Convolution2D(16,(5,5), activation='relu'),
MaxPooling2D((2,2)),
Flatten(),
Dense(256, activation='relu'),
Dense(120, activation='relu'),
Dense(84, activation='relu'),
Dense(10, activation='softmax')
])
model.compile(optimizer='Adam', loss='categorical_crossentropy',
metrics=['accuracy'])
return model
模型训练
设置learning rate,batchsize,epochs,划分验证集后,开始训练。
%%time
LeNet_model= LeNet_model()
LeNet_model.optimizer.lr=0.01
history = LeNet_model.fit(X_train,y_train, batch_size=128,epochs = 20,validation_split=0.2)
结果如下所示:
结果预测与生成提交文件
1.查看提交示例
sample_submissions = pd.read_csv(path+'sample_submission.csv')
sample_submissions.head(20)
可以看出,示例要求提交的.csv文件有两列,第一列为图片ID,由于测试集有28000个样本,因此ID即为1-28000。第二列为我们预测的结果,即将测试数据加载到模型中所得。
2.生成提交文件
prediction = LeNet_model.predict_classes(X_test, verbose=0)
my_submissions=pd.DataFrame({"ImageId": list(range(1,len(predictions)+1)),
"Label": predictions}) #用DataFrame存储预测结果
my_submissions.to_csv("D:\\data\\digit-recognizer\\submissions.csv", index=False)
#将DataFrame写入submissions.csv,注意参数index为False,即不写入行索引。默认写入列名。
在竞赛页面提交结果文件即可。