Keras功能API:在分支模型上可以防止分支方面的培训吗?

Keras功能API:在分支模型上可以防止分支方面的培训吗?,keras,Keras,我正在使用涉及多个分支的Keras训练一个有点复杂的模型。由于问题的结构,单独训练这些部分没有意义,但我不想将网络主分支的损失函数应用于与主分支合并的另一个分支(该分支有自己的损失函数和输出)。我想知道是否有任何方法可以在函数API中实现这一点 下面是一个玩具模型定义,它突出了我遇到的基本问题。层本身并不重要,重要的是模型的结构: #减去某些张量的实用程序 def diff(两个_张量): x、 y=两个_张量 返回x-y #两个输入 in_1=输入((128,) in_2=输入((128,)

我正在使用涉及多个分支的Keras训练一个有点复杂的模型。由于问题的结构,单独训练这些部分没有意义,但我不想将网络主分支的损失函数应用于与主分支合并的另一个分支(该分支有自己的损失函数和输出)。我想知道是否有任何方法可以在函数API中实现这一点

下面是一个玩具模型定义,它突出了我遇到的基本问题。层本身并不重要,重要的是模型的结构:


#减去某些张量的实用程序
def diff(两个_张量):
x、 y=两个_张量
返回x-y
#两个输入
in_1=输入((128,)
in_2=输入((128,)
#主分支:对第一个输入执行某些操作
分支_1=密集(128,激活='relu')(in_1)
分支_1=密集(128,activation='relu')(分支_1)
#辅助分类器定义:
分类器=顺序()
add(稠密(128,activation='relu'))
add(稠密(1,activation='linear'))
#这个模型断言了一个置信度,我们将使用一个sigmoid来实际分类
#分类器接受第二个输入和主分支的结果
pred_a=分类器(分支_1)
pred_b=分类器(在_2中)
类输出=激活('sigmoid')
a类=a类(前a类)
b类=b类输出(pred_b)
#我们在一个lambda中计算这两个置信度之间的差异
pred_diff=λ(diff)([pred_a,pred_b])
#主模型将此差异用于另一个分类
分支连接=连接([pred\u diff,分支1],轴=-1)
主输出=密集(20,激活='softmax')(分支连接)
#该模型输出辅助分类器的选择和主预测
模型=模型(输入=[输入1,输入2],输出=[主输出,类a,类b])
损失={'main_output':'sparse_categorical_crossentropy'
,'class_a':'binary_crossentropy'
,'class_b':'binary_crossentropy'
}

我只想在分类器的中间对分类器进行训练,只针对其两个输入的分类精度。但是,由于它连接到主分支,我认为主输出的损失也会通过这些层传播。在许多类似的情况下(如简单的GANs),答案是分别训练分类器,并在训练端到端系统时冻结分类器。然而,这对我的用例不起作用,我想知道我是否可以阻止主输出的损失从反向传播到分类器模型中,同时仍然对其自身的输出进行训练。

你能为这些层设置trainable=False并训练模型的其余部分吗?不,因为那样那些层就根本不需要训练了。我想对他们进行分类损失培训(从输出“class_a”和“class_b”),而不培训他们主分支的损失函数(从输出“main_output”)将在keras帮助中创建自定义损失函数或自定义回调?你不能分两步进行培训吗?首先训练分类器,然后将权重设置为不可训练,然后训练网络的任何部分,正如我前面提到的,这是我通常采用的方法,但对于我试图解决的问题不起作用。没有办法改变哪些连接是可训练的,而不是哪些层?你能为那些层设置trainable=False并训练模型的其余部分吗?不,因为那样那些层就根本不需要训练了。我想对他们进行分类损失培训(从输出“class_a”和“class_b”),而不培训他们主分支的损失函数(从输出“main_output”)将在keras帮助中创建自定义损失函数或自定义回调?你不能分两步进行培训吗?首先训练分类器,然后将权重设置为不可训练,然后训练网络的任何部分,正如我前面提到的,这是我通常采用的方法,但对于我试图解决的问题不起作用。没有办法改变哪些连接是可训练的,而不是哪一层?