keras学习 CNN处理CIFAR10
CIFAR簡介:
??CIFAR是由Hinton的學生Alex Krizhevsky和Ilya Sutskever整理的一個用于識別普適物體的小型數據集。一共包含 10 個類別的 RGB 彩色圖 片:飛機(airplane)、汽車(automobile)、鳥類(bird)、貓(cat)、鹿(deer)、狗(dog)、蛙類(frog)、馬(horse)、船(ship)和卡車(truck)。圖片的尺寸為 32×32 ,數據集中一共有 50000 張訓練圖片和 10000 張測試圖片。既然用到了這個數據集,那么在編寫的時候肯定要弄清楚里面到底是什么樣子的,因此在實現CNN處理之前,先來可視化一下數據集吧!
??先從keras數據庫中下載數據集,用到的是下面的代碼,下載出來的文件是《cifar-10-batches-py.tar.gz》,正常應該會下載到C:UsersAdministrator.kerasdatasets這里面,可以把下載的那個文件解壓一下,就變成了cifar-10-batches-py。
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
??而cifar-10-batches-py里面就是數據集了,打開文件夾是一些數據集了,訓練集有5個,分別是data_batch_1、2、3、4、5,5個,每個里面有10000個數據,一共50000個,然后test_batch就是測試集了。如下圖:
??輸出圖片的時候選擇了data_batch_5,選哪個都一樣,能看到結果就行
def plt_fifar():
with open('data/cifar-10-batches-py/data_batch_5', 'rb')as f:
datadict = p.load(f, encoding='latin1') #獲取一個data_batch
# print(datadict)
batch_label_ = datadict['batch_label']
#print(batch_label) #字典第一個key(batch_label),value為“training batch 5 of 5”
labels_ = datadict['labels'] #字典第二個key(labels),value為[0,1,2,3,...],里面有10000個數據
data_ = datadict['data'] #字典第三個key(data),value為列表,形狀為10000*3072,3*32*32=3072
# print(len(data_))
filenames_ = datadict['filenames'] #字典最后一個key,value為每個圖片的名字,也就是圖片里面的內容,car,...
# print(len(filenames_))
#處理的時候需要把data中的形狀轉成3*32*32
imgX = data_.reshape(-1, 3, 32, 32)
imgY = np.array(labels_)
# print(imgY)
# print(len(imgY))
for i in range(100): # 值輸出10張圖片,用來做演示
imgs = imgX[i] #一張圖片3*32*32
#print(len(imgs))
img0 = imgs[0] #三層通道的每一層
# print(imgs0.shape) #32*32
img1 = imgs[1] #32*32
img2 = imgs[2] #32*32
#fromarray實現array到image的轉換,np.asarray將image 轉為 array
i0 = Image.fromarray(img0) # 數據生成image對象
i1 = Image.fromarray(img1)
i2 = Image.fromarray(img2)
img = Image.merge("RGB", (i0, i1, i2))
plt.imshow(img)
plt.show()
#保存
# name = "img" + str(i) + ".png"
# img.save("cifar10_images/" + name, "png") # 文件夾下是RGB融合后的圖像
# print("保存完畢.")
??放一些輸出的結果圖片,只截取了一部分,要是想看其他的可以自己更改參數:
??接下來就是搭建CNN實現分類了,開始肯定是要預處理數據集的,見下面的代碼:
#x_train shape (50000, 32*32*3),x_test shape (10000, 32*32*3)
#y_train shape (50000,), y_test shape (10000, ) [0-9]
(x_train, y_train), (x_test, y_test) = cifar10.load_data() #如果有導入數據,沒有就下載數據
x_train = x_train.astype('float32') / 255 #(50000, 32, 32, 3)
x_test = x_test.astype('float32') / 255 #(10000, 32, 32, 3)
y_train = np_utils.to_categorical(y_train, 10) #(10000, 1)
y_test = np_utils.to_categorical(y_test, 10) #(10000, 1)
??搭建以及編譯模型:
model = Sequential([ #第一層要寫輸入尺寸,最后一層要寫輸出尺寸
#輸入(1,32,32,3)輸出(32, 32, 32, 3)
Convolution2D(filters=32,
kernel_size=(3, 3),
padding='same',
input_shape=(32, 32, 3),),
Activation('relu'),
#輸入(32,32,32,3)輸出(64, 32, 32, 3)
Convolution2D(filters=32,
kernel_size=(3, 3),
padding='same',),
Activation('relu'),
#input (64,32,32,3) #output(64,16,16,3)
MaxPooling2D(pool_size=(2, 2)),
Dropout(0.25),
#input(32,16,16,3) output(64,16,16,3)
Convolution2D(filters=64,
kernel_size = (3, 3),
padding = 'same'),
Activation('relu'),
#input(32,16,16,3) output(64,16,16,3)
Convolution2D(filters=64,
kernel_size = (3, 3),
padding = 'same'),
Activation('relu'),
#input(64,16,16,3),output(128,8,8,3)
MaxPooling2D(pool_size = (2,2)),
Dropout(0.25),
Flatten(), #將數據展平 64*64*3 = 8452
Dense(512),
Activation('relu'),
Dense(10),
Activation('softmax'),
])
print(model.summary()) #輸出模型結構
#優化器
opti =keras.optimizers.rmsprop(lr=0.001, decay=1e-6)
model.compile(loss='categorical_crossentropy', optimizer=opti, metrics=['accuracy'])
??訓練以及測試,因為數據集比較大,因此訓練輪數要比較多,這里設置成32了,有的是64,但是我看著后來結果差距不是很大,就減少了一半:
#訓練
print("----------------train------")
hist = model.fit(x_train, y_train, batch_size=100, epochs=32, shuffle=True, validation_data=(x_test, y_test))
# plot_model(hist, to_file='model_CIFAR10_CNN.png', show_shapes=True) #這一步其實是將模型輸出成一張包含有向圖的圖片,但是我這里沒成功,就給注釋了,改用model.summary方法(上面有)
#測試
print("----------------test------")
loss, accuracy = model.evaluate(x_test, y_test)
print(loss, accuracy)
??然后繪制一下訓練過程中訓練集和測試集的準確率曲線以及損失值曲線:
# 繪制訓練過程中訓練集和測試集合的準確率值
plt.plot(hist.history['accuracy'])
plt.plot(hist.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy') #設置y坐標名稱
plt.xlabel('Epoch') #設置x坐標名稱
plt.legend(['Train', 'Test'], loc = 'upper left') #這個是設置用于區別的小線段,位置是左上角
plt.show()
# 繪制訓練過程中訓練集和測試集合的損失值
plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
??下面這一張圖是訓練過程準確率的曲線圖,由于損失值的曲線圖片沒保存,就沒上傳了。
總結
以上是生活随笔為你收集整理的keras学习 CNN处理CIFAR10的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++随机打乱数组_【洗牌算法】你确定这
- 下一篇: 怎么固定串口号_工业交换机的背板带宽怎么