Keras 共享具有不同“可训练”标志的层
Posted
技术标签:
【中文标题】Keras 共享具有不同“可训练”标志的层【英文标题】:Keras shared layers with different "trainable" flags 【发布时间】: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 )
的别名来显式停止梯度反向传播。
【参考方案1】:
如果使用纯 keras,请在 lambda 层内使用 keras.backend.stop_gradient,并通过该层传递 b_out。
如果使用 TF2,您可以只使用 tf.stop_gradient,tf.keras 会为您创建 lambda 层。
【讨论】:
以上是关于Keras 共享具有不同“可训练”标志的层的主要内容,如果未能解决你的问题,请参考以下文章
shmat()为不同的程序返回不同的地址,所有程序都具有相同的共享内存[重复]