2016-12-30 16 views
0

を訓練しながら、ナンである私は、次のスタックトレースを取得する場所、私は損失を計算するためのステップが問題のように見える状況にtensorflow損失は、単一のGRUセルとRNNを実行しているRNN

Traceback (most recent call last): 
    File "language_model_test.py", line 15, in <module> 
    test_model() 
    File "language_model_test.py", line 12, in test_model 
    model.train(random_data, s) 
    File "/home/language_model/language_model.py", line 120, in train 
    train_pp = self._run_epoch(data, sess, inputs, rnn_ouputs, loss, trainOp, verbose) 
    File "/home/language_model/language_model.py", line 92, in _run_epoch 
    loss, _= sess.run([loss, trainOp], feed_dict=feed) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 767, in run 
    run_metadata_ptr) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 952, in _run 
    fetch_handler = _FetchHandler(self._graph, fetches, feed_dict_string) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 408, in __init__ 
    self._fetch_mapper = _FetchMapper.for_fetch(fetches) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 230, in for_fetch 
    return _ListFetchMapper(fetch) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 337, in __init__ 
    self._mappers = [_FetchMapper.for_fetch(fetch) for fetch in fetches] 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 238, in for_fetch 
    return _ElementFetchMapper(fetches, contraction_fn) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 271, in __init__ 
    % (fetch, type(fetch), str(e))) 
TypeError: Fetch argument nan has invalid type <type 'numpy.float32'>, must be a string or Tensor. (Can not convert a float32 into a Tensor or Operation.) 

を実行している

ここで
def train(self,data, session=tf.Session(), verbose=10): 

     print "initializing model" 
     self._add_placeholders() 
     inputs = self._add_embedding() 
     rnn_ouputs, _ = self._run_rnn(inputs) 
     outputs = self._projection_layer(rnn_ouputs) 
     loss = self._compute_loss(outputs) 
     trainOp = self._add_train_step(loss) 
     start = tf.initialize_all_variables() 
     saver = tf.train.Saver() 

     with session as sess: 
      sess.run(start) 

      for epoch in xrange(self._max_epochs): 
       train_pp = self._run_epoch(data, sess, inputs, rnn_ouputs, loss, trainOp, verbose) 
       print "Training preplexity for batch {} - {}".format(epoch, train_pp) 

_run_epoch

のためのコードは、損失の任意の場所に戻ってnan

来るです
def _run_epoch(self, data, session, inputs, rnn_ouputs, loss, trainOp, verbose=10): 
    with session.as_default() as sess: 
     total_steps = sum(1 for x in data_iterator(data, self._batch_size, self._max_steps)) 
     train_loss = [] 
     for step, (x,y, l) in enumerate(data_iterator(data, self._batch_size, self._max_steps)): 
      print "step - {0}".format(step) 
      feed = { 
       self.input_placeholder: x, 
       self.label_placeholder: y, 
       self.sequence_length: l, 
       self._dropout_placeholder: self._dropout, 
      } 
      loss, _= sess.run([loss, trainOp], feed_dict=feed) 
      print "loss - {0}".format(loss) 
      train_loss.append(loss) 
      if verbose and step % verbose == 0: 
       sys.stdout.write('\r{}/{} : pp = {}'. format(step, total_steps, np.exp(np.mean(train_loss)))) 
       sys.stdout.flush() 
      if verbose: 
       sys.stdout.write('\r') 

     return np.exp(np.mean(train_loss)) 

これは私が入力としての周りに渡す単語IDを使用して模倣するように設計されて自分のデータ random_data = np.random.normal(0, 100, size=[42068, 46])については、以下を使用して自分のコードをテストするときに生じるれます。私のコードの残りの部分は、ここでは、次のgist

EDITで見つけることができます私はこの問題が発生したテストスーツ実行する方法です:私は他の言語モデルにrandom_dataを置き換えた場合

def test_model(): 
    model = Language_model(vocab=range(0,101)) 
    s = tf.Session() 
    #1 more than step size to acoomodate for the <eos> token at the end 
    random_data = np.random.normal(0, 100, size=[42068, 46]) 
    # file = "./data/ptb.test.txt" 
    print "Fitting started" 
    model.train(random_data, s) 

if __name__ == "__main__": 
    test_model() 

を、費用としてnanも出力されます。私の理解では、テンソルフローは、フィードディクテーションを渡すことによって数値を取得し、idに対応する適切な埋め込みベクトルを取得する必要があります。なぜrandom_dataが他のモデルのnanを引き起こしているのか分かりません。

答えて

0

上記のコードにはいくつかの問題がありますが、この行で始まることができます

random_data = np.random.normal(0, 100, size=[42068, 46]) 

np.random.normal(...)は異なる値を生成しません

、それはむしろ浮動小数点値を生成し、上記の次の例を試すことができますが、管理可能なサイズで

>>> np.random.normal(0, 100, size=[5]) 
array([-53.12407229, 39.57335574, -98.25406749, 90.81471139, -41.05069646]) 

ものは埋め込みモデルへの入力であることを意味していると我々は浮動小数点値と一緒に負の値を持っているので、機械学習アルゴリズムは、それらを学ぶことができる方法はありません。

実際に何が望まれていることは、次のコードである。その出力を確認する

random_data = np.random.randint(0, 101, size=...) 

我々は次に、以下の行は、実際に微妙な問題を作成している

>>> np.random.randint(0, 100, size=[5]) 
array([27, 47, 33, 12, 24]) 

を取得します。

def _run_epoch(self, data, session, inputs, rnn_ouputs, loss, train, verbose=10): 
    with session.as_default() as sess: 
     total_steps = sum(1 for x in data_iterator(data, self._batch_size, self._max_steps)) 
     train_loss = [] 
     for step, (x,y, l) in enumerate(data_iterator(data, self._batch_size, self._max_steps)): 
      print "step - {0}".format(step) 
      feed = { 
       self.input_placeholder: x, 
       self.label_placeholder: y, 
       self.sequence_length: l, 
       self._dropout_placeholder: self._dropout, 
      } 
      loss, _= sess.run([loss, train], feed_dict=feed) 
      print "loss - {0}".format(loss) 
      train_loss.append(loss) 
      if verbose and step % verbose == 0: 
       sys.stdout.write('\r{}/{} : pp = {}'. format(step, total_steps, np.exp(np.mean(train_loss)))) 
       sys.stdout.flush() 
      if verbose: 
       sys.stdout.write('\r') 

     return np.exp(np.mean(train_loss)) 

lossは、パラメータ引数と変数の両方であるので、初めてその走行、それはもはやテンソルできなくなりますので、私たちは実際のセッションでそれを呼び出すことはできません。

関連する問題