Digit Recognizer比赛Top6%

来源:互联网 发布:网站seo方案 编辑:程序博客网 时间:2024/06/05 00:19

Learn computer vision fundamentals with the famous MNIST data

基于keras + tensorflow

分别采用VGG和Resnet网络实现预测,效果分别是0.99300和0.99614

直接上代码

#coding=utf-8from pandas import read_csvimport numpy as npfrom keras.models import Sequential,Modelfrom keras.layers import Dense,Dropout,BatchNormalization,Flatten,add,Inputfrom keras.layers.convolutional import Conv2D,MaxPooling2D,AveragePooling2Dfrom keras.utils.np_utils import to_categoricalfrom keras.optimizers import SGDfrom keras.callbacks import ModelCheckpointfrom keras.preprocessing.image import ImageDataGeneratorfrom sklearn.model_selection import train_test_splitimport matplotlib.pyplot as pltimport cPickleimport gzip#使用Resnet网络迭代6次准确率达0.99614,使用VGG网络准确率为0.99300data = gzip.open(r'/media/wmy/document/BigData/kaggle/Digit Recognizer/mnist.pkl.gz')train_set,valid_set,test_set = cPickle.load(data)train_data = np.concatenate([train_set[0],valid_set[0],test_set[0]])train_label = np.concatenate([train_set[1],valid_set[1],test_set[1]])train = read_csv(r'/media/wmy/document/BigData/kaggle/Digit Recognizer/train.csv',header=None,delimiter=',')test = read_csv(r'/media/wmy/document/BigData/kaggle/Digit Recognizer/test.csv',header=None,delimiter=',')train = train.valuestrain_x = np.concatenate((train[:,1:],train_data))train_y = np.concatenate((train[:,0],train_label))train_x = train_x.reshape((-1,28,28,1))/255.train_y = to_categorical(train_y)print train_x.shapeprint train_y.shapetest = test.valuestest_x = test[:,:].reshape((-1,28,28,1))/255.seed = 7np.random.seed(seed=seed)def CNN_Model_1():    model = Sequential()    model.add(Conv2D(64, (3, 3), input_shape=(28, 28, 1), activation='relu', padding='same'))    model.add(BatchNormalization())    model.add(MaxPooling2D(pool_size=(2, 2)))    model.add(Conv2D(96, (3, 3), activation='relu', padding='same'))    model.add(BatchNormalization())    model.add(MaxPooling2D(pool_size=(2, 2)))    model.add(Conv2D(96, (2, 2), activation='relu', padding='valid'))    model.add(BatchNormalization())    model.add(MaxPooling2D(pool_size=(2, 2)))    model.add(Flatten())    model.add(Dense(100, activation='relu'))    model.add(BatchNormalization())    model.add(Dropout(0.5))    model.add(Dense(100, activation='relu'))    model.add(BatchNormalization())    model.add(Dropout(0.5))    model.add(Dense(10, activation='softmax'))    sgd = SGD(lr=0.001, momentum=0.9)    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])    model.summary()    return modeldef VGG():    model = Sequential()    model.add(Conv2D(64, (3, 3), input_shape=(28, 28, 1), activation='relu', padding='same'))    model.add(BatchNormalization())    model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))    model.add(BatchNormalization())    model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))    model.add(BatchNormalization())    model.add(MaxPooling2D(pool_size=(2, 2)))    model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))    model.add(BatchNormalization())    model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))    model.add(BatchNormalization())    model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))    model.add(BatchNormalization())    model.add(MaxPooling2D(pool_size=(2, 2)))    model.add(Conv2D(256, (2, 2), activation='relu', padding='same'))    model.add(BatchNormalization())    model.add(Conv2D(256, (2, 2), activation='relu', padding='same'))    model.add(BatchNormalization())    model.add(Conv2D(256, (2, 2), activation='relu', padding='same'))    model.add(BatchNormalization())    model.add(AveragePooling2D(pool_size=(7, 7)))    model.add(Flatten())    model.add(Dense(10, activation='softmax'))    sgd = SGD(lr=0.001, momentum=0.9)    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])    model.summary()    return modeldef Conv2d_BN(x, nb_filter,kernel_size, strides=(1,1), padding='same'):    x = Conv2D(nb_filter,kernel_size,padding=padding,strides=strides,activation='relu')(x)    x = BatchNormalization(axis=3)(x)    return xdef Conv_Block(inpt,nb_filter,kernel_size,strides=(1,1), with_conv_shortcut=False):    x = Conv2d_BN(inpt, nb_filter=nb_filter, kernel_size=kernel_size, strides=strides, padding='same')    x = Conv2d_BN(x, nb_filter=nb_filter, kernel_size=kernel_size, padding='same')    if with_conv_shortcut:        shortcut = Conv2d_BN(inpt, nb_filter=nb_filter, strides=strides, kernel_size=kernel_size)        x = add([x, shortcut])        return x    else:        x = add([x, inpt])        return xdef Resnet():    inpt = Input(shape=(28, 28, 1))    x = Conv2d_BN(inpt, nb_filter=64, kernel_size=(3, 3))    x = Conv_Block(x, nb_filter=64, kernel_size=(3, 3))    x = Conv_Block(x, nb_filter=64, kernel_size=(3, 3))    x = Conv_Block(x, nb_filter=64, kernel_size=(3, 3))    x = Conv_Block(x, nb_filter=128, kernel_size=(3, 3), strides=(1, 1), with_conv_shortcut=True)    x = Conv_Block(x, nb_filter=128, kernel_size=(3, 3))    x = Conv_Block(x, nb_filter=128, kernel_size=(3, 3))    x = Conv_Block(x, nb_filter=128, kernel_size=(3, 3))    x = Conv_Block(x, nb_filter=256, kernel_size=(3, 3), strides=(2, 2), with_conv_shortcut=True)    x = Conv_Block(x, nb_filter=256, kernel_size=(3, 3))    x = Conv_Block(x, nb_filter=256, kernel_size=(3, 3))    x = Conv_Block(x, nb_filter=256, kernel_size=(3, 3))    x = Conv_Block(x, nb_filter=256, kernel_size=(3, 3))    x = Conv_Block(x, nb_filter=256, kernel_size=(3, 3))    x = Conv_Block(x, nb_filter=512, kernel_size=(3, 3), strides=(2, 2), with_conv_shortcut=True)    x = Conv_Block(x, nb_filter=512, kernel_size=(3, 3))    x = Conv_Block(x, nb_filter=512, kernel_size=(3, 3))    x = AveragePooling2D(pool_size=(7, 7))(x)    x = Flatten()(x)    x = Dense(10, activation='softmax')(x)    model = Model(inpt,x)    sgd = SGD(lr=0.001, momentum=0.9)    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])    model.summary()    return modelcallback = []model_check = ModelCheckpoint(filepath='best_params.h5',monitor='val_acc',save_best_only=True,mode='max')callback.append(model_check)#model = VGG()model = Resnet()'''datagen = ImageDataGenerator(    featurewise_center=True,    samplewise_center=True,    featurewise_std_normalization=True,    samplewise_std_normalization=True,    zca_whitening=False,    rotation_range=10.,    width_shift_range=.2,    height_shift_range=.2,    rescale=None,    )datagen.fit(train_x)''''''model.fit_generator(    datagen.flow(train_x,train_y,batch_size=20),    steps_per_epoch=train_x.shape[0],    epochs=30,    verbose=2,    validation_data=(valid_x,valid_y))'''#model.fit(train_x,train_y,validation_split=0.1,epochs=50,batch_size=20,verbose=2,callbacks=callback)model.load_weights('best_params.h5')#yPred = model.predict_classes(test_x,batch_size=20,verbose=2)yPred = model.predict(test_x,batch_size=20,verbose=2)yPred = np.argmax(yPred,axis=1)np.savetxt('wmy_pred.csv', np.c_[range(1,len(yPred)+1),yPred], delimiter=',', header = 'ImageId,Label', comments = '', fmt='%d')


0 0
原创粉丝点击