我试图通过将一些代码从1.13转换为2.0来熟悉新的Tensorflow 2.0。我一般是Tensorflow的初学者,但我认为继续学习2.0而不是1.13可能是更好的选择。
我已经尝试了转换脚本,但感觉它主要只是将tf.compat.v1
添加到相关部分。
该代码是A2C实现的一部分,并且Actor应该可以使用正态分布进行工作。我不太确定如何在Tensorflow 2.0中实现这一部分,尤其是如何像原始代码中那样获取mu和sigma。
这是原始代码:
def build_actor_net(self, scope, trainable):
with tf.variable_scope(scope):
dl1 = tf.contrib.layers.fully_connected(inputs=self.s, num_outputs=200,
activation_fn=tf.nn.relu,
trainable = trainable,
scope='dl1')
mu = 2 * tf.contrib.layers.fully_connected(inputs=dl1, num_outputs=self.num_action,
activation_fn=tf.nn.tanh,
trainable = trainable,
scope='mu')
sigma = tf.contrib.layers.fully_connected(inputs=dl1, num_outputs=self.num_action,
activation_fn=tf.nn.softplus,
trainable=trainable,
scope='sigma')
norm_dist = tf.contrib.distributions.Normal(loc=mu, scale=sigma)
return norm_dist
这是我尝试过的:
class Actor(keras.Model):
def __init__(self, act_dim):
self.act_dim = act_dim
super().__init__('mlp_policy')
self.actor = keras.Sequential()
self.actor.add(keras.layers.Dense(100, activation='relu'))
# Mu
self.actor.add(2 * keras.layers.Dense(units=self.act_dim, activation='tanh'))
# Sigma
self.actor.add(keras.layers.Dense(units=self.act_dim, activation='softplus'))
# PDB
self.actor.pd = tfp.distributions.Normal(loc=self.mu, scale=self.sigma)
很显然,self.actor.add(2 * keras.layers.Dense(512, activation='tanh'))
由于乘法而无法工作。如何正确将代码转换为2.0版?
答案 0 :(得分:0)
tf.keras.Model
类的想法是在__init__
中定义您的图层,并且您应该在call
中实现模型的前向传递。
在您的情况下:
class Actor(keras.Model):
def __init__(self, act_dim):
super().__init__('mlp_policy')
# Dl1
self.dl1 = keras.layers.Dense(100, activation='relu')
# Mu
self.mu = keras.layers.Dense(units=act_dim, activation='tanh')
# Sigma
self.sigma = keras.layers.Dense(units=act_dim, activation='softplus')
def call(self, inputs):
dl1 = self.dl1(inputs)
mu = 2 * self.mu(dl1)
sigma = self.sigma(dl1)
norm_dist = tf.contrib.distributions.Normal(loc=mu, scale=sigma)
return norm_dist