您的位置:首页 > 理论基础 > 计算机网络

keras构建卷积神经网络识别cifar10

2017-07-21 13:05 357 查看

环境keras ,python2.7

#coding:utf-8
from keras.models import Sequential
from keras.layers import Dense,Activation,Flatten,Convolution2D,MaxPooling2D,Dropout
from keras.utils import np_utils
from keras.optimizers import Adam
from sklearn.metrics import confusion_matrix,classification_report
import numpy as np
import scipy.io as sio
import datetime

"""
cifar文件包含训练集50000张,测试集合10000张
数据集为matlab类型
data_batch_1训练集样本数据10000张
data_batch_2训练集样本数据10000张
data_batch_3训练集样本数据10000张
data_batch_4训练集样本数据10000张
data_batch_5训练集样本数据10000张
"""
start_time = datetime.datetime.now()

#learning_rate = 0.0001
#batch_size = 128

#读取数据
def read_data(filename):
with open(filename,'rb') as f:
dict = sio.loadmat(f)
#图片维度要变换
return np.array(dict['data']).reshape(10000,3,32,32).transpose(0,2,3,1),np.array(dict['labels']).reshape(10000,1)

#将图片转为灰度图
def to4d(img):
return img.reshape(img.shape[0],32,32,3).astype(np.float32)/255

train_total_data,train_total_labels = read_data('/mnt/data/chuanhuang/cifar-10-batches-mat/data_batch_1.mat')

#将数据集合并
for batch_num in range(2,6):
train_data,train_labels = read_data('/mnt/data/chuanhuang/cifar-10-batches-mat/data_batch_'+str(batch_num)+'.mat')
train_total_data = np.vstack((train_total_data,train_data))
train_total_labels = np.vstack((train_total_labels,train_labels))

#train_data,train_labels = read_data('/home/tuoxin/mytensorflow/my_project/project3/cifar-10-batches-py/data_batch_0')
train_data = to4d(train_total_data)
train_labels = np_utils.to_categorical(train_total_labels,10)
test_data,test_labels = read_data('/mnt/data/chuanhuang/cifar-10-batches-mat/test_batch.mat')
test_data = to4d(test_data)
test_labels = np_utils.to_categorical(test_labels,10)

#开始构建模型
model = Sequential()
model.add(Convolution2D(32,3,3,border_mode='same',input_shape=(32,32,3),))
model.add(Activation('relu'))
model.add(Convolution2D(32,3,3,border_mode='valid'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Convolution2D(64,3,3,border_mode='same'))
model.add(Activation('relu'))
model.add(Convolution2D(64,3,3,border_mode='valid'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(10))
model.add(Activation('softmax'))
model.compile(optimizer=Adam(lr=0.0001),loss='categorical_crossentropy',metrics=['accuracy'])
model.fit(train_data,train_labels,nb_epoch=200,batch_size=128,shuffle=True,verbose=1)
test_score,test_accuracy = model.evaluate(test_data,test_labels)
predictions = model.predict(test_data,batch_size=32)

#混淆矩阵
print(confusion_matrix(test_labels,predictions))
#report
print(classification_report(test_labels,np.array(predictions)))
#模型训练了多久
end_time = datetime.datetime.now()
total_time = (end_time - start_time).seconds
print('total time is:',total_time)


结果:

训练时间太久,手动暂停,从训练分析的趋势看,检测精度还会继续上升

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  keras cifar10 物体识别
相关文章推荐