将Tensorflow 1层迁移到Tensorflow 2

时间:2019-11-22 21:51:10

标签: python tensorflow

我正在尝试使用一段较旧的代码来创建一个非常基本的编码器

def make_encoder(data, code_size):
  x = tf.layers.flatten(data)
  x = tf.layers.dense(x, 200, tf.nn.relu)
  x = tf.layers.dense(x, 200, tf.nn.relu)
  loc = tf.layers.dense(x, code_size)
  scale = tf.layers.dense(x, code_size, tf.nn.softplus)
  return tfd.MultivariateNormalDiag(loc, scale)

由于tf.layer.dense等的贬值,我试图将此代码迁移到Tensorflow2。我对tf.keras.layers如何实现上述功能不是很熟悉,但是我能够得到这个工作:

def make_encoder(data, code_size):
  model = Sequential()
  model.add(Flatten())
  model.add(Dense(200, activation='relu'))
  model.add(Dense(200, activation='relu'))
  x = model(data)

  loc = model
  scale = model

  loc.add(Dense(code_size))
  scale.add(Dense(code_size, activation='softplus'))

  loc = loc(data)
  scale = scale(data)

  return tfd.MultivariateNormalDiag(loc, scale)

运行程序时,与以前相比,我得到的结果非常不同/更差。我确定我做错了/我正以错误的方式去做。

1 个答案:

答案 0 :(得分:0)

建议使用functional API定义复杂的模型,例如多输出模型,有向无环图或具有共享层的模型。

您的代码必须是这样的:

def Encoder(data, code_size):
    inputs = Input(shape=(data.shape[1:]))
    x = Flatten()(inputs)
    x = Dense(200, activation='relu')(x)
    x = Dense(200, activation='relu')(x)
    loc = Dense(code_size)(x)
    scale = Dense(code_size, activation='softplus')(x)
    return Model(inputs=inputs,ouputs=[loc,scale])

def make_encoder(data, code_size):
    loc,scale = Encoder(data, code_size)
    return tfd.MultivariateNormalDiag(loc, scale)