Python 3.x Tensorflow seq2seq解码器问题?
我尝试用tensorflow tf.contrib.seq2seq包编写一个seq2seq解码器。 我想知道我的代码是否正确,是否有更好的方法重写它。文档不容易阅读 或者我的问题可能是:如何轻松调试此类代码?如何检查tensorflow中的一些中间结果Python 3.x Tensorflow seq2seq解码器问题?,python-3.x,tensorflow,translation,Python 3.x,Tensorflow,Translation,我尝试用tensorflow tf.contrib.seq2seq包编写一个seq2seq解码器。 我想知道我的代码是否正确,是否有更好的方法重写它。文档不容易阅读 或者我的问题可能是:如何轻松调试此类代码?如何检查tensorflow中的一些中间结果 class Decoder: def __init__(self, embedding, hidden_size, num_layers=1, max_length=15): self.embedding = embedd
class Decoder:
def __init__(self, embedding, hidden_size, num_layers=1, max_length=15):
self.embedding = embedding
self.hidden_size = hidden_size
self.num_layers = num_layers
self.cell = tf.nn.rnn_cell.GRUCell(hidden_size)
self.linear = tf.Variable(tf.random_normal(shape=(self.hidden_size, cn_total_words))*0.1)
def __call__(self, inputs, state, encoder_outputs, encoder_state, decoder_length, mode="train"):
with tf.variable_scope("decoder") as scope:
inputs = tf.nn.embedding_lookup(self.embedding, inputs)
encoder_state = tf.tile(tf.expand_dims(encoder_state, 1), (1, tf.shape(inputs)[1], 1))
attention_mechanism = tf.contrib.seq2seq.LuongAttention(self.hidden_size, encoder_outputs)
attn_cell = tf.contrib.seq2seq.AttentionWrapper(self.cell, attention_mechanism, self.hidden_size)
if mode == "train":
helper = tf.contrib.seq2seq.TrainingHelper(inputs=inputs, sequence_length=decoder_length)
elif mode == "infer":
helper = tf.contrib.seq2seq.GreedyEmbeddingHelper(embedding=self.embedding,
start_tokens=tf.tile([en_dict["BOS"]], [tf.shape(inputs)[0]]), end_token=en_dict["EOS"])
decoder = tf.contrib.seq2seq.BasicDecoder(cell=attn_cell, helper=helper,
initial_state=attn_cell.zero_state(tf.shape(inputs)[0], tf.float32))
outputs, _, _ = tf.contrib.seq2seq.dynamic_decode(decoder=decoder)
outputs = tf.concat([tf.expand_dims(out, 1) for out in outputs], 1)
outputs = tf.tensordot(outputs, self.linear, axes=[[2], [0]])
return outputs, state
我在运行代码时遇到以下错误
---------------------------------------------------------------------------ValueError回溯(最近的调用
最后)
~/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py
在apply_op中(self,op_type_name,name,**关键字)
434首选类型=默认类型,
-->435 as_ref=输入参数is_ref)
436如果输入参数编号属性和长度(
~/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/framework/ops.py
在“内部”中,将\u n\u转换为\u张量(值、数据类型、名称,如\u ref、,
首选(数据类型)
736 as_ref=as_ref,
-->737首选类型=首选类型)
738返回ret
~/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/framework/ops.py
在内部\u中,将\u转换为\u张量(值、数据类型、名称,作为\u参考,
首选(数据类型)
675如果ret为无:
-->676 ret=conversion\u func(值,dtype=dtype,name=name,as\u ref=as\u ref)
677
~/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/framework/ops.py
in_TensorTensorConversionFunction(t、数据类型、名称、as_ref)
548“对于数据类型为%s的张量,张量转换请求的数据类型为%s:%r”
-->549%(dtype.name,t.dtype.name,str(t)))
550返回t
ValueError:Tensor转换请求了Tensor的dtype float32
数据类型int32:'张量(“seq2seq序列/解码器/扩展DIMS_2:0”),形状=(?,
1,?),数据类型=int32“
在处理上述异常期间,发生了另一个异常:
TypeError回溯(最近的调用
最后)在()
4 emb_en=np.random.uniform(低=0.1,高=0.1,大小=(总单词,隐藏大小))
5 emb\u cn=np.random.uniform(低=0.1,高=0.1,大小=(总单词数,隐藏大小))
---->6 model=Seq2Seq(隐藏大小、层数、emb\u en、emb\u cn)
7 sess=tf.Session()
8 init=tf.global_variables_initializer()
在初始化中(自身,隐藏大小,
层数、嵌入单词、嵌入单词)
81编码器输出,编码器状态=自编码器(自编码器输入,自编码器长度)
82解码器长度=tf.cast(tf.reduce\u和(self.decoder\u掩码,1),tf.int32)
--->83解码器输出,解码器状态=自解码器(自解码器输入,编码器状态,编码器输出,
编码器(U状态、解码器(U长度)
84
85#解码器输出。追加(解码器输出)
在中调用(自身、输入、状态、,
编码器输出、编码器状态、解码器长度、模式)
50
51输出,u,u=tf.contrib.seq2seq.dynamic_解码(解码器=解码器)
--->52个输出=tf.concat([tf.expand_dims(out,1)用于out-in输出),1)
53
54个输出=tf.tensordot(输出,自线性,轴=[[2],[0]])
~/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/ops/array_ops.py
在concat(值、轴、名称)1064中返回
gen_阵列操作。concat_v2(值=值,1065轴=轴, ->1066 name=name)1067 1068 ~/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/ops/gen\u array\u ops.py in_concat_v2(值、轴、名称) 491 """ 492结果=_op_def_lib.apply_op(“ConcatV2”),值=值,轴=轴, -->493名称=名称) 494返回结果 495 ~/anaconda3/envs/py36/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py 在apply_op中(self,op_type_name,name,**关键字) 461(前缀,dtype.name)) 462其他: -->463 raise TypeError(“%s”不完全匹配。“%前缀) 464其他: 465 raise TypeError(“%s”无效。“%前缀) TypeError:传递给“ConcatV2”Op的“值”的列表中的张量 不完全匹配的类型[float32,int32]