2017-06-30 43 views
7

我在我的Tensorflow模型中使用存儲桶時遇到問題。當我用buckets = [(100, 100)]運行它時,它工作正常。當我用buckets = [(100, 100), (200, 200)]運行它時,它根本不起作用(底部堆棧跟蹤)。TypeError:無法在Seq2Seq中醃製_thread.lock對象

有趣的是,運行Tensorflow的Seq2Seq教程給出了幾乎相同的堆棧跟蹤相同類型的問題。出於測試目的,到知識庫的鏈接是here

我不確定這個問題是什麼,但有多個桶似乎總是觸發它。

此代碼將無法正常工作作爲一個獨立的,但是這是它崩潰的函數 - 還記得,從[(100, 100)]改變buckets[(100, 100), (200, 200)]觸發崩潰。

class MySeq2Seq(object): 
    def __init__(self, source_vocab_size, target_vocab_size, buckets, size, num_layers, batch_size, learning_rate): 
     self.source_vocab_size = source_vocab_size 
     self.target_vocab_size = target_vocab_size 
     self.buckets = buckets 
     self.batch_size = batch_size 

     cell = single_cell = tf.nn.rnn_cell.GRUCell(size) 
     if num_layers > 1: 
      cell = tf.nn.rnn_cell.MultiRNNCell([single_cell] * num_layers) 

     # The seq2seq function: we use embedding for the input and attention 
     def seq2seq_f(encoder_inputs, decoder_inputs, do_decode): 
      return tf.contrib.legacy_seq2seq.embedding_attention_seq2seq(
       encoder_inputs, decoder_inputs, cell, 
       num_encoder_symbols=source_vocab_size, 
       num_decoder_symbols=target_vocab_size, 
       embedding_size=size, 
       feed_previous=do_decode) 

     # Feeds for inputs 
     self.encoder_inputs = [] 
     self.decoder_inputs = [] 
     self.target_weights = [] 
     for i in range(buckets[-1][0]): 
      self.encoder_inputs.append(tf.placeholder(tf.int32, shape=[None], name="encoder{0}".format(i))) 
     for i in range(buckets[-1][1] + 1): 
      self.decoder_inputs.append(tf.placeholder(tf.int32, shape=[None], name="decoder{0}".format(i))) 
      self.target_weights.append(tf.placeholder(tf.float32, shape=[None], name="weight{0}".format(i))) 

     # Our targets are decoder inputs shifted by one 
     targets = [self.decoder_inputs[i + 1] for i in range(len(self.decoder_inputs) - 1)] 
     self.outputs, self.losses = tf.contrib.legacy_seq2seq.model_with_buckets(
      self.encoder_inputs, self.decoder_inputs, targets, 
      self.target_weights, [(100, 100)], 
      lambda x, y: seq2seq_f(x, y, False)) 

     # Gradients update operation for training the model 
     params = tf.trainable_variables() 
     self.updates = [] 
     for b in range(len(buckets)): 
      self.updates.append(tf.train.AdamOptimizer(learning_rate).minimize(self.losses[b])) 

     self.saver = tf.train.Saver(tf.global_variables()) 

堆棧跟蹤:

Traceback (most recent call last): 
    File "D:/Stuff/IdeaProjects/myproject/src/main.py", line 38, in <module> 
    model = predict.make_model(input_vocab_size, output_vocab_size, buckets, cell_size, model_layers, batch_size, learning_rate) 
    File "D:\Stuff\IdeaProjects\myproject\src\predictor.py", line 88, in make_model 
    size=cell_size, num_layers=model_layers, batch_size=batch_size, learning_rate=learning_rate) 
    File "D:\Stuff\IdeaProjects\myproject\src\predictor.py", line 45, in __init__ 
    lambda x, y: seq2seq_f(x, y, False)) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\contrib\legacy_seq2seq\python\ops\seq2seq.py", line 1206, in model_with_buckets 
    decoder_inputs[:bucket[1]]) 
    File "D:\Stuff\IdeaProjects\myproject\src\predictor.py", line 45, in <lambda> 
    lambda x, y: seq2seq_f(x, y, False)) 
    File "D:\Stuff\IdeaProjects\myproject\src\predictor.py", line 28, in seq2seq_f 
    feed_previous=do_decode) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\contrib\legacy_seq2seq\python\ops\seq2seq.py", line 848, in embedding_attention_seq2seq 
    encoder_cell = copy.deepcopy(cell) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 161, in deepcopy 
    y = copier(memo) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\layers\base.py", line 476, in __deepcopy__ 
    setattr(result, k, copy.deepcopy(v, memo)) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 150, in deepcopy 
    y = copier(x, memo) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 215, in _deepcopy_list 
    append(deepcopy(a, memo)) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 180, in deepcopy 
    y = _reconstruct(x, memo, *rv) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 280, in _reconstruct 
    state = deepcopy(state, memo) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 150, in deepcopy 
    y = copier(x, memo) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 240, in _deepcopy_dict 
    y[deepcopy(key, memo)] = deepcopy(value, memo) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 180, in deepcopy 
    y = _reconstruct(x, memo, *rv) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 280, in _reconstruct 
    state = deepcopy(state, memo) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 150, in deepcopy 
    y = copier(x, memo) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 240, in _deepcopy_dict 
    y[deepcopy(key, memo)] = deepcopy(value, memo) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 180, in deepcopy 
    y = _reconstruct(x, memo, *rv) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 280, in _reconstruct 
    state = deepcopy(state, memo) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 150, in deepcopy 
    y = copier(x, memo) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 240, in _deepcopy_dict 
    y[deepcopy(key, memo)] = deepcopy(value, memo) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 180, in deepcopy 
    y = _reconstruct(x, memo, *rv) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 280, in _reconstruct 
    state = deepcopy(state, memo) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 150, in deepcopy 
    y = copier(x, memo) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 240, in _deepcopy_dict 
    y[deepcopy(key, memo)] = deepcopy(value, memo) 
    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\copy.py", line 169, in deepcopy 
    rv = reductor(4) 
TypeError: can't pickle _thread.lock objects 

回答

3

的問題是,在seq2seq.py最新變化。將其添加到您的腳本中,它將避免深度處理單元格:

setattr(tf.contrib.rnn.GRUCell, '__deepcopy__', lambda self, _: self) 
setattr(tf.contrib.rnn.BasicLSTMCell, '__deepcopy__', lambda self, _: self) 
setattr(tf.contrib.rnn.MultiRNNCell, '__deepcopy__', lambda self, _: self) 
+0

問題非常嚴重。我剛剛介紹了最新的tf,並發現了這種解決方法。 – Maxim

相關問題