我正在尝试使用一段较旧的代码来创建一个非常基本的编码器
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)
运行程序时,与以前相比,我得到的结果非常不同/更差。我确定我做错了/我正以错误的方式去做。
答案 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)