我尝试用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 Traceback(最近调用最后一次)〜/ anaconda3 / envs / py36 / lib / python3.6 / site- apply_op(self,op_type_name,name,** keywords)中的packages / tensorflow / python / framework / op_def_library.py 434 preferred_dtype = default_dtype, - > 435 as_ref = input_arg.is_ref)436 if input_arg.number_attr和len(〜/ anaconda3) internal_convert_n_to_tensor中的/envs/py36/lib/python3.6/site-packages/tensorflow/python/framework/ops.py(values,dtype,name,as_ref,preferred_dtype)736 as_ref = as_ref, - > 737 preferred_dtype = preferred_dtype) )738 return ret_ / anaconda3 / envs / py36 / lib / python3.6 / site-packages / tensorflow / python / framework / ops.py in internal_convert_to_tensor(value,dtype,name,as_ref,preferred_dtype)675 if ret is None: - > 676 ret = conversion_func(value,dtype = dtype,name = name,as_ref = as_ref)677~ / anaconda3 / envs / py36 / lib / python3.6 / site-packages / tensorflow / python / framework / ops.py在_TensorTensorConversionFunction(t,dty pe,name,as_ref)548“张量转换请求dtype%s用于Tensor,带有dtype%s:%r” - > 549%(dtype.name,t.dtype.name,str(t)))550返回t ValueError :张量转换请求dtype float32 for Tensor with dtype int32:'Tensor(“seq2seq-train / decoder / ExpandDims_2:0”,shape =(?,1,?),dtype = int32)'在处理上述异常时,另一个异常发生:TypeError Traceback(最近一次调用last)in()4 emb_en = np.random.uniform(low = -0.1,high = 0.1,size =(en_total_words,hidden_size))5 emb_cn = np.random.uniform(low = -0.1,high = 0.1,size =(cn_total_words,hidden_size))----> 6 model = Seq2Seq(hidden_size,num_layers,emb_en,emb_cn)7 sess = tf.Session()8 init = tf.global_variables_initializer() in init(self,hidden_size,num_layers,embed_words_en,embed_words_cn)81 encoder_outputs,encoder_state = self.encoder(self.encoder_inputs,self.encoder_length)82 decoder_length = tf.cast(tf.reduce_sum(self.decoder_mask,1),tf . int32)---> 83 decoder_outputs,decoder_s tate = self.decoder(self.decoder_inputs,encoder_state,encoder_outputs,encoder_state,decoder_length)84 85#decoder_outputs.append(decoder_out)in call(self,inputs,state,encoder_outputs,encoder_state,decoder_length,mode)50 51输出,_, _ = tf.contrib.seq2seq.dynamic_decode(decoder = decoder)---> 52 outputs = tf.concat([tf.expand_dims(out,1)for out in outputs],1)53 54 outputs = tf.tensordot(输出,self.linear,axes = [[2],[0]])〜/ anaconda3 / envs / py36 / lib / python3.6 / site-packages / tensorflow / python / ops / array_ops.py in concat(values, axis,name)1064 return gen_array_ops._concat_v2(values = values,1065 axis = axis, - > 1066 name = name)1067 1068~ / anaconda3 / envs / py36 / lib / python3.6 / site-packages / tensorflow / python / _concat_v2中的ops / gen_array_ops.py(值,轴,名称)491“”“492 result = _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,** keywords)461(prefix,dtype.name))462 else: - > 463引发TypeError(“%s并不是全部匹配 . ”%prefix)464 else:465引发TypeError(“%s无效 . ”%前缀)TypeError:传递给'ConcatV2'Op的'values'的列表中的张量具有并非全部匹配的类型[float32,int32] .