您的位置:首页 > 其它

simpleCNN 训练 cifar-10 数据集

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

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

import os
import cv2
import numpy
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Conv2D, MaxPooling2D, Flatten, AveragePooling2D
from keras.layers import initializers
from keras.optimizers import SGD
from keras.utils import np_utils
from keras.utils.vis_utils import plot_model

def 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, labels

trainData, 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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: