首页 > 解决方案 > 将 TensorFlow 1 层迁移到 TensorFlow 2

问题描述

我正在试验一段较旧的代码,它创建了一个非常基本的编码器

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 等的贬值,我正在尝试将此代码迁移到 Tensorflow 2。我不太熟悉 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)

当我运行程序时,与以前相比,我得到了非常不同/更差的结果。我确定我做错了什么/正在以错误的方式解决这个问题。

标签: pythontensorflow

解决方案


建议使用功能 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)

推荐阅读