使用K.function()調(diào)試keras操作
Keras的底層庫(kù)使用Theano或TensorFlow,這兩個(gè)庫(kù)也稱為Keras的后端。無(wú)論是Theano還是TensorFlow,都需要提前定義好網(wǎng)絡(luò)的結(jié)構(gòu),也就是常說(shuō)的“計(jì)算圖”。
在運(yùn)行前需要對(duì)計(jì)算圖編譯,然后才能輸出結(jié)果。那這里面主要有兩個(gè)問(wèn)題,第一是這個(gè)圖結(jié)構(gòu)在運(yùn)行中不能任意更改,比如說(shuō)計(jì)算圖中有一個(gè)隱含層,神經(jīng)元的數(shù)量是100,你想動(dòng)態(tài)的修改這個(gè)隱含層神經(jīng)元的數(shù)量那是不可以的;第二是調(diào)試?yán)щy,keras沒(méi)有內(nèi)置的調(diào)試工具,所以計(jì)算圖的中間結(jié)果是很難看到的,一旦最終輸出跟預(yù)想不一致,很難找到問(wèn)題所在。
這里談一談本人調(diào)試keras的一些經(jīng)驗(yàn):
分階段構(gòu)建你的神經(jīng)網(wǎng)絡(luò)
不要一口氣把整個(gè)網(wǎng)絡(luò)全部寫(xiě)完,這樣很難保證中間結(jié)果的正確性。加如一個(gè)CNN文本分類模型是這樣的(如下代碼),應(yīng)該在加了Embedding層后,停止,打印一下中間結(jié)果,看看跟embedding向量能不能對(duì)上,輸出的shape對(duì)不對(duì)。對(duì)上了再進(jìn)行下一步操作。
有的人覺(jué)得這樣很浪費(fèi)時(shí)間,但是除非你能一遍寫(xiě)對(duì),否則你將花上5倍的時(shí)間發(fā)現(xiàn)錯(cuò)誤。
# model parameters: embedding_dims = 50 cnn_filters = 100 cnn_kernel_size = 5 dense_hidden_dims = 200 model = Sequential() model.add(Embedding(nb_words,embedding_dims,input_length=maxlen)) model.add(Dropout(0.5)) model.add(Conv1D(cnn_filters, cnn_kernel_size,padding='valid', activation='relu')) model.add(GlobalMaxPooling1D()) model.add(Dense(dense_hidden_dims)) model.add(Dropout(0.5)) model.add(Activation('relu')) model.add(Dense(1)) model.add(Activation('sigmoid')) return model
使用K.function()函數(shù)打印中間結(jié)果
function函數(shù)可以接收傳入數(shù)據(jù),并返回一個(gè)numpy數(shù)組。使用這個(gè)函數(shù)我們可以方便地看到中間結(jié)果,尤其對(duì)于變長(zhǎng)輸入的Input。
下面是官方關(guān)于function的文檔。
function
keras.backend.function(inputs, outputs, updates=None)
實(shí)例化 Keras 函數(shù)。
參數(shù)
inputs: 占位符張量列表。
outputs: 輸出張量列表。
updates: 更新操作列表。
**kwargs: 需要傳遞給 tf.Session.run 的參數(shù)。
返回
輸出值為 Numpy 數(shù)組。
異常
ValueError: 如果無(wú)效的 kwargs 被傳入。
example
下面這個(gè)例子是打印一個(gè)LSTM層的中間結(jié)果,值得注意的是這個(gè)LSTM的sequence是變長(zhǎng)的,可以看到輸出的結(jié)果sequence長(zhǎng)度分別是64和128
import keras.backend as K from keras.layers import LSTM, Input import numpy as np I = Input(shape=(None, 200)) lstm = LSTM(20, return_sequences=True) f = K.function(inputs=[I], outputs=[lstm(I)]) data1 = np.random.random(size=(2, 64, 200)) print(f([data1])[0].shape) data2 = np.random.random(size=(2, 128, 200)) print(f([data2])[0].shape) K.clear_session() # (2, 64, 20) # (2, 128, 20)
其他的調(diào)試技巧
有頻繁張量變換操作的,如dot, mat, reshape等等,記得加一行形狀變化的注釋,如(100, 128)--> (100, 64)
可以使用tensorboard查看網(wǎng)絡(luò)的參數(shù)情況
確保你的數(shù)據(jù)沒(méi)有問(wèn)題,很多時(shí)候輸出不對(duì)不是神經(jīng)網(wǎng)絡(luò)有問(wèn)題,而是數(shù)據(jù)有問(wèn)題
以上這篇使用K.function()調(diào)試keras操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Django對(duì)接elasticsearch實(shí)現(xiàn)全文檢索的示例代碼
搜索是很常用的功能,如果是千萬(wàn)級(jí)的數(shù)據(jù)應(yīng)該怎么檢索,本文主要介紹了Django對(duì)接elasticsearch實(shí)現(xiàn)全文檢索的示例代碼,感興趣的可以了解一下2021-08-08python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫(huà)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02Scrapy中詭異xpath的匹配內(nèi)容失效問(wèn)題及解決
這篇文章主要介紹了Scrapy中詭異xpath的匹配內(nèi)容失效問(wèn)題及解決方案,具有很好的價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12python數(shù)據(jù)分析apply(),map(),applymap()用法
這篇文章主要介紹了python數(shù)據(jù)分析apply(),map(),applymap()用法,可以方便地實(shí)現(xiàn)對(duì)批量數(shù)據(jù)的自定義操作。用法歸納如下,需要的朋友可以參考一下2022-03-03Django-Rest-Framework 權(quán)限管理源碼淺析(小結(jié))
這篇文章主要介紹了Django-Rest-Framework 權(quán)限管理源碼淺析(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Python操作MySQL數(shù)據(jù)庫(kù)9個(gè)實(shí)用實(shí)例
這篇文章主要介紹了Python操作MySQL數(shù)據(jù)庫(kù)9個(gè)實(shí)用實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-12-12Python enumerate函數(shù)功能與用法示例
這篇文章主要介紹了Python enumerate函數(shù)功能與用法,結(jié)合實(shí)例形式分析了enumerate函數(shù)針對(duì)列表、字符串遍歷操作相關(guān)使用技巧,需要的朋友可以參考下2019-03-03使用Python三角函數(shù)公式計(jì)算三角形的夾角案例
這篇文章主要介紹了使用Python三角函數(shù)公式計(jì)算三角形的夾角案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04使用python+Pyqt5實(shí)現(xiàn)串口調(diào)試助手
這篇文章主要介紹了使用python+Pyqt5實(shí)現(xiàn)串口調(diào)試助手,串口通訊程序首先要對(duì)串口進(jìn)行設(shè)置,如波特率、數(shù)據(jù)位、停止位、校驗(yàn)位等,需要的朋友可以參考下2022-04-04