Neural network 在为端到端CNN组合不同的基本事实时处理输入

Neural network 在为端到端CNN组合不同的基本事实时处理输入,neural-network,keras,theano,conv-neural-network,lasagne,Neural Network,Keras,Theano,Conv Neural Network,Lasagne,我希望设计一个单一的端到端CNN来提取三个特征:物体a的分割和分叉,物体B的检测。这三个特征类型将有一个共同的权重主干和三个具有各自权重的分支,然后这些分支将被合并。我希望用一个自定义的随机梯度函数来实现这一点 我需要合并同一主题的不同数据集,其中每个图像包含A和B,但不同的数据集包含不同的基本事实。我希望在每个图像中添加一个额外的向量,指示三个基本事实中的哪一个可用,例如[01]。这使得公共权重w_0将始终更新,但单个分支权重在遇到不合适的图像时,甚至在批处理中没有遇到足够的图像时,也不知道是

我希望设计一个单一的端到端CNN来提取三个特征:物体a的分割和分叉,物体B的检测。这三个特征类型将有一个共同的权重主干和三个具有各自权重的分支,然后这些分支将被合并。我希望用一个自定义的随机梯度函数来实现这一点

我需要合并同一主题的不同数据集,其中每个图像包含A和B,但不同的数据集包含不同的基本事实。我希望在每个图像中添加一个额外的向量,指示三个基本事实中的哪一个可用,例如[01]。这使得公共权重w_0将始终更新,但单个分支权重在遇到不合适的图像时,甚至在批处理中没有遇到足够的图像时,也不知道是否忽略合适的图像

问题是我不知道该怎么处理

ground truth参数是否需要与图像大小相同,并作为具有冗余0的图像的额外通道传递?如果是,我如何确保它不被视为正常通道? 我可以分开交吗?其他层如何处理这个问题,特别是编译和验证?
我正在考虑用千层面中的Theano来代替我最初的Keras,因为后者的抽象层次更高。如果事物B的检测使事物变得过于复杂,也可以忽略它。

因此,基本真理有两种不同的形状

但既然它们是真的,就应该放在Y面,而不是X面

假设A的分割结果为二维边,边矩阵与输入图像的大小相同,且分叉结果为一维2,数组,则可以执行以下操作:

创建具有两个输出的模型 现在,让我们创建主干:

from keras.models import Model
from keras.layers import *

inp = Input((side,side))
x = Convolution2D(blablabla)(inp)
x = AnyOtherLayerYouNeed(blablabla)(x)
....
trunkOut = TheLastTrunkLayer(balblabla)(x)
现在,我们拆分模型:

b1 = FirstLayerInBranch1(blablaba)(trunkOut)
b2 = FirstLayerInBranch2(blablabl)(trunkOut)

....

out1 = LastLayerInBranch1(blablabla)(b1)    
out2 = LastLayerInBranch2(blablabla)(b2)
最后,当我们定义模型时,我们传递两个输出:

model = Model(inp, [out1,out2])
编译时,如果需要,可以定义loss=[lossfunction1,lossfunction2]。或者简单地给出两个输出相同的损失函数

在培训时,还要通过列表中的真值:

model.fit(trainImages, [segTruth,bifTruth],.....)
如您所见,结果不会合并,并且模型有两个输出。每个输出都有单独的损耗函数

如果确实需要合并输出,这将是一项非常复杂的任务,因为它们具有不同的形状。如果需要一个更重要的loss函数,可以在compile调用中传递loss_weights参数

分别培训每一方: 如果只想使用一个分支进行训练或预测,只需创建一个新模型,而不更改任何图层:

modelB1 = Model(inp, out1)    
modelB2 = Model(inp, out2)   
所以,假设你只有一组特定图像的真实性。然后只需使用modelB2进行培训。它根本不考虑其他分支。

在培训之前,您必须编译每个模型。但它们的权重对于所有三种型号(型号B1和型号B2)都是通用的


如果希望模型的某些部分在训练时保持不变,可以在编译之前转到每个model.layer[i]并使其.trainable=False。这不会改变已经编译的模型。

我无法理解您打算实现什么。可能的基本真值是什么?为什么是三个分支?地面真相不是你的火车吗?如果不是,你所说的火车和地面真相有什么区别?任何能准确解释你想要实现的目标的东西都可能会有所帮助。每个图像的基本事实是——用于分割的黑白图像是事物a的像素部分,用于分叉的x和y像素坐标向量,以及用于检测的圆形遮罩或中心像素坐标。我不知道如何通过一组连续的层来实现所有这些,因为任务看起来非常不同,这就是部分分支的目的。不管是否分支,这都需要在单个网络中完成,任务之间至少要有一些共享权重。首先,非常感谢您的帮助。对于使用此结构的任务,我将如何处理丢失的基本事实?例如,如果图像只有bif数据可用,我仍然希望更新公共主干权重以及bif分支权重,但不更新seg分支权重。我会简单地在segTruth和bifTruth的相关领域中使用None吗?这会自动起作用吗,或者我需要修改SGD函数和其他函数来专门忽略非真实性?答案是在培训中,每一方都单独进行部分。只需使用modelB2,它从bif分支的输入到输出。只传递输入图像和分叉真值。除非你将某些层次定义为不可训练,否则它将训练所有的东西。也许你将不得不把训练插在一边
,然后是另一边,然后又是一边。否则,您的模型可能会沉迷于一个分支。你训练一边,另一边会变得更糟,因为主干被专门用于一项任务。一个好的策略可能是:首先一起训练所有东西,只使用你有两个基本真值的图像。然后使主干不可训练,并开始分别训练每一侧,以获得只有两个地面真值之一的图像。这样,主干就不会专门处理单个任务。谢谢你的建议。检查一下,在不单独明确培训分支的情况下,通过一些定制的优化程序或损失函数一步完全培训模型是否可行?
modelB1 = Model(inp, out1)    
modelB2 = Model(inp, out2)