如果我们在制作神经网络时将自己指定为输入和输出,tensorflow 密集层的输出会是什么?
What would be the output from tensorflow dense layer if we assign itself as input and output while making a neural network?
我一直在为任何 Vanilla Policy Gradient 在 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 函数的 return 是什么?我的意思是结构或形状。是N维张量吗?如果是这样,它是如何作为 tf.random_categorical
的输入给出的?如果不是,而且它只是形状 [hidden_layer2, output]
,那么其他层发生了什么?根据他们的 website description about random_categorical it only takes a 2-D input. The complete code of openAI's VPG algorithm can be found here. The mlp is implemented here。如果有人能告诉我这个 mlp_categorical_policy()
在做什么,我将不胜感激?
注:隐藏大小为[64, 64],动作维度为3
感谢和欢呼
请注意,这是一个离散的动作 space - 每一步都有 action_space.n
种不同的可能动作,智能体选择一个。
为此,MLP return计算不同动作的 logits(它是概率的函数)。这在代码中由 + [act_dim]
指定,它将 action_space 的计数附加为最终的 MLP 层。请注意,MLP 的最后一层是输出层。输入层在tensorflow中没有指定,它是从输入中推断出来的。
tf.random.categorical 获取 logits 并从中抽取政策行动 pi
,returned 作为数字。
mlp_categorical_policy
也 returns logp
,动作的对数概率 a
(用于分配信用),以及 logp_pi
,对数政策行动的概率 pi
.
看来你的问题更多是关于 mlp 的 return。
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(所以shape是[:,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 的批处理中。
我一直在为任何 Vanilla Policy Gradient 在 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 函数的 return 是什么?我的意思是结构或形状。是N维张量吗?如果是这样,它是如何作为 tf.random_categorical
的输入给出的?如果不是,而且它只是形状 [hidden_layer2, output]
,那么其他层发生了什么?根据他们的 website description about random_categorical it only takes a 2-D input. The complete code of openAI's VPG algorithm can be found here. The mlp is implemented here。如果有人能告诉我这个 mlp_categorical_policy()
在做什么,我将不胜感激?
注:隐藏大小为[64, 64],动作维度为3
感谢和欢呼
请注意,这是一个离散的动作 space - 每一步都有 action_space.n
种不同的可能动作,智能体选择一个。
为此,MLP return计算不同动作的 logits(它是概率的函数)。这在代码中由 + [act_dim]
指定,它将 action_space 的计数附加为最终的 MLP 层。请注意,MLP 的最后一层是输出层。输入层在tensorflow中没有指定,它是从输入中推断出来的。
tf.random.categorical 获取 logits 并从中抽取政策行动 pi
,returned 作为数字。
mlp_categorical_policy
也 returns logp
,动作的对数概率 a
(用于分配信用),以及 logp_pi
,对数政策行动的概率 pi
.
看来你的问题更多是关于 mlp 的 return。
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(所以shape是[:,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 的批处理中。