2017-06-30 5 views
2

私は与えられたC++ tensorflow::Tensor(可変形状)オブジェクトを持っています。可変サイズのTensorFlowテンソルをC++のstd :: vectorに変換します

std::vector(多次元ベクトルの場合は入れ子ベクトル)に変換したいと思います。

これを行うにはきれいな方法がありますか?

ありがとうございます!

+1

のようなものを使用することができますか?テンソルの次元数は分かりますか?さもなければ、何らかの種類の多型を使わずにベクトルの型を指定することさえできません。これはすべてを複雑にします。 –

答えて

1

実際はありません。

vector<boost::any>を作成してネストすることができますが、消費するコードは面倒です。

あなたは上の操作されている形状どのようなコンパイル時にわかっている場合、あなたは、このベクターを用いて達成するために何をしようとしている

temlate<size_t N, typename T> 
struct tensor_traits { 
    using type = std::vector<tensor_traits<N-1, T>::type>; 
} 

template<typename T> 
struct tensor_traits<0, T> { 
    using type = T; 
} 

template<size_t N, typename T> 
tensor_traits<N, T>::type toVector(const tensorflow::Tensor & input) 
{ 
    assert(/* shape and type match */); 
    tensor_traits<N, T>::type result; 
    for(size_t i = 0; i < input.dim_size(0); ++i) 
    { 
     result.push_back(toVector<N-1, T>(input[i])); 
     // Or however you get a smaller Tensor from a larger one. The documentation is unclear 
    } 
    return result; 
} 

template<typename T> 
T toVector<0, T>(const T & input) 
{ 
    return input; 
    // Base case of single value 
} 
+0

さて、テンソルを標準のネストされたベクトルで動作する別のコードに接続する必要があります...単純なイテレータを使用している場合、想定する次元を維持するために先験的に次元を知る必要があります。 – Francesco

+1

'void doStuff(vector <ベクトル>&入力)'のような関数を持っていますか?特定の形状のテンソルをその形状のベクトルに変換する関数を作成できますが、一般的ではありません。 – Caleth

+0

はい、そうです。イテレータの場合、 'for(auto it = std :: begin(Y_pred); it!= std :: end(Y_pred); ++ it){...}'は私のためには機能しません。 'Y_pred'はテンソル流のテンソルです。 – Francesco

関連する問題