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_inputs
和decoder_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)
至此,程序终于跑通了,期待实验结果~!~
- basic_rnn_seq2seq与embedding_attention_seq2seq输入的差别
- “>”与">>"的差别
- ()与{}的差别
- $(())与$()还有${}的差别
- $@与$*的差别
- &&与||的差别
- [[]]与[]的差别
- java-System.in.read()方法与java.util.Scanner类的读取输入差别
- Vector与deques的差别
- 显示与打印的差别
- 类与结构的差别
- 类与结构的差别
- 类与结构的差别
- IE 与 firefox的差别
- QA与QC的差别
- Heap与stack的差别
- 爱与喜欢的差别
- 类与结构的差别
- Android Overlay机制(转载)
- android开发 之环境搭建
- 【WEB开发】JavaScript中的闭包(closure)
- LeetCode-258. Add Digits
- [Hive]分析函数 RANK ROW_NUMBER CUME_DIST CUME_DIST
- basic_rnn_seq2seq与embedding_attention_seq2seq输入的差别
- 用Visual Studio 2015编译JNI C++/C 代码
- 设置和查询mysql错误日志、访问日志
- Android Studio 那些事|Activity文件前标识图标显示为 j 而是 c
- 作为开发者,你都听产品经理的,做的累不累?
- 【工作笔记】信号量
- 算法第四版练习题答案
- 客户端和服务器端的一些异常
- 牛腩(3)-无法连接到已配置的开发 Web 服务器