使用Keras構(gòu)造簡(jiǎn)單的CNN網(wǎng)絡(luò)實(shí)例
1. 導(dǎo)入各種模塊
基本形式為:
import 模塊名
from 某個(gè)文件 import 某個(gè)模塊
2. 導(dǎo)入數(shù)據(jù)(以?xún)深?lèi)分類(lèi)問(wèn)題為例,即numClass = 2)
訓(xùn)練集數(shù)據(jù)data
可以看到,data是一個(gè)四維的ndarray
訓(xùn)練集的標(biāo)簽
3. 將導(dǎo)入的數(shù)據(jù)轉(zhuǎn)化我keras可以接受的數(shù)據(jù)格式
keras要求的label格式應(yīng)該為binary class matrices,所以,需要對(duì)輸入的label數(shù)據(jù)進(jìn)行轉(zhuǎn)化,利用keras提高的to_categorical函數(shù)
label = np_utils.to_categorical(label, numClass
此時(shí)的label變?yōu)榱巳缦滦问?/p>
(注:PyCharm無(wú)法顯示那么多的數(shù)據(jù),所以下面才只顯示了1000個(gè)數(shù)據(jù),實(shí)際上該例子所示的數(shù)據(jù)集有1223個(gè)數(shù)據(jù))
4. 建立CNN模型
以下圖所示的CNN網(wǎng)絡(luò)為例
#生成一個(gè)model model = Sequential() #layer1-conv1 model.add(Convolution2D(16, 3, 3, border_mode='valid',input_shape=data.shape[-3:])) model.add(Activation('tanh'))#tanh # layer2-conv2 model.add(Convolution2D(32, 3, 3, border_mode='valid')) model.add(Activation('tanh'))#tanh # layer3-conv3 model.add(Convolution2D(32, 3, 3, border_mode='valid')) model.add(Activation('tanh'))#tanh # layer4 model.add(Flatten()) model.add(Dense(128, init='normal')) model.add(Activation('tanh'))#tanh # layer5-fully connect model.add(Dense(numClass, init='normal')) model.add(Activation('softmax')) # sgd = SGD(l2=0.1,lr=0.001, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='categorical_crossentropy', optimizer=sgd,class_mode="categorical")
5. 開(kāi)始訓(xùn)練model
利用model.train_on_batch或者model.fit
補(bǔ)充知識(shí):keras 多分類(lèi)一些函數(shù)參數(shù)設(shè)置
用Lenet-5 識(shí)別Mnist數(shù)據(jù)集為例子:
采用下載好的Mnist數(shù)據(jù)壓縮包轉(zhuǎn)換成PNG圖片數(shù)據(jù)集,加載圖片采用keras圖像預(yù)處理模塊中的ImageDataGenerator。
首先import所需要的模塊
from keras.preprocessing.image import ImageDataGenerator from keras.models import Model from keras.layers import MaxPooling2D,Input,Convolution2D from keras.layers import Dropout, Flatten, Dense from keras import backend as K
定義圖像數(shù)據(jù)信息及訓(xùn)練參數(shù)
img_width, img_height = 28, 28 train_data_dir = 'dataMnist/train' #train data directory validation_data_dir = 'dataMnist/validation'# validation data directory nb_train_samples = 60000 nb_validation_samples = 10000 epochs = 50 batch_size = 32
判斷使用的后臺(tái)
if K.image_dim_ordering() == 'th': input_shape = (3, img_width, img_height) else: input_shape = (img_width, img_height, 3)
網(wǎng)絡(luò)模型定義
主要注意最后的輸出層定義
比如Mnist數(shù)據(jù)集是要對(duì)0~9這10種手寫(xiě)字符進(jìn)行分類(lèi),那么網(wǎng)絡(luò)的輸出層就應(yīng)該輸出一個(gè)10維的向量,10維向量的每一維代表該類(lèi)別的預(yù)測(cè)概率,所以此處輸出層的定義為:
x = Dense(10,activation='softmax')(x)
此處因?yàn)槭嵌喾诸?lèi)問(wèn)題,Dense()的第一個(gè)參數(shù)代表輸出層節(jié)點(diǎn)數(shù),要輸出10類(lèi)則此項(xiàng)值為10,激活函數(shù)采用softmax,如果是二分類(lèi)問(wèn)題第一個(gè)參數(shù)可以是1,激活函數(shù)可選sigmoid
img_input=Input(shape=input_shape) x=Convolution2D(32, 3, 3, activation='relu', border_mode='same')(img_input) x=MaxPooling2D((2,2),strides=(2, 2),border_mode='same')(x) x=Convolution2D(32,3,3,activation='relu',border_mode='same')(x) x=MaxPooling2D((2,2),strides=(2, 2),border_mode='same')(x) x=Convolution2D(64,3,3,activation='relu',border_mode='same')(x) x=MaxPooling2D((2,2),strides=(2, 2),border_mode='same')(x) x = Flatten(name='flatten')(x) x = Dense(64, activation='relu')(x) x= Dropout(0.5)(x) x = Dense(10,activation='softmax')(x) model=Model(img_input,x) model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy']) model.summary()
利用ImageDataGenerator傳入圖像數(shù)據(jù)集
注意用ImageDataGenerator的方法.flow_from_directory()加載圖片數(shù)據(jù)流時(shí),參數(shù)class_mode要設(shè)為‘categorical',如果是二分類(lèi)問(wèn)題該值可設(shè)為‘binary',另外要設(shè)置classes參數(shù)為10種類(lèi)別數(shù)字所在文件夾的名字,以列表的形式傳入。
train_datagen = ImageDataGenerator( rescale=1. / 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) # this is the augmentation configuration we will use for testing: # only rescaling test_datagen = ImageDataGenerator(rescale=1. / 255) train_generator = train_datagen.flow_from_directory( train_data_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode='categorical', #多分類(lèi)問(wèn)題設(shè)為'categorical' classes=['0','1','2','3','4','5','6','7','8','9'] #十種數(shù)字圖片所在文件夾的名字 ) validation_generator = test_datagen.flow_from_directory( validation_data_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode='categorical' )
訓(xùn)練和保存模型及權(quán)值
model.fit_generator( train_generator, samples_per_epoch=nb_train_samples, nb_epoch=epochs, validation_data=validation_generator, nb_val_samples=nb_validation_samples ) model.save_weights('Mnist123weight.h5') model.save('Mnist123model.h5')
至此訓(xùn)練結(jié)束
圖片預(yù)測(cè)
注意model.save()可以將模型以及權(quán)值一起保存,而model.save_weights()只保存了網(wǎng)絡(luò)權(quán)值,此時(shí)如果要進(jìn)行預(yù)測(cè),必須定義有和訓(xùn)練出該權(quán)值所用的網(wǎng)絡(luò)結(jié)構(gòu)一模一樣的一個(gè)網(wǎng)絡(luò)。
此處利用keras.models中的load_model方法加載model.save()所保存的模型,以恢復(fù)網(wǎng)絡(luò)結(jié)構(gòu)和參數(shù)。
from keras.models import load_model from keras.preprocessing.image import img_to_array, load_img import numpy as np classes=['0','1','2','3','4','5','6','7','8','9'] model=load_model('Mnist123model.h5') while True: img_addr=input('Please input your image address:') if img_addr=="exit": break else: img = load_img(img_addr, False, target_size=(28, 28)) x = img_to_array(img) / 255.0 x = np.expand_dims(x, axis=0) result = model.predict(x) ind=np.argmax(result,1) print('this is a ', classes[ind])
以上這篇使用Keras構(gòu)造簡(jiǎn)單的CNN網(wǎng)絡(luò)實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
超詳細(xì)注釋之OpenCV Haar級(jí)聯(lián)檢測(cè)器進(jìn)行面部檢測(cè)
這篇文章主要介紹了OpenCV Haar級(jí)聯(lián)檢測(cè)器進(jìn)行面部檢測(cè),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Django分頁(yè)查詢(xún)并返回jsons數(shù)據(jù)(中文亂碼解決方法)
這篇文章主要介紹了Django分頁(yè)查詢(xún)并返回jsons數(shù)據(jù)(中文亂碼解決方法),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08學(xué)生如何注冊(cè)Pycharm專(zhuān)業(yè)版以及pycharm的安裝
這篇文章主要介紹了學(xué)生如何注冊(cè)Pycharm專(zhuān)業(yè)版以及pycharm的安裝,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09python 中的列表生成式、生成器表達(dá)式、模塊導(dǎo)入
這篇文章主要介紹了python中的列表生成式、生成器表達(dá)式、模塊導(dǎo)入 ,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06Python實(shí)現(xiàn)隨機(jī)生成一個(gè)漢字的方法分享
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)隨機(jī)生成一個(gè)漢字的功能,文中的示例代碼講解詳細(xì),對(duì)我們深入了解Python有一定的幫助,需要的可以參考一下2023-01-01Python read函數(shù)按字節(jié)(字符)讀取文件的實(shí)現(xiàn)
這篇文章主要介紹了Python read函數(shù)按字節(jié)(字符)讀取文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07