C++で書かれているcaffe(2でないほう)のコードがあります。
これをpython2.7に直したいのです。
まずC++のコードを書きました
cpp
1 2#include <stdio.h> // for snprintf 3#include <cuda_runtime.h> 4#include <google/protobuf/text_format.h> 5#include <string> 6#include <vector> 7#include <iostream> 8#include <fstream> 9 10#include "caffe/blob.hpp" 11#include "caffe/common.hpp" 12#include "caffe/net.hpp" 13#include "caffe/vision_layers.hpp" 14#include "caffe/proto/caffe.pb.h" 15#include "caffe/util/io.hpp" 16#include "caffe/util/image_io.hpp" 17 18int main(int argc, char** argv) { 19 20 char * MODEL_FILE = "/home/kokawa2003/work/ww2/C3D-v1.0/python/prototxt/c3d_sport1m_feature_extractor_file.prototxt"; 21 char * PRETRAINED = "/home/kokawa2003/work/ww2/C3D-v1.0/python/conv3d_deepnetA_sport1m_iter_1900000"; 22 char * LAYER = "fc6-1"; 23 int INDEX = 0; 24 25 26 27 28 Caffe::set_phase(Caffe::TEST); 29 shared_ptr<Net<Dtype> > feature_extraction_net( 30 new Net<Dtype>(string(MODEL_FILE))); 31 feature_extraction_net->CopyTrainedLayersFrom(string(PRETRAINED)); 32 33 Caffe::set_mode(Caffe::GPU); 34 Caffe::SetDevice(0); 35 vector<Blob<float>*> input_vec; 36 feature_extraction_net->Forward(input_vec); 37 const shared_ptr<Blob<Dtype> > feature_blob = feature_extraction_net 38 ->blob_by_name(LAYER); 39 int num_features = feature_blob->num(); 40 int ch=feature_blob->channels(); 41 int len=feature_blob->length() ; 42 int h=feature_blob->height(); 43 int w=feature_blob->width() ; 44 int c=feature_blob->count(); 45 LOG(ERROR) <<ch; 46 LOG(ERROR) <<num_features; 47 LOG(ERROR) <<h; 48 LOG(ERROR) <<w; 49 LOG(ERROR) <<c; 50 Dtype *mc=feature_blob->mutable_cpu_data(); 51 for(int i=0;i<c;i++){ 52 LOG(ERROR)<<mc[i]; 53 } 54 return 0; 55} 56
このコードなのですが
最初に
Caffe::set_phase(Caffe::TEST);
から始まりますが、これが
shared_ptr<Net<Dtype> > feature_extraction_net(
new Net<Dtype>(string(MODEL_FILE)));
の下に来るとどうも、最後の出力が毎回変わるのがわかりました。それでこのコードなのです。
これと同じことをpythonでしたかったので
このコードをかきました。
python
1import sys, os, os.path, numpy, caffe 2import inspect 3 4MODEL_FILE = '/home/kokawa2003/work/ww2/C3D-v1.0/python/prototxt/c3d_sport1m_feature_extractor_file.prototxt' 5PRETRAINED = '/home/kokawa2003/work/ww2/C3D-v1.0/python/conv3d_deepnetA_sport1m_iter_1900000' 6LAYER = 'fc6-1' 7INDEX = 0 8 9res=inspect.getmembers(caffe.Net); 10 11 12 13#net = caffe.Classifier(MODEL_FILE) 14net = caffe.Net(MODEL_FILE,PRETRAINED) 15net.set_phase_test() 16net.set_mode_gpu() 17net.set_device(0) 18net = caffe.Net(MODEL_FILE,PRETRAINED) 19net.forward() 20blob=net.blobs['fc6-1'] 21#features = blob.data.copy() 22#funcs=inspect.getmembers(blob) 23#net.blobs['fc6-1'].cpu_data() 24#features.cpu_data() 25print(blob.channels) 26print(blob.num) 27print(blob.height) 28print(blob.width) 29print(blob.count) 30#print(len(blob.data)) 31#print(len(blob.data[0])) 32for onedata1 in blob.data: 33 for one2 in onedata1: 34 print(one2) 35#print(blob.data[0]); 36
これで同等な出力が出るのは見ましたがコードがちょっとアレです。
とくに
net = caffe.Net(MODEL_FILE,PRETRAINED)
net.set_phase_test()
net.set_mode_gpu()
net.set_device(0)
net = caffe.Net(MODEL_FILE,PRETRAINED)
のあたりが....
netを二回読んでいるのは読む前にnet.set_phase_test()
をしたかったがやり方がわからないからです。
2回目のnet = caffe.Net(MODEL_FILE,PRETRAINED)を取ると出力が毎回変わります。
本当はどう書くのがいいのでしようか?
動いているからいいとも思うが、偶然かもしれない。
ちょっとアブノーマルだと思うので正しい書き方を知りたいです。
あなたの回答
tips
プレビュー