初识Kaggle竞赛:用LeNet实现Digit Recongizer

分析赛题

1.本题任务为实现手写数字识别
2.属于典型的多分类任务
3.主要应用Neural NetworkDecision Tree等算法
4.使用pandasnumpykeras等常用库完成任务
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网络,网络结构如下图所示:

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,即不写入行索引。默认写入列名。

在竞赛页面提交结果文件即可。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值