【问题标题】:Creating softmax from a tf.distributions.Categorical output layer从 tf.distributions.Categorical 输出层创建 softmax
【发布时间】:2019-03-29 13:24:55
【问题描述】:

我正在训练一个代理在离散环境中行动,我正在使用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:形状 2 与值具有相同 dtype 的张量。值 = value_range1 将映射到 hist[-1]。

但我不确定我应该使用什么值范围?不知道有没有人有什么想法?

【问题讨论】:

    标签: python tensorflow machine-learning neural-network softmax


    【解决方案1】:

    确实,因为我怀疑这与value_range 有关,我应该将上限设置为动作维度:

    value_range=[0, self.a_dim]
    

    【讨论】:

      猜你喜欢
      • 2019-04-27
      • 2021-09-06
      • 2017-05-15
      • 1970-01-01
      • 2023-03-15
      • 2020-07-07
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      相关资源
      最近更新 更多