2017-08-25 3 views
0

私はテンソルフロー実行の再現可能な結果を​​得たいと思います。テンソルtf.nn.sampled_softmax_lossの結果を再現する方法を

import numpy as np 
rnd_seed = 1 
np.random.seed(rnd_seed) 

import tensorflow as tf 
tf.set_random_seed(rnd_seed) 

だけでなく、私はtf.truncated_normalで初期化することをニューラルネットワークの重みは、また、その種子を使用していることを確認してください:私はこれを実現するためにしようとしている方法は、numpyのとtensorflow種を設定することです: tf.truncated_normal(..., seed=rnd_seed)

この疑問の範囲を超えている理由で、私はサンプリングされたソフトマックス損失関数tf.nn.sampled_softmax_lossを使用しています。残念ながら、この関数の確率的な種を使って確率関数を制御することはできません。

この関数のTensorFlowドキュメント(https://www.tensorflow.org/api_docs/python/tf/nn/sampled_softmax_loss)を見ると、パラメータsampled_valuesがランダム化に影響する唯一のパラメータであることがわかりますが、実際にシードを使用する方法を理解できません。

[EDITED] これは、(の一部)である私のスクリプト

import numpy as np 
# set a seed so that the results are consistent 
rnd_seed = 1 
np.random.seed(rnd_seed) 

import tensorflow as tf 
tf.set_random_seed(rnd_seed) 

embeddings_ini = np.random.uniform(low=-1, high=1, size=(self.vocabulary_size, self.embedding_size)) 

with graph.as_default(), tf.device('/cpu:0'): 

    train_dataset = tf.placeholder(tf.int32, shape=[None, None]) 
    train_labels = tf.placeholder(tf.int32, shape=[None, 1]) 
    valid_dataset = tf.constant(self.valid_examples, dtype=tf.int32) 

    # Variables. 
    initial_embeddings = tf.placeholder(tf.float32, shape=(self.vocabulary_size, self.embedding_size)) 
    embeddings = tf.Variable(initial_embeddings) 

    softmax_weights = tf.Variable(
     tf.truncated_normal([self.vocabulary_size, self.embedding_size], 
          stddev=1.0/math.sqrt(self.embedding_size), seed=rnd_seed)) 
    softmax_biases = tf.Variable(tf.zeros([self.vocabulary_size])) 

    # Model. 
    # Look up embeddings for inputs. 
    if self.model == "skipgrams": 
     # Skipgram model 
     embed = tf.nn.embedding_lookup(embeddings, train_dataset) 
    elif self.model == "cbow": 
     # CBOW Model 
     embeds = tf.nn.embedding_lookup(embeddings, train_dataset) 
     embed = tf.reduce_mean(embeds, 1, keep_dims=False) 

    # Compute the softmax loss, using a sample of the negative labels each time. 
    loss = tf.reduce_mean(tf.nn.sampled_softmax_loss(weights=softmax_weights, 
                biases=softmax_biases, 
                inputs=embed, 
                labels=train_labels, 
                num_sampled=self.num_sampled, 
                num_classes=self.vocabulary_size)) 
+1

我々は制御不能なランダム性の発生源があるかもしれないもの見ることができるように、あなたは完全なスクリプトを提供することはできますか? – Anis

+1

'sampled_values'パラメータの考え方は、' * _candidate_sampler'関数の1つの出力を渡すことです(ここでそれらを見ることができます(https://www.tensorflow.org/api_docs/python/tf/ nn)が、共通のセクションまたは何かにグループ化されていません。しかし、あなたが['tf.set_random_seed'](https://www.tensorflow.org/api_docs/python/tf/set_random_seed)を使用するならば、あなたが何も渡さなくても再現可能でなければなりません。あなたは[グラフ内の種を設定する]ことを確認できますか(https://stackoverflow.com/questions/36288235/how-to-get-stable-results-with-tensorflow-setting-random-seed)? – jdehesa

+0

私は同意します。 '_compute_sampled_logits'は候補サンプルにシードを渡さないので、すべてがグラフのシードになります。 – Anis

答えて

0

私は最終的に、結果が再現可能にする方法を見つけました。 @Anis私はグラフのシードを設定している必要があり、これをすることによって行うことができ示唆しただけのように:

with graph.as_default(), tf.device('/cpu:0'): 
    tf.set_random_seed(1234) 
関連する問題