在Keras中CNN聯(lián)合LSTM進(jìn)行分類(lèi)實(shí)例
我就廢話(huà)不多說(shuō),大家還是直接看代碼吧~
def get_model(): n_classes = 6 inp=Input(shape=(40, 80)) reshape=Reshape((1,40,80))(inp) # pre=ZeroPadding2D(padding=(1, 1))(reshape) # 1 conv1=Convolution2D(32, 3, 3, border_mode='same',init='glorot_uniform')(reshape) #model.add(Activation('relu')) l1=LeakyReLU(alpha=0.33)(conv1) conv2=ZeroPadding2D(padding=(1, 1))(l1) conv2=Convolution2D(32, 3, 3, border_mode='same',init='glorot_uniform')(conv2) #model.add(Activation('relu')) l2=LeakyReLU(alpha=0.33)(conv2) m2=MaxPooling2D((3, 3), strides=(3, 3))(l2) d2=Dropout(0.25)(m2) # 2 conv3=ZeroPadding2D(padding=(1, 1))(d2) conv3=Convolution2D(64, 3, 3, border_mode='same',init='glorot_uniform')(conv3) #model.add(Activation('relu')) l3=LeakyReLU(alpha=0.33)(conv3) conv4=ZeroPadding2D(padding=(1, 1))(l3) conv4=Convolution2D(64, 3, 3, border_mode='same',init='glorot_uniform')(conv4) #model.add(Activation('relu')) l4=LeakyReLU(alpha=0.33)(conv4) m4=MaxPooling2D((3, 3), strides=(3, 3))(l4) d4=Dropout(0.25)(m4) # 3 conv5=ZeroPadding2D(padding=(1, 1))(d4) conv5=Convolution2D(128, 3, 3, border_mode='same',init='glorot_uniform')(conv5) #model.add(Activation('relu')) l5=LeakyReLU(alpha=0.33)(conv5) conv6=ZeroPadding2D(padding=(1, 1))(l5) conv6=Convolution2D(128, 3, 3, border_mode='same',init='glorot_uniform')(conv6) #model.add(Activation('relu')) l6=LeakyReLU(alpha=0.33)(conv6) m6=MaxPooling2D((3, 3), strides=(3, 3))(l6) d6=Dropout(0.25)(m6) # 4 conv7=ZeroPadding2D(padding=(1, 1))(d6) conv7=Convolution2D(256, 3, 3, border_mode='same',init='glorot_uniform')(conv7) #model.add(Activation('relu')) l7=LeakyReLU(alpha=0.33)(conv7) conv8=ZeroPadding2D(padding=(1, 1))(l7) conv8=Convolution2D(256, 3, 3, border_mode='same',init='glorot_uniform')(conv8) #model.add(Activation('relu')) l8=LeakyReLU(alpha=0.33)(conv8) g=GlobalMaxPooling2D()(l8) print("g=",g) #g1=Flatten()(g) lstm1=LSTM( input_shape=(40,80), output_dim=256, activation='tanh', return_sequences=False)(inp) dl1=Dropout(0.3)(lstm1) den1=Dense(200,activation="relu")(dl1) #model.add(Activation('relu')) #l11=LeakyReLU(alpha=0.33)(d11) dl2=Dropout(0.3)(den1) # lstm2=LSTM( # 256,activation='tanh', # return_sequences=False)(lstm1) # dl2=Dropout(0.5)(lstm2) print("dl2=",dl1) g2=concatenate([g,dl2],axis=1) d10=Dense(1024)(g2) #model.add(Activation('relu')) l10=LeakyReLU(alpha=0.33)(d10) l10=Dropout(0.5)(l10) l11=Dense(n_classes, activation='softmax')(l10) model=Model(input=inp,outputs=l11) model.summary() #編譯model adam = keras.optimizers.Adam(lr = 0.0005, beta_1=0.95, beta_2=0.999,epsilon=1e-08) #adam = keras.optimizers.Adam(lr = 0.001, beta_1=0.95, beta_2=0.999,epsilon=1e-08) #sgd = keras.optimizers.SGD(lr = 0.001, decay = 1e-06, momentum = 0.9, nesterov = False) #reduce_lr = ReduceLROnPlateau(monitor = 'loss', factor = 0.1, patience = 2,verbose = 1, min_lr = 0.00000001, mode = 'min') model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy']) return model
補(bǔ)充知識(shí):keras中如何將不同的模型聯(lián)合起來(lái)(以cnn/lstm為例)
可能會(huì)遇到多種模型需要揉在一起,如cnn和lstm,而我一般在keras框架下開(kāi)局就是一句
model = Sequential()
然后model.add ,model.add , ......到最后
model.compile(loss=["mae"], optimizer='adam',metrics=[mape])
這突然要把模型加起來(lái),這可怎么辦?
以下示例代碼是將cnn和lstm聯(lián)合起來(lái),先是由cnn模型卷積池化得到特征,再輸入到lstm模型中得到最終輸出
import os import keras os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' from keras.models import Model from keras.layers import * from matplotlib import pyplot os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' from keras.layers import Dense,Dropout,Activation,Convolution2D,MaxPooling2D,Flatten from keras.layers import LSTM def design_model(): # design network inp=Input(shape=(11,5)) reshape=Reshape((11,5,1))(inp) conv1=Convolution2D(32,3,3,border_mode='same',init='glorot_uniform')(reshape) print(conv1) l1=Activation('relu')(conv1) conv2=Convolution2D(64,3,3, border_mode='same',)(l1) l2=Activation('relu')(conv2) print(l2) m2=MaxPooling2D(pool_size=(2, 2), border_mode='valid')(l2) print(m2) reshape1=Reshape((10,64))(m2) lstm1=LSTM(input_shape=(10,64),output_dim=30,activation='tanh',return_sequences=False)(reshape1) dl1=Dropout(0.3)(lstm1) # den1=Dense(100,activation="relu")(dl1) den2=Dense(1,activation="relu")(dl1) model=Model(input=inp,outputs=den2) model.summary() #打印出模型概況 adam = keras.optimizers.Adam(lr = 0.001, beta_1=0.95, beta_2=0.999,epsilon=1e-08) model.compile(loss=["mae"], optimizer=adam,metrics=['mape']) return model model=design_model() history = model.fit(train_x, train_y, epochs=epochs, batch_size=batch_size, validation_data=[test_x, test_y],verbose=2, shuffle=True) # #save LeNet_model_files after train model.save('model_trained.h5')
以上示例代碼中cnn和lstm是串聯(lián)即cnn輸出作為lstm的輸入,一條路線(xiàn)到底
如果想實(shí)現(xiàn)并聯(lián),即分開(kāi)再匯總到一起
可用concatenate函數(shù)把cnn的輸出端和lstm的輸出端合并起來(lái),后面再接上其他層,完成整個(gè)模型圖的構(gòu)建。
g2=concatenate([g,dl2],axis=1)
總結(jié)一下:
這是keras框架下除了Sequential另一種函數(shù)式構(gòu)建模型的方式,更有靈活性,主要是在模型最后通過(guò) model=Model(input=inp,outputs=den2)來(lái)確定整個(gè)模型的輸入和輸出
以上這篇在Keras中CNN聯(lián)合LSTM進(jìn)行分類(lèi)實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 對(duì)圖片進(jìn)行簡(jiǎn)單的處理
介紹一些圖片處理的Python代碼,有了這些處理代碼,我們可以很方便的處理一些圖片,Python這里處理圖片一般都使用Pillow包,有此需求的朋友可以參考下2021-06-06關(guān)于torch.optim的靈活使用詳解(包括重寫(xiě)SGD,加上L1正則)
今天小編就為大家分享一篇關(guān)于torch.optim的靈活使用詳解(包括重寫(xiě)SGD,加上L1正則),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02解決selenium+Headless Chrome實(shí)現(xiàn)不彈出瀏覽器自動(dòng)化登錄的問(wèn)題
這篇文章主要介紹了解決selenium+Headless Chrome實(shí)現(xiàn)不彈出瀏覽器自動(dòng)化登錄的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01jupyter notebook tensorflow打印device信息實(shí)例
這篇文章主要介紹了jupyter notebook tensorflow打印device信息實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Pycharm Plugins加載失敗問(wèn)題解決方案
這篇文章主要介紹了Pycharm Plugins加載失敗問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Python代碼執(zhí)行時(shí)間測(cè)量模塊timeit用法解析
這篇文章主要介紹了Python代碼執(zhí)行時(shí)間測(cè)量模塊timeit用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07使用Python實(shí)現(xiàn)全攝像頭拍照與鍵盤(pán)輸入監(jiān)聽(tīng)功能
這篇文章主要介紹了使用Python實(shí)現(xiàn)全攝像頭拍照與鍵盤(pán)輸入監(jiān)聽(tīng)功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08