在设置tensor的shape时,可以通过None告诉tensorflow,在这个维度上可以接受任意长度的数据,意即,可以是1个,2个,…,N个。
但是,应该只在一个维度上使用None,通常用在第一个维度上,一般的用来表示batch的大小,如果是None,即表示接受任意大小的batch_size。比如在RNN生成文本的例子中,我们通过训练得到了一个模型,那么在预测时需要重构模型,将输入的shape修改为(None,65),就可以使用任意长度的输入字符串来开始预测流程了。
初始化实验环境
import tensorflow as tf
def tf_reset():
try:
sess.close()
except:
pass
tf.reset_default_graph()
return tf.Session()
shape为0的情形
shape为()意为标量。
sess = tf_reset()
a = tf.placeholder(tf.float32, shape=(),name="a_placeholder")
b = tf.placeholder(tf.float32, shape=(),name="b_placeholder")
c = a + b
print(sess.run(c, feed_dict={a:1.,b:2.}))
3.0
一维张量的情形
在数学上,一维向量通常是指列向量,但是在tensorflow中,一维向量(张量)是指行向量,这一点要注意一下。
长度为1的一维向量
sess = tf_reset()
a = tf.placeholder(tf.float32, shape=(1),name="a_placeholder")
b = tf.placeholder(tf.float32, shape=(1),name="b_placeholder")
c = a + b
print(sess.run(c, feed_dict={a:[1.],b:[2.]}))
[3.]
长度为2的一维向量
sess = tf_reset()
a = tf.placeholder(tf.float32, shape=(2),name="a_placeholder")
b = tf.placeholder(tf.float32, shape=(2),name="b_placeholder")
c = a + b
print(sess.run(c, feed_dict={a:[1.,2.],b:[3.,4.]}))
[4. 6.]
使用None接收任意长度的一维向量
sess = tf_reset()
a = tf.placeholder(tf.float32, shape=(None),name="a_placeholder")
b = tf.placeholder(tf.float32, shape=(None),name="b_placeholder")
c = a + b
print(sess.run(c, feed_dict={a:[1., 2., 3.],b:[4., 5., 6.]}))
[5. 7. 9.]
多维向量中的None
sess = tf_reset()
a = tf.placeholder(tf.float32, shape=(None,2),name="a_placeholder")
b = tf.placeholder(tf.float32, shape=(None,2),name="b_placeholder")
c = a + b
print(sess.run(c, feed_dict={a:[[1., 2.],[3., 4.]],b:[[5., 6.],[7., 8.]]}))
[[ 6. 8.]
[10. 12.]]