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
