2017-06-16 18 views
1

の形状を取得し、私は次のコードスニペットからこれらのoutpusを得た理由は、私が理解することはできません。mxnet(mshadow)私はmshadowで初心者だテンソル

TensorContainer<cpu, 2> lhs(Shape2(2, 3)); 
lhs = 1.0; 
printf("%u %u\n", lhs.size(0), lhs.size(1)); 
printf("%u %u\n", lhs[0].shape_[0], lhs[0].shape_[1]); 
printf("%u %u\n", lhs[0].size(0), lhs[0].size(1)); 

出力は次のようになります。

2 3 
3 4 
3 3 

なぜ2番目と3番目の出力がその数字ですか? lhs[0]は1次元なので、正確に同じでなければならないと思います。つまり、3 0です。誰かが私が間違っていた場所を教えてもらえますか?前もって感謝します!

答えて

1

あなたは正しいです、テンソルlhs [0]は1次元ですが、最初に質問に答えるために、ボンネットの下で何が起こっているかを見せてください。 TensorContainerは[]演算子をオーバーライドしない代わりに、それは(テンソルである)親からの1つを使用して、より正確following oneが呼び出され:

MSHADOW_XINLINE Tensor<Device, kSubdim, DType> operator[](index_t idx) const { 
    return Tensor<Device, kSubdim, DType>(dptr_ + this->MemSize<1>() * idx, 
              shape_.SubShape(), stride_, stream_); 
    } 

それはスタック上に新しいテンソルを作成分かるようにそして、大部分のケースでは汎用N-dimensional Tensorが作成されますが、ここでは1次元の場合は1-dimensional Tensorという特別なものが作成されます。

今、私たちは[]演算子によって返されるまさに確立したとき、のは、そのクラスのフィールドに見てみましょう:ここshape_のみ1寸法を有する見ることができます

DType *dptr_; 
    Shape<1> shape_; 
    index_t stride_; 

のよう!だからshape_ 1がなく、代わりにshape_ 1を呼び出すことによって、stride_(またはその一部)が返されます。ここでは、実行して、実際にそこに何が起こっているかを確認するために試みることができるテンソルコンストラクタに変更されます。

MSHADOW_XINLINE Tensor(DType *dptr, Shape<1> shape, 
         index_t stride, Stream<Device> *stream) 
     : dptr_(dptr), shape_(shape), stride_(stride), stream_(stream) { 
    std::cout << "shape[0]: " << shape[0] << std::endl; // 3 
    std::cout << "shape[1]: " << shape[1] << std::endl; // 0, as expected 
    std::cout << "_shape[0]: " << shape_[0] << std::endl; // 3, as expected 
    std::cout << "_shape[1]: " << shape_[1] << std::endl; // garbage (4) 
    std::cout << "address of _shape[1]: " << &(shape_[1]) << std::endl; 
    std::cout << "address of stride: " << &(stride_) << std::endl; 
    } 

と出力:

shape[0]: 3 
shape[1]: 0 
_shape[0]: 3 
_shape[1]: 4 
address of _shape[1]: 0x7fffa28ec44c 
address of stride: 0x7fffa28ec44c 

_shape 1とストライドが同じアドレスの両方を持っています(0x7fffa28ec44c)。

+0

鮮やかな答え!どうもありがとう! –

+0

@ROBOTAIこれが正しい答えだと思うなら、それを正しいとマークするように頼んでもいいですか? –

関連する問題