从tf.distributions.Categorical输出层创建softmax

问题描述 投票:1回答:1

我正在训练一个代理人在离散环境中行动,我正在使用tf.distributions.Categorical输出层,然后我将其采样以创建softmax输出以确定要采取的操作。我像这样创建我的策略网络:

pi_eval, _ = self._build_anet(self.state, 'pi', reuse=True)

def _build_anet(self, state_in, name, reuse=False):
    w_reg = tf.contrib.layers.l2_regularizer(L2_REG)
    with tf.variable_scope(name, reuse=reuse):
        layer_1 = tf.layers.dense(state_in, HIDDEN_LAYER_NEURONS, tf.nn.relu, kernel_regularizer=w_reg, name="pi_l1")
        layer_2 = tf.layers.dense(layer_1, HIDDEN_LAYER_NEURONS, tf.nn.relu, kernel_regularizer=w_reg, name="pi_l2")
        a_logits = tf.layers.dense(layer_2, self.a_dim, kernel_regularizer=w_reg, name="pi_logits")
        dist = tf.distributions.Categorical(logits=a_logits)
    params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope=name)
    return dist, params

然后,我使用tf.distributions.Categorical webpage中的示例对网络进行采样并构建类分布输出以充当softmax输出:

n = 1e4
self.logits_action = tf.cast(tf.histogram_fixed_width(values=pi_eval.sample(int(n)), value_range=[0, 1], nbins=self.a_dim), dtype=tf.float32) / n

像这样运行:

softmax = self.sess.run([self.logits_action], {self.state: state[np.newaxis, :]})

但输出只有两个非零项:

[0.44329998 0.         0.         0.5567    ]
[0.92139995 0.         0.         0.0786    ]
[0.95699996 0.         0.         0.043     ]
[0.7051 0.     0.     0.2949]

我的预感与value_range说的documentation有关:

value_range:Shape 2与值相同的dtype的张量。 values <= value_range [0]将映射到hist [0],值> = value_range1将映射到hist [-1]。

但我不确定我应该使用什么价值范围?我想知道是否有人有任何想法?

python tensorflow machine-learning neural-network softmax
1个回答
0
投票

事实上,正如我怀疑它与value_range有关,我应该将大小设置为动作维度:

value_range=[0, self.a_dim]
© www.soinside.com 2019 - 2024. All rights reserved.