现在的许多手写字体识别代码都是基于已有的mnist手写字体数据集进行的,而kaggle需要用到网站上给出的数据集并生成测试集的输出用于提交。这里选择keras搭建卷积网络进行识别,可以直接生成测试集的结果,最终结果识别率大概97%左右的样子。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
# -*- coding: utf-8 -*-
"""
Created on Tue Jun 6 19:07:10 2017
@author: Administrator
"""
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import np_utils
import os
import pandas as pd
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
from keras import backend as K
import tensorflow as tf
# 全局变量
batch_size = 100
nb_classes = 10
epochs = 20
# input image dimensions
img_rows, img_cols = 28 , 28
# number of convolutional filters to use
nb_filters = 32
# size of pooling area for max pooling
pool_size = ( 2 , 2 )
# convolution kernel size
kernel_size = ( 3 , 3 )
inputfile = 'F:/data/kaggle/mnist/train.csv'
inputfile2 = 'F:/data/kaggle/mnist/test.csv'
outputfile = 'F:/data/kaggle/mnist/test_label.csv'
pwd = os.getcwd()
os.chdir(os.path.dirname(inputfile))
train = pd.read_csv(os.path.basename(inputfile)) #从训练数据文件读取数据
os.chdir(pwd)
pwd = os.getcwd()
os.chdir(os.path.dirname(inputfile))
test = pd.read_csv(os.path.basename(inputfile2)) #从测试数据文件读取数据
os.chdir(pwd)
x_train = train.iloc[:, 1 : 785 ] #得到特征数据
y_train = train[ 'label' ]
y_train = np_utils.to_categorical(y_train, 10 )
mnist = input_data.read_data_sets( "MNIST_data/" ,one_hot = True ) #导入数据
x_test = mnist.test.images
y_test = mnist.test.labels
# 根据不同的backend定下不同的格式
if K.image_dim_ordering() = = 'th' :
x_train = np.array(x_train)
test = np.array(test)
x_train = x_train.reshape(x_train.shape[ 0 ], 1 , img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[ 0 ], 1 , img_rows, img_cols)
input_shape = ( 1 , img_rows, img_cols)
test = test.reshape(test.shape[ 0 ], 1 , img_rows, img_cols)
else :
x_train = np.array(x_train)
test = np.array(test)
x_train = x_train.reshape(x_train.shape[ 0 ], img_rows, img_cols, 1 )
X_test = x_test.reshape(x_test.shape[ 0 ], img_rows, img_cols, 1 )
test = test.reshape(test.shape[ 0 ], img_rows, img_cols, 1 )
input_shape = (img_rows, img_cols, 1 )
x_train = x_train.astype( 'float32' )
x_test = X_test.astype( 'float32' )
test = test.astype( 'float32' )
x_train / = 255
X_test / = 255
test / = 255
print ( 'X_train shape:' , x_train.shape)
print (x_train.shape[ 0 ], 'train samples' )
print (x_test.shape[ 0 ], 'test samples' )
print (test.shape[ 0 ], 'testOuput samples' )
model = Sequential() #model initial
model.add(Convolution2D(nb_filters, (kernel_size[ 0 ], kernel_size[ 1 ]),
padding = 'same' ,
input_shape = input_shape)) # 卷积层1
model.add(Activation( 'relu' )) #激活层
model.add(Convolution2D(nb_filters, (kernel_size[ 0 ], kernel_size[ 1 ]))) #卷积层2
model.add(Activation( 'relu' )) #激活层
model.add(MaxPooling2D(pool_size = pool_size)) #池化层
model.add(Dropout( 0.25 )) #神经元随机失活
model.add(Flatten()) #拉成一维数据
model.add(Dense( 128 )) #全连接层1
model.add(Activation( 'relu' )) #激活层
model.add(Dropout( 0.5 )) #随机失活
model.add(Dense(nb_classes)) #全连接层2
model.add(Activation( 'softmax' )) #Softmax评分
#编译模型
model. compile (loss = 'categorical_crossentropy' ,
optimizer = 'adadelta' ,
metrics = [ 'accuracy' ])
#训练模型
model.fit(x_train, y_train, batch_size = batch_size, epochs = epochs,verbose = 1 )
model.predict(x_test)
#评估模型
score = model.evaluate(x_test, y_test, verbose = 0 )
print ( 'Test score:' , score[ 0 ])
print ( 'Test accuracy:' , score[ 1 ])
y_test = model.predict(test)
sess = tf.InteractiveSession()
y_test = sess.run(tf.arg_max(y_test, 1 ))
y_test = pd.DataFrame(y_test)
y_test.to_csv(outputfile)
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/u013948010/article/details/78318827