前回の書き込みから1ヵ月経ってしまった。先日の三連休に試験があり、その勉強でプログラミングができなかったのである。秋の三連休の試験といえばアレである。泣く子も黙る国家資格、情報処理技術者試験だ。今回は高度情報処理技術者。首尾は上場。まあ専業資格ではないので受かっても名刺に書いてハッタリかますだけだけどね。
世の中リスキリングなどという言葉が流行っているが、社会人たるもの時代に合わせて勉強するのは当たり前。技術革新など今に始まったことではない。30年同じことやって美味い飯が食い続ける訳がない。何を今更ドマヌケなことを言っているのかである。私が社会人になったときは会社にパソコンなど無かったのだ。C++、java、js、sql、vbからCAD検定、英語独語ロシア語、果ては溶接技能検定、クレーン、大特に至るまで全部社会人になってから習得した。
今はまたIT系がマイブームで来春も高度情報処理技術者のST、あと技術士を受けるつもり。頭はハゲてもバブルを生で見た世代である。昭和のおじさんはギラギラ油の肉食系で、常に向上心を忘れないのだ。平成のナヨナヨした若造と一緒にしないでいただきたい。
tupleを使う
LibTorchにはタプルで値を返す関数がある。↓こんな奴だ。
best_prior_overlap, best_prior_idx = overlaps.max(1, keepdim = True)
なんで戻り値二つ返すねん、クソムカつく(# ゚Д゚)・・・とは思わない。C系の関数が1つしか戻り値を返さないのは昔のCPUが非力で戻り値用のレジスタが一つしかなかったせいだ。今のCPUはレジスタが腐るほど在るので、当然複数の値を返すオペコードもある。例えばsincos命令とか。確か80386から実装していたはずだ。だから関数が複数の値を返すのは自然な事。C++もC++11の頃から対応している(らしい)。
↓上のコードはC++11だとこんな感じになる。
std::tuple<at::Tensor, at::Tensor> ret;
ret= overlaps.max(1, true);
torch::Tensor best_prior_overlap = std::get<0>(ret);
torch::Tensor best_prior_idx = std::get<1>(ret);
↓C++17だとこんな感じになる。
auto[best_truth_overlap, best_truth_idx] = overlaps.max(1, true);
C++17のほうが圧倒的にスマートだね。