控制 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)
给定一个 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)