类型错误:无法在 Seq2Seq 中腌制 _thread.lock 对象 [英] TypeError: can't pickle _thread.lock objects in Seq2Seq
问题描述
我在 Tensorflow 模型中使用存储桶时遇到问题.当我使用 buckets = [(100, 100)]
运行它时,它工作正常.当我使用 buckets = [(100, 100), (200, 200)]
运行它时,它根本不起作用(底部的堆栈跟踪).
I'm having trouble using buckets in my Tensorflow model. When I run it with buckets = [(100, 100)]
, it works fine. When I run it with buckets = [(100, 100), (200, 200)]
it doesn't work at all (stacktrace at bottom).
有趣的是,运行 Tensorflow 的 Seq2Seq 教程会出现类似的问题,但堆栈跟踪几乎相同.出于测试目的,存储库的链接位于此处.
Interestingly, running Tensorflow's Seq2Seq tutorial gives the same kind of issue with a nearly identical stacktrace. For testing purposes, the link to the repository is here.
我不确定是什么问题,但似乎总是有多个存储桶会触发它.
此代码无法独立运行,但这是崩溃的函数 - 请记住将 buckets
从 [(100, 100)]
更改为[(100, 100), (200, 200)]
触发崩溃.
This code won't work as a standalone, but this is the function where it is crashing - remember that changing buckets
from [(100, 100)]
to [(100, 100), (200, 200)]
triggers the crash.
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:StuffIdeaProjectsmyprojectsrcpredictor.py", line 88, in make_model
size=cell_size, num_layers=model_layers, batch_size=batch_size, learning_rate=learning_rate)
File "D:StuffIdeaProjectsmyprojectsrcpredictor.py", line 45, in __init__
lambda x, y: seq2seq_f(x, y, False))
File "C:UsersuserAppDataLocalProgramsPythonPython36libsite-packages ensorflowcontriblegacy_seq2seqpythonopsseq2seq.py", line 1206, in model_with_buckets
decoder_inputs[:bucket[1]])
File "D:StuffIdeaProjectsmyprojectsrcpredictor.py", line 45, in <lambda>
lambda x, y: seq2seq_f(x, y, False))
File "D:StuffIdeaProjectsmyprojectsrcpredictor.py", line 28, in seq2seq_f
feed_previous=do_decode)
File "C:UsersuserAppDataLocalProgramsPythonPython36libsite-packages ensorflowcontriblegacy_seq2seqpythonopsseq2seq.py", line 848, in embedding_attention_seq2seq
encoder_cell = copy.deepcopy(cell)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 161, in deepcopy
y = copier(memo)
File "C:UsersuserAppDataLocalProgramsPythonPython36libsite-packages ensorflowpythonlayersase.py", line 476, in __deepcopy__
setattr(result, k, copy.deepcopy(v, memo))
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 150, in deepcopy
y = copier(x, memo)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 215, in _deepcopy_list
append(deepcopy(a, memo))
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 180, in deepcopy
y = _reconstruct(x, memo, *rv)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 280, in _reconstruct
state = deepcopy(state, memo)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 150, in deepcopy
y = copier(x, memo)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 180, in deepcopy
y = _reconstruct(x, memo, *rv)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 280, in _reconstruct
state = deepcopy(state, memo)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 150, in deepcopy
y = copier(x, memo)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 180, in deepcopy
y = _reconstruct(x, memo, *rv)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 280, in _reconstruct
state = deepcopy(state, memo)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 150, in deepcopy
y = copier(x, memo)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 180, in deepcopy
y = _reconstruct(x, memo, *rv)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 280, in _reconstruct
state = deepcopy(state, memo)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 150, in deepcopy
y = copier(x, memo)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "C:UsersuserAppDataLocalProgramsPythonPython36libcopy.py", line 169, in deepcopy
rv = reductor(4)
TypeError: can't pickle _thread.lock objects
推荐答案
问题在于 seq2seq.py
中的最新更改.将此添加到您的脚本中,它将避免对单元格进行深度处理:
The problem is with latest changes in seq2seq.py
. Add this to your script and it will avoid deep-coping of the cells:
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)
这篇关于类型错误:无法在 Seq2Seq 中腌制 _thread.lock 对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!