basic_rnn_seq2seq与embedding_attention_seq2seq输入的差别

来源:互联网 发布:微信的数据分析 编辑:程序博客网 时间:2024/05/22 15:30

在用embedding_attention_seq2seq 跑完数据之后,想用basic_rnn_seq2seq再跑一遍进行对比,发现报错了,错误是

ValueError: Linear is expecting 2D arguments: [[None], [None, 128]]

查了一下basic_rnn_seq2seq的文档,

def basic_rnn_seq2seq(    encoder_inputs, decoder_inputs, cell, dtype=dtypes.float32, scope=None):    '''    Args:    encoder_inputs: A list of 2D Tensors [batch_size x input_size].    decoder_inputs: A list of 2D Tensors [batch_size x input_size].    '''

以及embedding_attention_seq2seq的文档

def embedding_rnn_seq2seq(encoder_inputs,decoder_inputs,...):    '''     Args:    encoder_inputs: A list of 1D int32 Tensors of shape [batch_size].    decoder_inputs: A list of 1D int32 Tensors of shape [batch_size].    '''

发现embedding_rnn_seq2seq输入的参数是一维的,但是basic_rnn_seq2seq的输入参数是二维的,在初始化模型的时候需要改变一下。

embedding_rnn_seq2seq的输入如下:

self.encoder_inputs = []self.decoder_inputs = []self.target_weights = []for i in xrange(buckets[-1][0]):      self.encoder_inputs.append(tf.placeholder(tf.float32, shape=[None],name="encoder{0}".format(i))for i in xrange(buckets[-1][1] + 1):      self.decoder_inputs.append(tf.placeholder(tf.float32, shape=[None], name="decoder{0}".format(i)))      self.target_weights.append(tf.placeholder(tf.float32, shape=[None], name="weight{0}".format(i)))

[None]代表[batch_size] ,大多数tensorflow中的模型的输入都是以批的方式。例如mnit的输入是[batch,image_pixels].

basic_rnn_seq2seq 的输入如下:

self.encoder_inputs = []self.decoder_inputs = []self.target_weights = []for i in xrange(buckets[-1][0]):      self.encoder_inputs.append(tf.placeholder(tf.float32, shape=[None, 128],name="encoder{0}".format(i))for i in xrange(buckets[-1][1] + 1):      self.decoder_inputs.append(tf.placeholder(tf.float32, shape=[None, 128], name="decoder{0}".format(i)))      self.target_weights.append(tf.placeholder(tf.float32, shape=[None, 128], name="weight{0}".format(i)))

[None, 128] 代表[batch_size x input_size],128是网络中神经单元的个数。

在修改完输入的shape之后还需要注意一点的是,如果输入不是tf.float32 而是tf.int32,同样会报错说:“期望一个int,却给了一个float”,查了一下说是应该把encoder_inputsdecoder_inputs的类型改为tf.float32,但是还不知道具体原因。

好了,万事俱备,开始试验,发现又报错了,错误是

ValueError: Cannot feed value of shape (128,) for Tensor u'encoder45:0', which has shape '(?, 128)'

查看文档,tf.placeholder是占位符,在运行时,用实际的输入进行填充,实际的输入应该与tf.placeholder的数据类型,以及格式都保持一致。例如:

input1 = tf.placeholder(tf.float32)input2 = tf.placeholder(tf.float32)output = tf.mul(input1, input2)with tf.Session() as sess:  print sess.run([output], feed_dict={input1:[7.], input2:[2.]})# 输出:# [array([ 14.], dtype=float32)]

我的程序:

input_feed = {}for l in xrange(encoder_size):    input_feed[self.encoder_inputs[l].name] = encoder_inputs[l]

其中encoder_inputs[l] 是一个有128个元素的narray, 而tf.placeholder是[None, 128],应该将其转换为二维的数组,自然地,我用tf.reshape()进行转换,但是报错了,

TypeError: The value of a feed cannot be a tf.Tensor object. Acceptable feed values include Python scalars, strings, lists, or numpy ndarrays.

查了一下发现不能把 tf.tensor 放进 feed_dict.,将encoder_inputs[l]tf.reshape()转换后,就把narray变成了tf.tensor,正确的方式应该是用encoder_inputs[l].reshape(1, 128)进行转换,转换之后还是narray

input_feed = {}for l in xrange(encoder_size):      input_feed[self.encoder_inputs[l].name] = encoder_inputs[l].reshape(1, 128)

至此,程序终于跑通了,期待实验结果~!~

0 0
原创粉丝点击