从Tensorflow 1.13转换为Tensorflow 2.0

时间:2019-06-17 09:16:06

标签: python python-3.x tensorflow

我试图通过将一些代码从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版?

1 个答案:

答案 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