Python 3.x Tensorflow seq2seq解码器问题?

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

我尝试用tensorflow tf.contrib.seq2seq包编写一个seq2seq解码器。 我想知道我的代码是否正确,是否有更好的方法重写它。文档不容易阅读

或者我的问题可能是:如何轻松调试此类代码?如何检查tensorflow中的一些中间结果

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]