如果我们在制作神经网络时将自己分配为输入和输出,张量流密集层的输出会是什么?



我一直在为任何香草策略梯度在openAI代码中实现神经网络(事实上,这部分几乎无处不在)。代码看起来像这样:

def mlp_categorical_policy(x, a, hidden_sizes, activation, output_activation, action_space):
act_dim = action_space.n
logits = mlp(x, list(hidden_sizes) + [act_dim], activation, None)
logp_all = tf.nn.log_softmax(logits)
pi = tf.squeeze(tf.random.categorical(logits, 1), axis=1)
logp = tf.reduce_sum(tf.one_hot(a, depth=act_dim) * logp_all, axis=1)
logp_pi = tf.reduce_sum(tf.one_hot(pi, depth=act_dim) * logp_all, axis=1)
return pi, logp, logp_pi

而这个多层感知器网络的定义如下:

def mlp(x, hidden_sizes=(32,), activation=tf.tanh, output_activation=None):
for h in hidden_sizes[:-1]:
x = tf.layers.dense(inputs=x, units=h, activation=activation)
return tf.layers.dense(inputs=x, units=hidden_sizes[-1], activation=output_activation)

我的问题是这个 mlp 函数的回报是什么?我的意思是结构或形状。它是N维张量吗?如果是这样,如何将其作为tf.random_categorical的输入?如果没有,并且它只是具有形状[hidden_layer2, output],那么其他层发生了什么?根据他们关于random_categorical的网站描述,它只需要 2-D 输入。openAI 的 VPG 算法的完整代码可以在这里找到。MLP 在此处实现。如果有人告诉我这个mlp_categorical_policy()在做什么,我将不胜感激?

注意:隐藏大小为 [64, 64],动作维度为 3

感谢和欢呼

请注意,这是一个离散的操作空间 - 每一步都有action_space.n不同的可能操作,代理选择一个。

为此,MLP 返回不同操作的对数(这是概率的函数)。这是在代码中指定的,+ [act_dim]将action_space的计数追加为最终的 MLP 层。请注意,MLP 的最后一层是输出层。输入层不是在张量流中指定的,它是从输入推断出来的。

tf.random.categorical 获取 logits 并从中采样策略操作pi,该操作以数字形式返回。

mlp_categorical_policy还返回logp,即操作a的对数概率(用于分配信用),logp_pi返回策略操作pi的对数概率。


看来你的问题更多的是关于 mlp 的回报。

mlp 在循环中创建一系列完全连接的层。在循环的每次迭代中,mlp使用前一层 x 作为输入创建一个新层,并分配其输出以覆盖 x,并使用此行x = tf.layers.dense(inputs=x, units=h, activation=activation)

所以输出与输入不一样,每次迭代时 x 都会被新层的值覆盖。这与x = x + 1相同的编码技巧,将x递增1。这有效地将层链接在一起。

tf.layers.dense 的输出是一个大小[:,h]的张量,其中:是批处理维度(通常可以忽略)。最后一层的创建发生在循环之外,可以看出该层中的节点数act_dim(因此形状[:,3])。您可以通过执行以下操作来检查形状:

import tensorflow.compat.v1 as tf
import numpy as np
def mlp(x, hidden_sizes=(32,), activation=tf.tanh, output_activation=None):
for h in hidden_sizes[:-1]:
x = tf.layers.dense(x, units=h, activation=activation)
return tf.layers.dense(x, units=hidden_sizes[-1], activation=output_activation)
obs = np.array([[1.0,2.0]])
logits = mlp(obs, [64, 64, 3], tf.nn.relu, None)
print(logits.shape)

结果:TensorShape([1, 3])

请注意,本例中的观察结果是[1.,2.],它嵌套在大小为 1 的批次中。

最新更新