質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Caffe

Caffeは、深層学習に用いられるオープンソースフレームワークの一つです。C++で実装されており、C++/Python/MATLABで用いることができます。画像認識に特化しており、動作も早い点が特徴。GUPにも対応しています。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1373閲覧

pythonのcaffeコードを直せない。

kokawa2003

総合スコア217

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Caffe

Caffeは、深層学習に用いられるオープンソースフレームワークの一つです。C++で実装されており、C++/Python/MATLABで用いることができます。画像認識に特化しており、動作も早い点が特徴。GUPにも対応しています。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/04 08:03

編集2021/10/06 04:10

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)を取ると出力が毎回変わります。
本当はどう書くのがいいのでしようか?
動いているからいいとも思うが、偶然かもしれない。
ちょっとアブノーマルだと思うので正しい書き方を知りたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KoichiSugiyama

2021/10/04 08:30

#include "caffe/blob.hpp" とありますので、Blobの実態はこのヘッダファイルを見てみればわからないですかね?他にcaffe/blob.cppとかがもしあるなら、mutable_cpu_data()が何をやっているか見つかるように思えますが。どうでしょうか。
kokawa2003

2021/10/04 09:29

blob.cppではこうなってます template <typename Dtype> Dtype* Blob<Dtype>::mutable_cpu_data() { CHECK(data_); return reinterpret_cast<Dtype*>(data_->mutable_cpu_data()); } でこのdata_はヘッダからわかる情報では shared_ptr<SyncedMemory> data_;
kokawa2003

2021/10/04 09:32

でさらに void* SyncedMemory::mutable_cpu_data() { to_cpu(); head_ = HEAD_AT_CPU; return cpu_ptr_; }
kokawa2003

2021/10/04 09:32

でさらに inline void SyncedMemory::to_cpu() { switch (head_) { case UNINITIALIZED: CaffeMallocHost(&cpu_ptr_, size_); memset(cpu_ptr_, 0, size_); head_ = HEAD_AT_CPU; own_cpu_data_ = true; break; case HEAD_AT_GPU: if (cpu_ptr_ == NULL) { CaffeMallocHost(&cpu_ptr_, size_); own_cpu_data_ = true; } CUDA_CHECK(cudaMemcpy(cpu_ptr_, gpu_ptr_, size_, cudaMemcpyDeviceToHost)); head_ = SYNCED; break; case HEAD_AT_CPU: case SYNCED: break; } }
kokawa2003

2021/10/04 10:15

そもそも print(net.blobs['fc6-1'].channels) print(net.blobs['fc6-1'].num) #net.blobs['fc6-1'].length print(net.blobs['fc6-1'].height) print(net.blobs['fc6-1'].width) print(net.blobs['fc6-1'].count) みたいにアクセスできるものとそうでないものとをどう区別しているかもわかっていない
kokawa2003

2021/10/04 10:27

あとこれを真似て pythonでnet.blobs['fc6-1'].dataとするとこれはnumpyなのでなにもできない
kokawa2003

2021/10/04 14:00

明日もう一回別スレたてます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問