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

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

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

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

解決済

深層学習:SSDの原著論文内で示された実験結果について

tasuren
tasuren

総合スコア0

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

1回答

0評価

0クリップ

184閲覧

投稿2022/01/10 01:35

###(問)
SSDの原著論文
にて示された写真の実験結果について、
SSD300,SSD512は入力画像の解像度の違い
SSDの基本的構造は変わらない
この結果から読み取れる主張として以下の4つのうち1つだけ誤っている選択肢を選びたいです。

1.VOC2007とVOC2012で扱われているクラス数は変わらない
2.COCOではBB位置の精度を重視した指標も用いられている
3.入力の解像度は精度に影響すると考えられる
4.SSDは小さな物体の検出を苦手とすることが予想される

実験結果

あまり物体検出の論文などに慣れておらず実験結果について謝っている選択肢とその理由を教えていただきたいです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

回答1件

1

ベストアンサー

それはクロージャに捕捉した変数の所有権を移すための構文です。
クロージャは関数の外にある変数を捕捉しますが、デフォルトでは捕捉するときに参照で捕捉します。これを所有権ごと捕捉するようにするのが move || {} 構文です。ドキュメントだとクロージャの章で触れられています。

クロージャ:環境をキャプチャできる匿名関数 - The Rust Programming Language 日本語版

ドキュメントでの説明が簡素すぎるので以下に補足します。

move をつける/つけないで挙動が変わるコード例が以下になります。変数を捕捉して書き換えるクロージャを書いて呼び出したあとに、捕捉された変数が書き換えの影響を受けるか受けないかが変わります。

rust

// moveしないクロージャ let mut num = 0; let mut ref_cls = || { num += 1; num }; assert_eq!(ref_cls(), 1); // numはクロージャと共有されてるので変更される assert_eq!(num, 1);

rust

// moveするクロージャ let mut num = 0; // 本当は所有権がムーブするが、数値はCopyな型なのでコピーされる let mut ref_cls = move || { num += 1; num }; assert_eq!(ref_cls(), 1); // numはクロージャとは無関係になったので影響を受けない assert_eq!(num, 0);

他にも、もちろん借用と所有権の移動の違いがあるので捕捉された変数をクロージャを作ったあとに使えるかも変わります。

rust

// moveしないクロージャ let s = "String".to_string(); let ref_cls = || { println!("{}", s); }; // 借用してるので使える println!("{}", s);

rust

// moveするクロージャ let s = "String".to_string(); let ref_cls = move || { println!("{}", s); }; // `s`は既にムーブしているので使うとエラー // println!("{}", s);

質問のコードは move を外すと動かなくなると思います。 num を借用していると関数の終わりでライフタイムが尽きるので関数の外に持ち出せなくなるからです。

投稿2022/01/10 06:24

blackenedgold
blackenedgold

総合スコア0

良いと思った回答には高評価をしましょう。
評価が高い回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

コメント

tasuren
tasuren

2022/01/11 03:51

なるほど、ありがとうございます。

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。