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。
需注意的是,训练数据需经过去均值和标准化,这点很重要。实现代码如下:
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。
相关文章推荐
- CIFAR_10处理数据——搭建模型——训练模型
- CIFAR-10模型训练python版cifar10数据集
- TensorFlow——训练自己的数据——CIFAR10(一)数据准备
- TensorFlow学习--卷积神经网络训练CIFAR-10数据集
- caffe学习笔记1_CIFAR-10在caffe上进行训练与学习
- caffe for windows 训练cifar10
- DeepLearning (五) 基于Keras的CNN 训练cifar-10 数据库
- CIFAR-10在caffe上进行训练与学习出现compute_image_mean: not found问题
- 卷积网络训练太慢?Yann LeCun:已解决CIFAR-10,目标 ImageNet
- Windows Caffe 学习笔记(一)训练和测试CIFAR-10数据集
- TensorFlow CNN 测试CIFAR-10数据集
- machine learing week 10, 随机梯度下降 批量梯度下降 确定训练模型的数据规模 判断梯度下降是否收敛
- caffe for windows 训练cifar10
- CIFAR-10在caffe上进行训练
- 深度学习Caffe平台实例——CIFAR-10数据集在caffe平台上模型训练及实例使用模型进行预测
- Caffe for Windows 训练cifar10 VS2013
- caffe for windows 训练cifar10
- caffe for windows 训练cifar10
- Caffe for windows 训练minst和cifar-10
- 如何使用GIST+LIBLINEAR分类器提取CIFAR-10 dataset数据集中图像特征,并用测试数据进行实验