张量流占位符形状[无] [无,1]差异

时间:2019-01-01 06:57:00

标签: python tensorflow

我是Tensorflow的新手。我尝试了一个DQN算法,其中涉及到一个部分

a = tf.placeholder(tf.int32, shape = [None],name='A')
q = tf.reduce_sum(critic_q * tf.one_hot(a,n_outputs),axis=1,keepdims=True,name='Q')#Q value for chosen action

y = tf.placeholder(tf.float32, shape = [None],name='Y')

learning_rate = 1e-4
cost = tf.reduce_mean(tf.square(y-q))#mean squared error
global_step = tf.Variable(0,trainable=False,name='global_step')
optimizer = tf.train.AdamOptimizer(learning_rate)
training_op = optimizer.minimize(cost,global_step=global_step)

并使用y_batch=np.zeros(nbatch)初始化输入y。该网络几乎没有经过培训。

然后,我切换为将y定义为

y = tf.placeholder(tf.float32, shape = [None,1],name='Y')

并使用y_batch=np.zeros(nbatch).reshape(-1,1)初始化输入,效果很好。

第一个实施中发生了什么?

1 个答案:

答案 0 :(得分:1)

每个张量都有一个等级(维数)和一组维。

形状为[1]的占位符是排名为1且位置0为1的维。

形状为[None, 1]的占位符是等级2的占位符,因此它具有2个维度。第一维(索引0)的大小未知(将在运行时解析),而第二维(索引1)的已知大小为1。

为了兼容,张量必须具有相同等级的尺寸。

您可以在这里阅读有关张量形状的更完整的评估:https://pgaleone.eu/tensorflow/2018/07/28/understanding-tensorflow-tensors-shape-static-dynamic/#tensors-the-basic