【发布时间】:2019-02-28 16:29:19
【问题描述】:
我正在尝试使用功能 API 来创建一个共享层,其中只有一个路径是可训练的:
a_in = Input(x_shape)
b_in = Input(x_shape)
a_out = my_model(a_in) # I want these weights to be trainable
b_out = my_model(b_in) # I want these weights to be non-trainable (no gradient update)
y_out = my_merge(a_out, b_out)
full_model = Model(inputs=[a_in, b_in], outputs=[y_out])
full_model.compile(...)
但我不知道该怎么做。设置my_model trainable 标志会影响两个层。我可以用不同的可训练标志编译 2 个不同的模型,但是我看不出如何组合 2 个预编译的模型来优化我的单个合并成本函数。
这甚至可能与 Keras 相关吗?如果没有,在 TensorFlow 中是否有可能?
【问题讨论】:
-
Keras 或 Tensorflow 是否可行并不重要,我认为从概念上讲,共享层权重并使其可使用一个输入进行训练,但无法使用另一个输入进行训练。它只是不一致。
-
我这里的例子只是 Stack Overflow 的一个小例子。但在我的真实项目中,它是一个实验性的生成器/鉴别器设置,我不能让生成器路径更新鉴别器,反之亦然。这种技术有绝对强大的用例。
-
你在做 GAN 吗?因为那将是一个完全不同的例子。
-
它是一种 GAN,但不是传统的。我正在尝试使用单个模型来实现统一的成本函数,而不是交叉训练 2 个模型。这是一个我想测试的实验,所以我只对原始问题的解决方案感兴趣,而不是替代 GAN,因为我已经有一堆工作了。
-
你的意思是你只希望
my_model更新w.r.t。a_out虽然my_model也用于生成b_out?如果是这样,您可以创建一个类似b_out2 = Lambda( lambda t : K.stop_gradient(t))( b_out )的别名来显式停止梯度反向传播。
标签: python tensorflow keras