Caffeでディープラーニング研究開発をするにあたり、FeatureMapsの数だったりを増やしたり減らしたりしながら試行錯誤することはよくあります。
そんなとき、ネットワーク構造をPythonから自動的に変更させたくなりますよね?(あれ?なりませんか?)
とういわけでPythonからネットワーク構造定義ファイル.prototxtを編集する方法を調べました。こちらの投稿が参考になりました。
結論
・caffe_pb2 と google.protobuf.text_format を利用
・caffe.netから変更と保存できればと思ったけど無理そう
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from caffe.proto import caffe_pb2 import google.protobuf.text_format as txtf net = caffe_pb2.NetParameter() with open( '/tmp/net.prototxt') as f: # .prototxtの読み込み s = f.read() txtf.Merge(s, net) layerNames = [l.name for l in net.layer] # 構造定義からLayer一覧取得 idx = layerNames.index('conv1') conv = net.layer[idx] # 変数convで"conv1"アクセス conv.convolution_param.num_output = 16 # FeatureMaps数を16に変更 with open('/tmp/newNet.prototxt', 'w') as f: f.write(str(net)) |
例えばprint(conv)とすると下記のように構造をとれていることがわかります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
layer { name: "conv1" type: "Convolution" bottom: "data" top: "conv1" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 16 kernel_h: 1 kernel_w: 24 stride_h: 1 stride_w: 1 pad_h: 0 pad_w: 12 } } |
なお、.caffemodelは
1 2 3 |
net.params['conv1'][0].data.shape net.params['conv1'][0].data # W net.params['conv1'][1].data # b |
とった具合に編集していってください。