libtorch出力から乗数を削除して最終結果を表示するにはどうすればよいですか?

Aug 24 2020

いくつかのテンソルを画面に表示/印刷しようとすると、次のような問題が発生します。最終結果を取得する代わりに、libtorchが乗数を使用してテンソルを表示しているように見えます(つまり0.01*、以下に示すようなもの):

offsets.shape: [1, 4, 46, 85]
probs.shape: [46, 85]
offsets: (1,1,.,.) =
 0.01 *
  0.1006  1.2322
  -2.9587 -2.2280

(1,2,.,.) =
 0.01 *
  1.3772  1.3971
  -1.2813 -0.8563

(1,3,.,.) =
 0.01 *
  6.2367  9.2561
   3.5719  5.4744

(1,4,.,.) =
  0.2901  0.2963
  0.2618  0.2771
[ CPUFloatType{1,4,2,2} ]
probs: 0.0001 *
 1.4593  1.0351
  6.6782  4.9104
[ CPUFloatType{2,2} ]

この動作を無効にして最終出力を取得するにはどうすればよいですか?これが最終的な出力を保存/表示することにつながることを期待して、これを明示的にfloatに変換しようとしましたが、それも機能しません。

回答

2 MarekPiotrowski Aug 24 2020 at 12:08

テンソルを出力するためのlibtorchのソースコードに基づいて、リポジトリ内で「*」文字列を検索した後、この「プリティプリント」はaten / src / ATen / core /Formatting.cpp変換ユニットで実行されることがわかりました。スケールとアスタリスクはここに付加されます:

static void printScale(std::ostream & stream, double scale) {
  FormatGuard guard(stream);
  stream << defaultfloat << scale << " *" << std::endl;
}

そして後でテンソルのすべての座標はscale:で除算されます

if(scale != 1) {
  printScale(stream, scale);
}
double* tensor_p = tensor.data_ptr<double>();
for(int64_t i = 0; i < tensor.size(0); i++) {
  stream << std::setw(sz) << tensor_p[i]/scale << std::endl;
}

この変換ユニットに基づいて、これはまったく構成できません。

ここには2つのオプションがあると思います。

  1. 関数を微調整し、要件を満たすために既存の関数を最小限に編集します。
  2. Formatting.cppのTensor#ifdef<<演算子オーバーロードを削除(または追加)して、独自の実装を提供します。ただし、libtorchをビルドするときは、メソッドの実装を含むターゲットにlibtorchをリンクする必要があります。

ただし、どちらのオプションでも、サードパーティのコードを変更する必要があります。これは非常に悪いことだと思います。