keras 提取某一层的feature_map
生活随笔
收集整理的這篇文章主要介紹了
keras 提取某一层的feature_map
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
建立一個簡單的cnn模型
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Mon Jul 1 16:49:12 2019@author: lg """#=================== Test 1 Hello Keras for mnist============================================================================== # 這是一個簡單的全連接神經(jīng)網(wǎng)絡(luò)的例子。 from keras.models import Sequential # 采用貫序模型 from keras.layers import Input, Dense, Dropout, Activation from keras.models import Model from keras.optimizers import SGD from keras.datasets import mnist import numpy as nptBatchSize = 128 '''第一步:選擇模型''' model = Sequential() # 采用貫序模型'''第二步:構(gòu)建網(wǎng)絡(luò)層''' '''構(gòu)建網(wǎng)絡(luò)只是構(gòu)建了一個網(wǎng)絡(luò)結(jié)構(gòu),并定義網(wǎng)絡(luò)的參數(shù),此時還沒有輸入的數(shù)據(jù)集''' #構(gòu)建的第一個層作為輸入層 # Dense 這是第一個隱藏層,并附帶定義了輸入層,該隱含層有500個神經(jīng)元。輸入則是 784個節(jié)點(diǎn) model.add(Dense(500,input_shape=(784,))) # 輸入層,28*28=784 輸入層將二維矩陣換成了一維向量輸入 model.add(Activation('tanh')) # 激活函數(shù)是tanh 為雙曲正切 tanh(x) = sinh(x)/cosh(x) = (e^x - e^(-x))/(e^x + e^(-x)) model.add(Dropout(0.5)) # 采用50%的dropout 隨機(jī)取一半進(jìn)行訓(xùn)練#構(gòu)建的第2個層作為隱藏層2, (如果加上輸入層,實(shí)際上是第三層) model.add(Dense(500)) # 隱藏層節(jié)點(diǎn)500個 model.add(Activation('tanh')) model.add(Dropout(0.5))model.add(Dense(500)) # 隱藏層3,節(jié)點(diǎn)500個 model.add(Activation('tanh')) #model.add(Dropout(0.5))#構(gòu)建的第3個層作為輸出層 model.add(Dense(10)) # 輸出結(jié)果是10個類別,所以維度是10 # softmax介紹可以參考https://blog.csdn.net/haolexiao/article/details/72757796 model.add(Activation('softmax')) # 最后一層用softmax作為激活函數(shù)'''第三步:網(wǎng)絡(luò)優(yōu)化和編譯''' # lr:大于0的浮點(diǎn)數(shù),學(xué)習(xí)率 # momentum:大于0的浮點(diǎn)數(shù),動量參數(shù) # decay:大于0的浮點(diǎn)數(shù),每次更新后的學(xué)習(xí)率衰減值 # nesterov:布爾值,確定是否使用Nesterov動量 sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # 優(yōu)化函數(shù),設(shè)定學(xué)習(xí)率(lr)等參數(shù)# 只有通過了編譯,model才真正的建立起來,這時候才能夠被使用 #model.compile(loss='categorical_crossentropy', optimizer=sgd, class_mode='categorical') # 使用交叉熵作為loss函數(shù) 這是原例子,但是執(zhí)行出錯 model.compile(loss='categorical_crossentropy', optimizer=sgd) # 使用交叉熵作為loss函數(shù) # 去掉 class_mode 即可。可能是版本不同導(dǎo)致的???'''第四步:訓(xùn)練 '''# 數(shù)據(jù)集獲取 mnist 數(shù)據(jù)集的介紹可以參考 https://blog.csdn.net/simple_the_best/article/details/75267863 (X_train, y_train), (X_test, y_test) = mnist.load_data() # 使用Keras自帶的mnist工具讀取數(shù)據(jù)(第一次需要聯(lián)網(wǎng))# 由于mist的輸入數(shù)據(jù)維度是(num, 28, 28),這里需要把后面的維度直接拼起來變成784維 X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[2]) X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2])#這個能生成一個OneHot的10維向量,作為Y_train的一行,這樣Y_train就有60000行OneHot作為輸出 Y_train = (np.arange(10) == y_train[:, None]).astype(int) # 整理輸出 Y_test = (np.arange(10) == y_test[:, None]).astype(int) #np.arange(5) = array([0,1,2,3,4])'''.fit的一些參數(shù)batch_size:對總的樣本數(shù)進(jìn)行分組,每組包含的樣本數(shù)量epochs :訓(xùn)練次數(shù)shuffle:是否把數(shù)據(jù)隨機(jī)打亂之后再進(jìn)行訓(xùn)練validation_split:拿出百分之多少用來做交叉驗(yàn)證verbose:屏顯模式 0:不輸出 1:輸出進(jìn)度 2:輸出每次的訓(xùn)練結(jié)果 ''' model.fit(X_train, Y_train, batch_size=tBatchSize, epochs=50, shuffle=True, verbose=2, validation_split=0.3) #model.evaluate(X_test, Y_test, batch_size=200, verbose=0)'''第五步:輸出''' print("test set") # 誤差評價 :按batch計算在batch用到的輸入數(shù)據(jù)上模型的誤差 scores = model.evaluate(X_test,Y_test, batch_size=tBatchSize, verbose=0) print("") print("The test loss is %f" % scores)# 根據(jù)模型獲取預(yù)測結(jié)果 為了節(jié)約計算內(nèi)存,也是分組(batch)load到內(nèi)存中的, result = model.predict(X_test,batch_size=tBatchSize,verbose=1)# 找到每行最大的序號 result_max = np.argmax(result, axis = 1) #axis=1表示按行 取最大值 如果axis=0表示按列 取最大值 axis=None表示全部 test_max = np.argmax(Y_test, axis = 1) # 這是結(jié)果的真實(shí)序號result_bool = np.equal(result_max, test_max) # 預(yù)測結(jié)果和真實(shí)結(jié)果一致的為真(按元素比較) true_num = np.sum(result_bool) #正確結(jié)果的數(shù)量 print("The accuracy of the model is %f" % (true_num/len(result_bool))) # 驗(yàn)證結(jié)果的準(zhǔn)確率保存模型
from keras.models import load_model model.save('mnist.h5')加載模型
md=load_model('mnist.h5') md.summary() _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_1 (Dense) (None, 500) 392500 _________________________________________________________________ activation_1 (Activation) (None, 500) 0 _________________________________________________________________ dropout_1 (Dropout) (None, 500) 0 _________________________________________________________________ dense_2 (Dense) (None, 500) 250500 _________________________________________________________________ activation_2 (Activation) (None, 500) 0 _________________________________________________________________ dropout_2 (Dropout) (None, 500) 0 _________________________________________________________________ dense_3 (Dense) (None, 500) 250500 _________________________________________________________________ activation_3 (Activation) (None, 500) 0 _________________________________________________________________ dense_4 (Dense) (None, 10) 5010 _________________________________________________________________ activation_4 (Activation) (None, 10) 0輸出模型的dense_4層feature
m1 = Model(inputs=md.input, outputs=md.get_layer('dense_4').output) p=m1.predict(X_test) print(p) print(p.shape) [[-0.98082066 -2.0262308 1.884115 ... 10.429978 -1.0895191.8942649 ][-1.6293067 1.9834101 7.447503 ... -4.503209 1.2644069-6.179964 ][-3.633604 10.08003 0.41006157 ... -0.58914423 0.19623947-2.3388317 ]...[-2.7845476 -3.4076674 -1.8592398 ... 1.7319188 1.98056087.3300643 ][-0.9710829 -2.298439 -2.6395218 ... -3.8102558 2.2486367-1.1267688 ][ 2.2110054 -2.9739656 3.5882971 ... -5.027889 -0.09676352-2.1867702 ]]print(p.shape) (10000, 10) 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的keras 提取某一层的feature_map的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tensorflow2.0 与tenso
- 下一篇: Adaboost、GBDT与XGBoos