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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1174閲覧

tf.image.random_flip_left_right() のseedの必要性について

24nishi24

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/27 10:00

前提・質問内容

公式ドキュメント(https://www.tensorflow.org/api_docs/python/tf/image/random_flip_left_right?hl=ja)によると
tf.image.random_flip_left_right(image, seed=None)は以下の処理を行うようです。
「1/2の確率で、2番目の次元( width )に沿って反転された image のコンテンツを出力します。それ以外の場合は、画像をそのまま出力します。画像のバッチを渡す場合、各画像は他の画像とは無関係にランダムに反転されます。」

つまり、seedが何であっても1/2の確率で水平反転するので再現性は無いことになります。
公式ドキュメントの下の方に、以下のような内容が書いてあるのでこれ間違いないと思います。
「シード値を指定して決定論的な結果を得るには、tf.image.stateless_random_flip_left_rightを使用します。」
であるなら、この関数にseedが設定されている理由は何なのでしょうか?

自分の推測

デフォルトのseedもNoneになっているし、特に意味は無いがとりあえず存在している。

断り

答え合わせがしたい性格でこのような質問をしました。
もしかしたらこのサイトにとっては不適切な質問かもしれません。
もしそうであったなら、申し訳なく思います。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

疑問点の確認

公式

For producing deterministic results given a seed value, use tf.image.stateless_random_flip_left_right. Unlike using the seed param with tf.image.random_* ops, tf.image.stateless_random_* ops guarantee the same results given the same seed independent of how many times the function is called, and independent of global seed settings (e.g. tf.random.set_seed).

の部分でしょうか。ここと思って回答を書きます。

勝手に翻訳

  • シード値を与えて常に決まった値を得るためにはtf.image.stateless_random_flip_left_right

を使ってください。

  • tf.image.random_*系の関数に対してシード値を使うのと異なりtf.image.stateless_random_*系の関数では(例え)何回関数が呼ばれようともそれとは一切独立して(常に)同じ結果が得られることが保証されています。
  • そして、これは――例えば、 tf.random.set_seedのような関数でグローバルのシード設定をしたとして、それとは(別に)独立しています(関数に直でseedを指定したら前にどんなシードを使っていようが、直に指定されたseedに支配される、ということです)。

何のためのseed?

seedが何であっても1/2の確率で水平反転するので再現性は無いことになります。

この通りのことが起きるため、試験の性質によっては、ランダム性を完全に排除したいときに困ってしまいます。

そこで役に立つのが、上記のseedということです。1枚目のシードは1、2枚目のシードは2のような使い方をすれば、世界中のどこでだれがどう使っても、まったく同じように規則に従ったランダムで画像を処理できます。

長くなりましたが、つまるところ**「(Seedを知らなければ)ランダムはランダムだけど、何といっても乱数の値がSeedで決まっているから、いつどこでだれがやっても"〇枚目は必ず反転"のような再現性が取れるよ」**というお話です。

投稿2021/10/27 12:44

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

24nishi24

2021/10/29 05:00

非常に分かりやすいご回答ありがとうございます。 回答の結論にある 「(seedが指定できるおかげで)いつどこでだれがやっても"〇枚目は必ず反転"のような再現性が取れるよ」というのは、 tf.image.stateless_random_*系のお話であってますよね? 今回私が知りたいのは、 seedが何であっても1/2の確率で水平反転する(再現性は無い) tf.image.random_flip_left_right()でのseedの存在意義です。 質問がわかりにくくて申し訳無いです。 この質問への回答が実務上役に立たないのは重々承知なのですが、 どうしても気になって質問させて頂きました。 とはいえ、fourteenlengthさんの回答により、改めて乱数とseedに関する知識を整理できました。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2021/10/29 10:13

https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/tutorials/images/data_augmentation.ipynb#scrollTo=5CPP0vEKB56X が詳しいです。つまるところ、「どちらもseedのshapeが違うだけでできることは同じだけど、安全なstatelessを使ってね」だそうです。 tf.image.random_* TFv1.xからの関数をほぼそのまま移植、seedはinteger。あまり安全じゃない。 tf.image.stateless_random_* TFv2.xからの関数、seedはshape(2)のintegerが入るテンソル。安全らしい。
24nishi24

2021/11/04 11:04

tf.image.stateless_random_* が tf.image.random_* の改良版のようなものなのですね! よくわかりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問