{"cells":[{"metadata":{"collapsed":true,"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":false},"cell_type":"code","source":"#导入所需包\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mimg\nimport seaborn as sns\n%matplotlib inline\nnp.random.seed(2)#设置随机数种子\n\n#导入模型\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import confusion_matrix\nfrom keras.utils.np_utils import to_categorical\nfrom keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPool2D\nfrom keras.optimizers import RMSprop\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.callbacks import ReduceLROnPlateau\nfrom keras.models import Sequential\nimport itertools\nprint(os.listdir(\"../input\"))\nsns.set(style='white',context='notebook',palette='deep')","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":false},"cell_type":"code","source":"#数据准备\ntrain=pd.read_csv('../input/train.csv')#读入数据\ntest=pd.read_csv('../input/test.csv')","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"422e2371-85c2-4560-a02b-67657fb1713d","_uuid":"eaaa7b6282a833debf545796c08aaa19cd0b0bfb","trusted":false},"cell_type":"code","source":"Y_train=train['label']#分离标签\nX_train=train.drop('label',axis=1)\ndel train\ng=sns.countplot(Y_train)#展示标签情况\nY_train.value_counts()#统计标签情况","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"7c054fe9-d3d5-4678-91f1-956438977c71","_uuid":"392d5c19976ca44cb3bce5d5ce78d5626455f4b1","trusted":false},"cell_type":"code","source":"#查看数据缺失情况\nX_train.isnull().any().describe()","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"9dbf0d95-0865-4a57-a06e-0f22b70081b1","_uuid":"771ae7807460f98a637f54efc42259d07434ddbc","trusted":false},"cell_type":"code","source":"test.isnull().any().describe()","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"02d00d5c-2fe0-4f34-b9ad-ff73e3f12f57","_uuid":"9f1509902da586741659927cf32af2af66af84c9","trusted":false},"cell_type":"code","source":"#正则化数据，减少光线的影响，同时加快计算速度\nX_train=X_train/255.0\ntest=test/255.0","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"ddac48b1-b391-4bec-b53e-9dc4234029cc","_uuid":"e467a6bae07dc343debc541f3b52e62d0b1ab5a3","trusted":false},"cell_type":"code","source":"#调整数据格式，784*1转换成28*28*1\nX_train=X_train.values.reshape(-1,28,28,1)\ntest=test.values.reshape(-1,28,28,1)\n","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"e4a90866-3457-43f0-8eb3-b3c0a2038391","_uuid":"f6f6e3930fbe470b16bc03398205d0c8670f95fa","trusted":false},"cell_type":"code","source":"#标签编码，one-hot形式\nY_train=to_categorical(Y_train,num_classes=10)","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"4af7dcad-dd98-4167-88cc-37ca1c7f613b","_uuid":"20ec9071c829361bff7a5392836112c40a1d96fb","trusted":false},"cell_type":"code","source":"#生成训练数据和验证数据集\nrandom_seed=2\nX_train,X_val,Y_train,Y_val=train_test_split(X_train,Y_train,test_size=0.1,random_state=random_seed)","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"e9ca6133-185b-49b0-87fb-3c0d387850c7","_uuid":"390a44d9e4a92cc1bf4ac59713e646f203c3cd60","trusted":false},"cell_type":"code","source":"#展示数据,keyerror\ng=plt.imshow(X_train[0][:,:,0])","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"3f661e95-9079-4d75-a9c8-4ed235979131","_uuid":"28338554e621fe0bd0726b07c8aafaf125b92348","trusted":false},"cell_type":"code","source":"#定义CNN模型\nmodel=Sequential()\nmodel.add(Conv2D(filters=32,kernel_size=(5,5),padding='Same',activation='relu',input_shape=(28,28,1)))\nmodel.add(Conv2D(filters=32,kernel_size=(5,5),padding='Same',activation='relu'))\nmodel.add(MaxPool2D(pool_size=(2,2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Conv2D(filters=64,kernel_size=(3,3),padding='Same',activation='relu'))\nmodel.add(Conv2D(filters=64,kernel_size=(3,3),padding='Same',activation='relu'))\nmodel.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Flatten())\nmodel.add(Dense(256,activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(10,activation='softmax'))","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"3eb781dd-c3c7-4b5d-8ade-d239a3301b9f","_uuid":"4118571efc4cdfadae6c30e88fa2827034784ae1","trusted":false},"cell_type":"code","source":"#设置优化器\noptimizer=RMSprop(lr=0.001,rho=0.9,epsilon=1e-08,decay=0.0)\n","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"697accb8-88d8-431e-ac43-3574ab62ab55","_uuid":"12119ec281b258effdcbdd52d827fb320caa7ff8","trusted":false},"cell_type":"code","source":"#编译模型\nmodel.compile(optimizer=optimizer,loss='categorical_crossentropy',metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"770482ad-4992-4ea7-9d53-866b4553d9b1","_uuid":"b596f228eba5275166bff65ae89794b06c43e238","trusted":false},"cell_type":"code","source":"#设置学习率退化器,动态改变学习率\nlearning_rate_reduction=ReduceLROnPlateau(monitor='val_acc',patience=3,verbose=1,factor=0.5,min_lr=0.00001)\nepochs=28#设置为30:99.514%\nbatch_size=86","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"a2e56981-cd07-4587-9f16-e14df2537331","_uuid":"7594c16da9a4f16c5522e8df78065c377ee2ee3f","trusted":false},"cell_type":"code","source":"#数据增强\ndatagen=ImageDataGenerator(\n    featurewise_center=False,#设置输入均值为0在整个数据集上\n    samplewise_center=False,#设置每个样本均值为0\n    featurewise_std_normalization=False,#按照数据集的std分割输入\n    samplewise_std_normalization=False,#按照每个样本的std分割输入\n    zca_whitening=False,#应用ZCA漂白\n    rotation_range=10,#旋转度数[0,180]\n    zoom_range=0.1,#随机放大图片\n    width_shift_range=0.1,#水平方向随机移动（以整个图像宽度）\n    height_shift_range=0.1,#垂直方向随机移动\n    horizontal_flip=False,#随机水平翻动\n    vertical_flip=False#随机垂直翻动\n                          )\ndatagen.fit(X_train)","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"99c97f90-452a-456f-b17f-3a614df6b033","_uuid":"ae51d470b8f0a15f3edc05345f37b8875f7e8235","trusted":false},"cell_type":"code","source":"# Fit the model\nhistory = model.fit_generator(datagen.flow(X_train,Y_train, batch_size=batch_size),\n                              epochs = epochs, validation_data = (X_val,Y_val),\n                              verbose = 2, steps_per_epoch=X_train.shape[0] // batch_size\n                              , callbacks=[learning_rate_reduction])","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"92c7f4c7-63b8-495d-8ebd-18a354540f83","_uuid":"b1b8ad0894482131c5bc27739588c7b527692b15","trusted":false},"cell_type":"code","source":"#训练模型\n#history=model.fit_generator(datagen.flow(X_train,Y_train,batch_size=batch_size),\n#                            epochs=epochs,validation_data=(X_val,Y_val),\n#                            verbose=2,steps_per_epoch=X_train.shape[0],\n#                           callbacks=[learning_rate_reduction])\n","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"43cf3f13-e4e6-495c-9030-e0da6bdbc5dd","_uuid":"a72f503b532ee6e586b0dee32fd4f2ca1ecec90c","trusted":false},"cell_type":"code","source":"#评估模型\n#训练和验证曲线\nfig,ax=plt.subplots(2,1)\nax[0].plot(history.history['loss'],color='b',label='Training loss')\nax[0].plot(history.history['val_loss'],color= 'r',label='validation loss',axes=ax[0])\nlegend=ax[0].legend(loc='best',shadow=True)\n\nax[1].plot(history.history['acc'],color='b',label='Training accuracy')\nax[1].plot(history.history['val_acc'],color='r',label='Validation accuracy')\nlegend=ax[1].legend(loc='best',shadow=True)","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"a2a0ce03-8454-4657-b208-293e5a705728","_uuid":"a11b94e0a50321b13e9095c699d13f5f338059c0","trusted":false},"cell_type":"code","source":"#混淆函数\ndef plot_confusion_matrix(cm,classes,normalize=False,title='Confusion Matrix',cmap=plt.cm.Blues):\n    plt.imshow(cm,interpolation='nearest',cmap=cmap)\n    plt.title(title)\n    plt.colorbar()\n    tick_marks=np.arange(len(classes))\n    plt.xticks(tick_marks,classes,rotation=45)\n    plt.yticks(tick_marks,classes)\n    \n    if(normalize):\n        cm=cm.astype('float')/cm.sum(axis=1)[:,np/newaxis]\n        \n    thresh=cm.max()/2.\n    for i,j in itertools.product(range(cm.shape[0]),range(cm.shape[1])):\n        plt.text(j,i,cm[i,j],horizontalalignment='center',color='white' if cm[i,j]>thresh else 'black')\n    plt.tight_layout()\n    plt.ylabel('True label')\n    plt.xlabel('Predicted label')\n\nY_pred=model.predict(X_val)#预测值\nY_pre_classes=np.argmax(Y_pred,axis=1)#转成one-hot向量\nY_true=np.argmax(Y_val,axis=1)#真实值one-hot向量\nconfusion_mtx=confusion_matrix(Y_true,Y_pre_classes)#生成混淆矩阵\nplot_confusion_matrix(confusion_mtx,classes=range(10))\n","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"aa48cbdf-d679-4a55-99a5-7dc34dbcbc75","_uuid":"dc6abe0f42e87f0139a7b1b41c1830830766553f","trusted":false},"cell_type":"code","source":"#预测结果\nresults=model.predict(test)\nresults=np.argmax(results,axis=1)\nresults=pd.Series(results,name='Label')\n","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_cell_guid":"ce9dd0a1-bf81-4233-b12f-ad99706f4bec","_uuid":"1d73b4c5037372151841119b7b5b012efafbb389","trusted":false},"cell_type":"code","source":"submission=pd.concat([pd.Series(range(1,28001),name='ImageId'),results],axis=1)\nsubmission.to_csv('result.csv',index=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}