读取和修改caffemodel文件里的参数
??基于caffe 的卷積神經網絡模型訓練后得到的權值是通過Google Protobuf來存儲的后綴名為.caffemodel的二進制文件,這類文件一般很難直接打開進行權值的讀取和修改。有的時候我們希望直觀的看到網絡中每個神經元的權值,或者希望更改網絡的部分結構來得到新的結構進行finetune。在這樣的情況下我們就需要對caffemodel文件進行操作。好在caffe的python接口提供了針對caffemodel文件的修改方法,用戶可以從caffemodel文件中讀取參數,并對參數進行修改以得到新的caffemodel文件。
1、讀取caffemodel里的權值
??首先caffe要先進行pycaffe 的編譯并安裝好pycaffe的依賴環境。然后用下述python文件可以查看caffemodel文件中各個層的參數,以查看lenet-5權值為例。
需要注意的是,這樣的方法只能讀取有訓練參數層的權值,對于下采樣、激活層等無訓練參數的層,無法得到其層內權值(因為層內根本沒有權值)。
2、修改caffemodel內的權值并保存為新的caffemodel
??有的時候我們需要修改原caffemodel來得到新的caffemodel文件用于finetune等工作,可通過下述python文件實現,以修改lenet-5權值為例。
??但是這種方法的弊端也很明顯,這種方法只能在原有的結構上進行權值的修改,而不能對原有結構進行修改,比如,刪除原有結構中的某一層或增加新的層,或更改原有層的維度等。
??在caffe 的官方文檔中提供了一種修改caffemodel文件的方法,具體參考http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/net_surgery.ipynb(需翻墻)。這里面的案例是講caffenet的后三個全連接層(fc6/fc7/fc8)改成全卷基層(fc6-conv/fc7-conv/fc8-conv)以形成新的網絡權值文件bvlc_caffenet_full_conv.caffemodel。值得注意的是,這里面的案例也僅僅是將原來后三個全連接層的權值“攤平”(文中的寫法為flat)并賦給卷積層,由于全連接層和卷基層的參數個數是相同的,因此這個案例本質上也屬于權值的進一步修改。文中最后有這么一段話:
Note that this model isn’t totally appropriate for sliding-window detection since it was trained for whole-image classification. Nevertheless it can work just fine. Sliding-window training and finetuning can be done by defining a sliding-window ground truth and loss such that a loss map is made for every location and solving as usual. (This is an exercise for the reader.)
caffe python API for inference:
import caffe
caffe.set_mode_cpu()
net = caffe.Net(‘xx.prototxt’,‘xx.caffemodel’,caffe.TEST)
net.blobs[‘data’].data[…] = xxx(inference data)
res = net.forward()
res即為網絡的inference結果,保存為一個字典.
總結
以上是生活随笔為你收集整理的读取和修改caffemodel文件里的参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux内核——百度百科
- 下一篇: 无监督学习 | KMeans与KMean