1.数据加载
数据来源为Cifar10,可以从这里下载,我下载的是二进制版本,好像python版本更方便.下载完成后需要处理数据,代码如下所示,最后得到的数据格式为32*32*3的矩阵.
def load_cifar10(path): train_data=np.ones((1,3073),dtype=np.uint8) #将训练数据进行拼接 for i in range(1,6): data_path=os.path.join(path,'data_batch_'+str(i)+'.bin') with open(data_path,'rb') as f: data=np.fromfile(f,dtype=np.uint8).reshape(10000,3073) train_data=np.concatenate((train_data,data)) #调整训练数据维度,原因见cifar10的数据说明 train_labels=train_data[1:,:1] train_images=train_data[1:,1:].reshape(50000,3,32,32).transpose(0,2,3,1) #获取训练数据 data_path = os.path.join(path, 'test_batch.bin') with open(data_path,'rb') as f: test_data=np.fromfile(data_path,dtype=np.uint8).reshape(10000,3073) test_labels=test_data[:,:1] test_images=test_data[:,1:].reshape(10000,3,32,32).transpose(0,2,3,1) return (train_images,train_labels),(test_images,test_labels)
2.模型定义及训练
import dataLoad from keras.utils import np_utils from keras.models import Sequential from keras.layers import Dense,Conv2D,MaxPooling2D,Dropout,Flatten,BatchNormalization #加载数据 (x_train,y_train),(x_test,y_test)=dataLoad.load_cifar10('Cifar10_data') #数据预处理 x_train=x_train.astype('float32')/255 #归一化处理 x_test=x_test.astype('float32')/255 y_train=np_utils.to_categorical(y_train,num_classes=10) #将标签转化为one-hot向量 y_test=np_utils.to_categorical(y_test,num_classes=10) #定义模型 model=Sequential() model.add(Conv2D(32,(3,3),padding='same',input_shape=x_train.shape[1:],activation='relu')) model.add(Conv2D(32,(3,3),padding='same',input_shape=(32,32,3),activation='relu')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Conv2D(64,(3,3),padding='same',input_shape=(32,32,3),activation='relu')) model.add(Conv2D(64,(3,3),padding='same',input_shape=(32,32,3),activation='relu')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Flatten()) model.add(Dense(512,activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10,activation='softmax')) model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy']) model.summary() #训练模型 print('-----------Training-----------') model.fit(x_train,y_train,batch_size=32,epochs=30,verbose=2) #评估模型 print('-----------Testing-------------') scores=model.evaluate(x_test,y_test,verbose=0) print('loss:%s,accuracy:%s' % (scores[0],scores[1])) #模型保存 model.save('cifar10_cnn_model.h5')
3.参考内容
https://www.cnblogs.com/Jerry-Dong/p/8109938.html