simpleCNN 训练 cifar-10 数据集

来源:互联网 发布:数据库第三版课后答案 编辑:程序博客网 时间:2024/06/05 06:42

          利用三个卷积层和三个全连接层,对cifar-10数据集进行训练。第一二个卷积层为32个5X5的卷积核,第三个卷积层为64个5X5的卷积核,卷积层初始参数为方差0.01正态随机数,激活函数为Relu。每个卷积层后都跟随一个池化层,第一个池化层为MaxPooling,第二三个池化层为AveragePooling。

          需注意的是,训练数据需经过去均值和标准化,这点很重要。实现代码如下:

import osimport cv2import numpyfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import Conv2D, MaxPooling2D, Flatten, AveragePooling2Dfrom keras.layers import initializersfrom keras.optimizers import SGDfrom keras.utils import np_utilsfrom keras.utils.vis_utils import plot_modeldef loadData(path):    data = []    labels = []    for i in range(10):        dir1 = './'+path+'/'+str(i)        listImg = os.listdir(dir1)        for img in listImg:            imgIn = cv2.imread(dir1+'/'+img)            if imgIn.size != 3072: print 'Img error'            data.append(imgIn)#            data.append([numpy.array(Image.open(dir+'/'+img))])            labels.append(i)        print path, i, 'is read'    return data, labelstrainData, trainLabels = loadData('train')#testData, testLabels = loadData('test1')trainLabels = np_utils.to_categorical(trainLabels, 10)#testLabels = np_utils.to_categorical(testLabels, 10)trainData = numpy.reshape(trainData, (len(trainData), 32, 32,3))trainData = trainData.astype(numpy.float32)trainData -= numpy.mean(trainData, axis=0)trainData /= numpy.std(trainData, axis=0)model = Sequential()model.add(Conv2D(filters=32, kernel_size=(5,5), padding='same', input_shape=(32,32,3), data_format='channels_last', activation='relu', kernel_initializer=initializers.random_normal(stddev=0.0001)))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Conv2D(filters=32, kernel_size=(5,5), padding='same', data_format='channels_last', activation='relu', kernel_initializer=initializers.random_normal(stddev=0.01)))model.add(AveragePooling2D(pool_size=(2,2)))model.add(Conv2D(filters=64, kernel_size=(5,5), padding='same', data_format='channels_last', activation='relu', kernel_initializer=initializers.random_normal(stddev=0.01)))model.add(AveragePooling2D(pool_size=(2,2)))model.add(Flatten())model.add(Dense(1024, activation='relu', kernel_initializer=initializers.random_normal(stddev=0.1)))model.add(Dense(256, activation='relu', kernel_initializer=initializers.random_normal(stddev=0.1)))model.add(Dense(10, activation='softmax', kernel_initializer=initializers.random_normal(stddev=0.1)))sgd = SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])result = model.fit(trainData, trainLabels, batch_size=250, epochs=50, verbose=1, shuffle=True)plot_model(model, to_file='model.png', show_shapes=True, show_layer_names=False)

          训练50轮,20轮时精度为0.7,50轮时训练精度为0.8345。

0 0
原创粉丝点击