TypeError:无法在Seq2Seq中pickle_thread.lock对象

我在Tensorflow模型中使用桶时遇到问题。当我使用bucket=[(100100)]运行它时,它工作得很好。当我使用bucket=[(100100),(200200)]运行它时,它根本不工作(底部是stacktrace)

有趣的是,运行Tensorflow的Seq2Seq教程也会产生类似的问题,但堆栈跟踪几乎相同。出于测试目的,指向存储库的链接位于此处

我不确定问题出在哪里,但有多个桶似乎总是会触发它。

此代码不会作为独立代码工作,但这是它崩溃的函数-请记住,将存储桶[(100100)]更改为[(100100),(200200)]会触发崩溃

类myseqseq(对象):
定义初始(自身、源词汇大小、目标词汇大小、存储桶、大小、层数、批量大小、学习率):
self.source\u vocab\u size=source\u vocab\u size
self.target\u vocab\u size=target\u vocab\u size
self.bucket=bucket
self.batch\u size=批次大小
cell=single_cell=tf.nn.rnn_cell.GRUCell(大小)
如果层数大于;1:
cell=tf.nn.rnn\u cell.multirncell([单个\u cell]*num\u层)
#seq2seq函数:我们将嵌入用于输入和注意
def seq2seq_f(编码器输入、解码器输入、do_解码):
返回tf.contrib.legacy_seq2seq.embeding_attention_seq2seq(
编码器输入,解码器输入,单元,
num\u编码器\u符号=源\u语音\u大小,
num_decoder_symbols=target_vocab_size,
嵌入大小=大小,
feed_previous=do_decode)
#输入源
self.encoder_输入=[]
self.decoder_输入=[]
self.target_权重=[]
对于范围内的i(桶[-1][0]):
self.encoder_inputs.append(tf.placeholder(tf.int32,shape=[None],name=“encoder{0}.”格式(i)))
对于范围内的i(桶[-1][1]+1):
self.decoder_inputs.append(tf.placeholder(tf.int32,shape=[None],name=“decoder{0}.”格式(i)))
self.target_weights.append(tf.placeholder(tf.float32,shape=[None],name=“weight{0}.”格式(i)))
#我们的目标是解码器输入偏移1
目标=[范围内i的自译码器输入[i+1](len(自译码器输入)-1)]
self.outputs,self.loss=tf.contrib.legacy_seq2seq.model_和_bucket(
自编码器输入、自解码器输入、目标、,
自身目标权重,[(100100)],
lambda x,y:seq2seq_f(x,y,False))
#用于训练模型的梯度更新操作
params=tf.可训练的_变量()
self.updates=[]
对于范围内的b(len(铲斗)):
self.updates.append(tf.train.AdamOptimizer(学习率)。最小化(self.loss[b]))
self.saver=tf.train.saver(tf.global_variables())

堆栈跟踪:

回溯(最近一次呼叫最后一次):
文件“D:/Stuff/IdeaProjects/myproject/src/main.py”,第38行,in<模块>
模型=预测。制作模型(输入、输出、存储桶、单元、模型层、批量、学习率)
文件“D:\Stuff\IdeaProjects\myproject\src\predictor.py”,第88行,在make\u模型中
大小=单元大小,数量层=模型层,批次大小=批次大小,学习率=学习率)
文件“D:\Stuff\IdeaProjects\myproject\src\predictor.py”,第45行,在\uu init中__
lambda x,y:seq2seq_f(x,y,False))
文件“C:\Users\user\AppData\Local\Programs\Python\36\lib\site packages\tensorflow\contrib\legacy\u-seq2seq\Python\ops\seq2seq.py”,第1206行,在带桶的模型中
解码器_输入[:bucket[1]])
文件“D:\Stuff\IdeaProjects\myproject\src\predictor.py”,第45行,在<lambda>
lambda x,y:seq2seq_f(x,y,False))
文件“D:\Stuff\IdeaProjects\myproject\src\predictor.py”,第28行,在seq2seq\u f中
feed_previous=do_decode)
文件“C:\Users\user\AppData\Local\Programs\Python\36\lib\site packages\tensorflow\contrib\legacy\u-seq2seq\Python\ops\seq2seq.py”,嵌入\u-seq2seq中的第848行
编码器\单元=复制。深度复制(单元)
文件“C:\Users\user\AppData\Local\Programs\Python36\lib\copy.py”,第161行,在deepcopy中
y=复印机(备忘录)
文件“C:\Users\user\AppData\Local\Programs\Python\36\lib\site packages\tensorflow\Python\layers\base.py”,第476行,在\uuu deepcopy中__
setattr(结果,k,副本。深度副本(v,备忘录))
文件“C:\Users\user\AppData\Local\Programs\Python36\lib\copy.py”,第150行,在deepcopy中
y=复印机(x,备忘)
文件“C:\Users\user\AppData\Local\Programs\Python\36\lib\copy.py”,第215行,在\u deepcopy\u列表中
附加(副本(a、备忘录))
文件“C:\Users\user\AppData\Local\Programs\Python36\lib\copy.py”,第180行,在deepcopy中
y=_(x,备忘录,*rv)
文件“C:\Users\user\AppData\Local\Programs\Python\36\lib\copy.py”,第280行,在\u
状态=深度复制(状态,备忘录)
文件“C:\Users\user\AppData\Local\Programs\Python36\lib\copy.py”,第150行,在deepcopy中
y=复印机(x,备忘)
文件“C:\Users\user\AppData\Local\Programs\Python\36\lib\copy.py”,第240行,在目录中
y[deepcopy(key,memo)]=deepcopy(value,memo)
文件“C:\Users\user\AppData\Local\Programs\Python36\lib\copy.py”,第180行,在deepcopy中
y=_(x,备忘录,*rv)
文件“C:\Users\user\AppData\Local\Programs\Python\36\lib\copy.py”,第280行,在\u
状态=深度复制(状态,备忘录)
文件“C:\Users\user\AppData\Local\Programs\Python36\lib\copy.py”,第150行,在deepcopy中
y=复印机(x,备忘)
文件“C:\Users\user\AppData\Local\Programs\Python\36\lib\copy.py”,第240行,在目录中
y[deepcopy(key,memo)]=deepcopy(value,memo)
文件“C:\Users\user\AppData\Local\Programs\Python36\lib\copy.py”,第180行,在deepcopy中
y=_(x,备忘录,*rv)
文件“C:\Users\user\AppData\Local\Programs\Python\36\lib\copy.py”,第280行,在\u
状态=深度复制(状态,备忘录)
文件“C:\Users\user\AppData\Local\Programs\Python36\lib\copy.py”,第150行,在deepcopy中
y=复印机(x,备忘)
文件“C:\Users\user\AppData\Local\Programs\Python\36\lib\copy.py”,第240行,在目录中
y[deepcopy(key,memo)]=deepcopy(value,memo)
文件“C:\Users\user\AppData\Local\Programs\Python36\lib\copy.py”,第180行,在deepcopy中
y=_(x,备忘录,*rv)
文件“C:\Users\user\AppData\Local\Programs\Python\36\lib\copy.py”,第280行,在\u
状态=深度复制(状态,备忘录)
文件“C:\Users\user\AppData\Local\Programs\Python36\lib\copy.py”,第150行,在deepcopy中
y=复印机(x,备忘)
文件“C:\Users\user\AppData\Local\Programs\Python\36\lib\copy.py”,第240行,在目录中
y[deepcopy(key,memo)]=deepcopy(value,memo)
文件“C:\Users\user\AppData\Local\Programs\Python36\lib\copy.py”,第169行,在deepcopy中
rv=减速器(4)
TypeError:无法pickle\u thread.lock对象

问题在于seq2seq.py中的最新更改。将此添加到脚本中,可以避免单元格的深度覆盖:

setattr
setattr(tf.contrib.rnn.BasicLSTMCell,“\uuuu deepcopy\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”,lambda self,\uuuuu:self)
setattr(tf.contrib.rnn.MultiRNNCell,“\uuuu deepcopy\uuuuuuuuuuuuuuuuuuu”,lambda self,\uuuu:self)

发表评论