控制 Keras 层中的信息流和门控因素

Controlling information flow and gating factor in Keras layers

给定一个 CNN 架构 (architecture image),其中从一层到另一层的信息流由门控因素控制。 信息的一小部分 'g' 被发送到紧邻的下一层,剩余的“1-g”被发送到前向层之一(如跳过连接)

如何在Keras中实现这样的架构? 提前致谢

使用函数 API 模型。

对于门(自动分数 g):

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

inputTensor = Input(someInputShape)

#the actual value
valueTensor = CreateSomeLayer(parameters)(inputTensor)

#the gate - this is the value of 'g', from zero to 1
gateTensor = AnotherLayer(matchingParameters, activation='sigmoid')(inputTensor)

#value * gate = fraction g
fractionG = Lambda(lambda x: x[0]*x[1])([valueTensor,gateTensor])

#value - fraction = 1 - g
complement = Lambda(lambda x: x[0] - x[1])([valueTensor,fractionG])

#each tensor may go into individual layers and follow individual paths:
immediateNextOutput = ImmediateNextLayer(params)(fractionG)
oneOfTheForwardOutputs = OneOfTheForwardLayers(params)(complement)

#keep going, make one or more outputs, and create your model:
model = Model(inputs=inputTensor, outputs=outputTensorOrListOfOutputTensors)    

为同一层提供两个输入,连接、求和、乘法等,以使它们成为一个。

#concat
joinedTensor = Concatenate(axis=optionalAxis)([input1,input2])

#add
joinedTensor = Add()([input1,input2])

#etc.....

nextLayerOut = TheLayer(parameters)(joinedTensor)

如果你想手动控制'g':

在这种情况下,我们所要做的就是将 gateTensor 替换为用户定义的:

import keras.backend as K

gateTensor = Input(tensor=K.variable([g]))

创建模型时将此张量作为输入传递。 (因为它是 tensor 输入,它不会改变您使用 fit 方法的方式)。

model = Model(inputs=[inputTensor,gateTensor], outputs=outputTensorOrListOfOutputTensors)