Python tensorflow(tf)变量初始化形状错误?
下面的代码旨在通过while循环构建“sy_logprob_n”,并在每个循环中填充一行。但当我运行这个时,它说 ValueError:使用输入尺寸0索引超出范围;输入只有0 带输入的“while/stripped_slice_1”(op:“strippedslice”)的变暗 形状:[]、[1]、[1]、[1]和具有计算输入张量的形状:输入[3]= 有一件事是,当我将形状打印为Python tensorflow(tf)变量初始化形状错误?,python,tensorflow,neural-network,deep-learning,Python,Tensorflow,Neural Network,Deep Learning,下面的代码旨在通过while循环构建“sy_logprob_n”,并在每个循环中填充一行。但当我运行这个时,它说 ValueError:使用输入尺寸0索引超出范围;输入只有0 带输入的“while/stripped_slice_1”(op:“strippedslice”)的变暗 形状:[]、[1]、[1]、[1]和具有计算输入张量的形状:输入[3]= 有一件事是,当我将形状打印为print(tf.shape(sy_logprob_n),tf.shape(sy_ac_na))时,它们的两个形状是
print(tf.shape(sy_logprob_n),tf.shape(sy_ac_na))
时,它们的两个形状是不同的:
张量(“形状2:0”,形状=(0,),数据类型=int32)张量(“形状3:0”,
形状=(2,),数据类型=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,)
即使您指定了
预期的\u形状
,tf.变量
的形状将为初始值
(此处为0)。似乎expected_-shape
参数从v1.0.0开始就存在了。我不知道为什么它仍然用tf.Variable
记录。我刚刚在Github上提交了一个问题。非常感谢!这真令人困惑。顺便问一下,如果tf.Variable不起作用,你知道我如何实现它吗?@Billadsf我不太确定你的目的是什么,但一般都建议这样做。希望这就是你想要的答案。。。