tensorflow(tf)变量初始化形状bug?

时间:2018-04-30 15:06:46

标签: python tensorflow neural-network deep-learning

以下代码旨在构建" sy_logprob_n"通过while循环并在每个循环中填充一行调暗。但是,当我运行它时,它说

  

ValueError:使用输入dim 0将索引超出范围;输入只有0   为'而/ strided_slice_1' (op:' StridedSlice')带输入   形状:[],[1],[1],[1]和计算输入张量:输入[3] =   &LT 1为卤素;

有一点奇怪的是,当我将形状打印为print(tf.shape(sy_logprob_n),tf.shape(sy_ac_na))时,它们的两种形状是不同的:

  

Tensor(" Shape_2:0",shape =(0,),dtype = int32)Tensor(" Shape_3:0",   shape =(2,),dtype = int32)

但" sy_logprob_n"由" sy_ac_na"的形状初始化。

有人有想法吗?在此先感谢!!!

sy_ac_na = tf.placeholder(shape=[None, ac_dim], name="ac", dtype=tf.float32) 
batch_size=tf.shape(sy_ob_no)[0]

  sy_mean = build_mlp(sy_ob_no, ac_dim, 'mean', n_layers, size) # shape (batch,ac_dim)
  sy_logstd = tf.Variable(initial_value=0,name='std',expected_shape=[ac_dim],dtype=tf.float32) # logstd should just be a trainable variable, not a network output.
  sy_sampled_ac=tf.random_normal(tf.shape(sy_ac_na),mean=sy_mean,stddev=tf.exp(sy_logstd),seed=seed) # shape(batch,ac_dim)
  sy_logprob_n=tf.Variable(initial_value=0,expected_shape=tf.shape(sy_ac_na),name='sy_logprob_n',dtype=tf.float32)
  print(tf.shape(sy_logprob_n),tf.shape(sy_ac_na))

  def cond(sy_logprob_n,i,sy_ac_na):
    return tf.less(i,batch_size)

  def body(sy_logprob_n,i,sy_ac_na):
    distribution=tf.distributions.Normal(sy_mean,tf.exp(sy_logstd))
    log_prob=distribution.log_prob(sy_ac_na[i,:])
    tf.assign(sy_logprob_n[i],log_prob)
    i+=1
    return sy_logprob_n

  sy_logprob_n = tf.squeeze(tf.while_loop(cond,body,[sy_logprob_n,0,sy_ac_na]))  # shape (batch,)  

1 个答案:

答案 0 :(得分:1)

即使您指定了expected_shapetf.Variable的形状仍为initial_value(此处为0)。从v1.0.0开始,expected_shape参数似乎是deprecated。我不确定为什么它仍然记录在tf.Variable中。我刚刚在Github上提出了一个问题。