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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

1回答

2857閲覧

Python3 乱数の設定がよくわからない

SuzuAya

総合スコア71

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2019/07/11 00:55

前提・実現したいこと

Kerasを使ってモデル開発中なのですが、再現性を得るためには乱数を固定する必要があると公式ドキュメンテーションに記載があります。
https://keras.io/ja/getting-started/faq/
ただし、他のサイト等も確認すると、こちらはCPUを使う場合に限っており、私はGPUを使っているので、少し書き換えて使っています。
エラーは発生しませんが、ちゃんとうまく機能しているかもよく分からないため、コードの中身をよく理解しようと思ったのですが、調べても見つけられなかったのでこちらに質問させていただきました。
①乱数の設定値は大体どれくらいにするのが目安なのでしょうか?また、設定する数字は揃えた方がいいですか?Kerasの公式ドキュメントはばらばらの数字を入れていましたが、数字は揃えた方がいいという記事も見ました。
②GPUを使う場合、乱数を固定しても再現性は得られないという記事を見ました。それならば乱数はあまり気にしなくて良いのでしょうか?
③以下のコードで何を行っているのか、一行ずつ解説していただけるととても助かります(例えば、なぜseed(5)が3回も出てくるのかよく分かりません…)。

初心者の質問でお手数をお掛けしますが、どうぞよろしくお願いいたします。

該当のソースコード

Python

1import numpy as np 2import tensorflow as tf 3import random as rn 4 5os.environ['PYTHONHASHSEED'] = '0' 6 np.random.seed(5) 7 rn.seed(5) 8 9 config = tf.ConfigProto() 10 config.gpu.options.per_process_gpu_memory_fraction = 0.8 11 #session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1) 12 13 tf.set_random_seed(5) 14 sess = tf.Session(graph=tf.get_default_graph(), config=config)#session_conf) 15 K.set_session(sess)

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

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

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

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

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

guest

回答1

0

まずコードに書いてあるランダムシード(random seed)について調べましょう。

ざっくり説明しておきますね。
ランダムな値を取得する時、「ランダムな値をください」というリクエストを受け付けるたびに返却される値がランダムに変わるわけですが、実際にはシードという初期値を基にして配られる番号は全部決まっています。
したがってあるシードで初期化するとその後に現れるランダムな値の並びは同じものになります。これが「乱数を固定」と書いている部分ですね。順番に取得するタイミングが同じであれば再現性があります。

以下、Pythonコンソールで試した結果です。シードで初期化したあとの並びがすべて同じになっているのがわかりますか?

>>> import random >>> random.seed(5) >>> random.random() 0.6229016948897019 >>> random.random() 0.7417869892607294 >>> random.random() 0.7951935655656966 >>> random.random() 0.9424502837770503 >>> random.random() 0.7398985747399307 >>> random.seed(5) >>> random.random() 0.6229016948897019 >>> random.random() 0.7417869892607294 >>> random.random() 0.7951935655656966 >>> random.random() 0.9424502837770503 >>> random.random() 0.7398985747399307

一方で、並列処理が実施された時の挙動は再現性がないことがあります。
理由は「ランダムな値の取得元の順番」がバラバラになるからです。
あるときはスレッドAが先に値を取得して、別のときにはスレッドBが先に取得するかもしれません。
これは仕方ないことなので再現性を担保することはできないと思います。

投稿2019/07/11 03:00

mather

総合スコア6753

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

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

SuzuAya

2019/07/11 06:45

>mather様 ご丁寧なご回答ありがとうございました!質問②についてクリアになりました。GPUを使う場合は再現性は担保できないのですね。
mather

2019/07/11 06:48

「GPUを使う」というのが基本的には並列処理を前提としているはずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問