python - 将 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)
当我运行程序时,与以前相比,我得到了非常不同/更差的结果。我确定我做错了什么/正在以错误的方式解决这个问题。
解决方案
建议使用功能 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)
推荐阅读
- javascript - 反应:this.state 与 this.setState
- bokeh - 散景取消选中复选框
- reactjs - 如何在 webpack 中禁用“严格”模式?
- laravel - 带有队列的 Laravel 侦听器不执行
- c++ - 我可以用 premake 打印最终组装的 gcc 命令吗?
- python - Pandas read_fwf 难以解释类似日期的字符串
- node.js - npm install 漏洞对于不同的项目是不同的
- angular - Angular Schematics,修改 angular.json 的代码没有放在一起
- reactjs - 我们如何在 React Native 中使用 iOS 位代码支持?
- c++ - QAbstractTableModel headerData 删除标题