以下代码旨在构建" 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,)
答案 0 :(得分:1)
即使您指定了expected_shape
,tf.Variable
的形状仍为initial_value
(此处为0)。从v1.0.0开始,expected_shape
参数似乎是deprecated。我不确定为什么它仍然记录在tf.Variable
中。我刚刚在Github上提出了一个问题。