天天看点

keras解决kaggle-手写体数字识别

上一篇是用tensorflow完成的,发现tensorflow的代码量比较多。因为tensorflow是比较低层次的库,而keras可以使用tensorflow为后端,实现模型起来代码会较少一点,而且也便于我们增加模型的深度。总的来说,keras更适合于上手。得到的成绩比tensorflow稍高一点

首先数据处理与用tensorflow的差不多。

#引入所需要的库
import numpy as np
import pandas as pd
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers.convolutional import Convolution2D
from keras.layers.convolutional import MaxPooling2D
from keras.utils import np_utils
import matplotlib.pyplot as plt
from keras.constraints import maxnorm
from keras.optimizers import SGD
from keras.layers.core import Reshape
import matplotlib.pyplot as plt
%matplotlib inline
           

查看数据

data = pd.read_csv('train.csv')

print('data({0[0]},{0[1]})'.format(data.shape))
print(data.head())
           
keras解决kaggle-手写体数字识别
#切片得到像素,不包括标签。
images = data.iloc[:, :].values
images = images.astype(np.float)

#归一化
images = np.multiply(images,  / )

print('images({0[0]},{0[1]})'.format(images.shape))

image_size = images.shape[]

# in this case all images are square
image_width = image_height = np.ceil(np.sqrt(image_size)).astype(np.uint8)
>>>images(,)
           
#获得标签
labels = data.iloc[:,].values
#转化为one-hot vectors,这在分类中很有好处
labels = np_utils.to_categorical(labels)
labels_count = labels.shape[]
#显示出该向量。
plt.title(labels[])
plt.plot(labels[])
plt.xticks(range());
           
keras解决kaggle-手写体数字识别

划分数据,把训练集分为训练和验证集,验证集可以来评估模型。

#split data into training & validation
validation_images = images[:]
validation_labels = labels[:]

train_images = images[:]
train_labels = labels[:]

print('train_images({0[0]},{0[1]})'.format(train_images.shape))
print('validation_images({0[0]},{0[1]})'.format(validation_images.shape))
>>>train_images(,)
>>>validation_images(,)
           

然后就是搭建模型了。

def larger_model():
    # create model
    model = Sequential()
    #把原来的784,变为28*28*1,变成图像后容易获取特征。
    model.add(Reshape((, , ), input_shape=(, )))
    model.add(Convolution2D(, , , border_mode='valid', input_shape=(, , ), activation='relu'))  
    model.add(MaxPooling2D(pool_size=(, )))
    model.add(Dropout())
    model.add(Convolution2D(, , , activation='relu'))
    model.add(MaxPooling2D(pool_size=(, )))
    model.add(Dropout())
    model.add(Flatten())
    model.add(Dense(, activation='relu'))
    model.add(Dropout())
    model.add(Dense(, activation='relu'))
    model.add(Dropout())
    model.add(Dense(labels_count, activation='softmax'))
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

# build the model
model = larger_model()
# Fit the model
model.fit(train_images, train_labels, validation_data=(validation_images, validation_labels), nb_epoch=, batch_size=, verbose=)
           

这里只展示了前几个epoch

keras解决kaggle-手写体数字识别

最后一步就是将测试数据放入模型中训练。并存储

#testa
test_images = pd.read_csv('test.csv').values
test_images = test_images.astype(np.float)
test_images = np.multiply(test_images,  / )
predictions = model.predict_classes(test_images, verbose=)
submissions=pd.DataFrame({"ImageId": list(range(,len(predictions)+)),
                         "Label": predictions})
submissions.to_csv("DR.csv", index=False, header=True)
           

与上一篇tensorflow相比,keras将更多的操作封装了,大大地减少了代码量。还可以将更多的方法运用到这里,比如BN层,或者是可以多加入卷积层或者是fc层。等比较好后再来更新。

继续阅读