Приведенный ниже код нацелен на создание "sy_logprob_n" в цикле while и заполнение одной строки диммируя каждый цикл. Но когда я запускаю это, он говорит
ValueError: Индекс вне диапазона, используя вход dim 0; вход имеет только 0
dims для 'while / strided_slice_1' (op: 'StridedSlice') с вводом
формы: [], [1], [1], [1] и с вычисленными входными тензорами: input [3] =
<1>.
И одна странность в том, что когда я распечатываю форму как print(tf.shape(sy_logprob_n),tf.shape(sy_ac_na))
, их две формы различаются:
Тензор ("Shape_2: 0", shape = (0,), dtype = int32) Тензор ("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,)