簡單CNN的實現-基於Cifar10數據集


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  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM