Keras混合模型

Keras混合模型,keras,Keras,是否有可能在Keras中实施专家方法的MLP混合? 你能用Keras中的一个简单代码来指导我解决一个有两位专家的二进制问题吗 它需要定义如下的成本函数: g=gate.layers[-1]。输出 o1=mlp1.层[-1].输出 o2=mlp2。层[-1]。输出 定义我的目标(是真的,是预测): A=g[0]*T.exp(-0.5*T.sqr(y_真–o1)) B=g[1]*T.exp(-0.5*T.sqr(y_真–o2)) return-T.log((A+B).sum())#成本 型号 您完全

是否有可能在Keras中实施专家方法的MLP混合? 你能用Keras中的一个简单代码来指导我解决一个有两位专家的二进制问题吗

它需要定义如下的成本函数:

g=gate.layers[-1]。输出
o1=mlp1.层[-1].输出
o2=mlp2。层[-1]。输出
定义我的目标(是真的,是预测):
A=g[0]*T.exp(-0.5*T.sqr(y_真–o1))
B=g[1]*T.exp(-0.5*T.sqr(y_真–o2))
return-T.log((A+B).sum())#成本
型号 您完全可以在Keras中建模这样的结构,使用,这使您能够组合不同的输入。 这是一个你将有希望能够适应你的结构

将numpy导入为np
从keras.engine导入合并
从keras.models导入顺序
从keras.layers导入稠密
将keras.backend作为K导入
xdim=4
ydim=1
门=顺序([密集(2,输入尺寸=xdim)])
mlp1=顺序([密集(1,输入尺寸=xdim)])
mlp2=顺序([密集(1,输入尺寸=xdim)])
def合并_模式(分支):
g、 o1,o2=分支
#我本来想写的
#返回o1*K.转置(g[:,0])+o2*K.转置(g[:,1])
#但它不起作用,我也不知道足够的Keras来解决它
返回K转置(K转置(o1)*g[:,0]+K转置(o2)*g[:,1])
模型=顺序()
添加(合并([gate,mlp1,mlp2],output_shape=(ydim,),mode=Merge_mode))
compile(优化器='Adam',loss='mean_squared_error')
列车尺寸=19
nb_输入=3#每个分支(g,o1,o2)一个输入张量
x_列=[np.random.random((列大小,xdim))用于范围内(nb_输入)]
y_列=np.random.random((列大小,ydim))
模型拟合(x\U系列、y\U系列)
自定义目标 下面是您描述的目标的实现。但是要记住一些数学问题(见下文)

def me_loss(y_true,y_pred):
g=gate.layers[-1]。输出
o1=mlp1.层[-1].输出
o2=mlp2。层[-1]。输出
A=g[:,0]*K转置(K.exp(-0.5*K.square(y_真-o1)))
B=g[:,1]*K转置(K.exp(-0.5*K.square(y_-true-o2)))
返回-K.log(K.sum(A+B))
#[…]编辑上面示例中的编译行
compile(优化器='Adam',loss=me\u loss)
数学 简短版本:在您的模型中,我认为应该至少有一个约束(可能有两个):

对于任何
x
sum(g(x))=1

对于任何
x
g0(x)>0和g1(x)>0
#可能不是严格必要的

领域研究

  • 如果
    o1(x)
    o2(x)
    y
    的距离无限

    • exp项趋向于+0
    • A->B->+-0
      取决于
      g0(x)
      g1(x)
      符号
    • cost->+infinite
      nan
  • 如果
    o1(x)
    o2(x)
    无限接近
    y

    • exp项趋向于1
    • A->g0(x)
      B->g1(x)
    • 成本->-log(总和(g(x)))
  • 问题是,
    log
    仅在
    ]0、+inf[
    上定义。这意味着为了始终定义目标,需要在某处设置一个约束,以确保
    任何
    x
    和(a(x)+B(x))>0
    。该约束的更严格版本是(
    g0(x)>0
    g1(x)>0

    融合

    这里一个更重要的问题是,这个目标似乎没有设计为收敛于0。当
    mlp1
    mlp2
    开始正确预测
    y
    (情况2.)时,目前没有任何东西阻止优化器进行
    sum(g(x))
    趋向于
    +无限
    ,使
    损失
    趋向于
    -inifinite


    理想情况下,我们希望
    loss->0
    ,即
    sum(g(x))->1

    哼,您是否正在尝试训练一个分类器
    g
    ,其任务是组合两个“子”分类器
    o1
    o2
    ?嗨,我有两位MLP专家,他们有一个神经元输出(o1专家1输出和氧气 专家2输出)和1个MLP门控网络,具有两个神经元输出(g[0],g[1])。在转发过程中,o1*g[0]+o2*g[1]是模型的最终输出。这个模型是端到端训练的,损失函数类似于上面。我能用theano和keras实现这个方法吗?MLP专家和MLP门都是深度模型。嗨,my_mode fun生成了如下错误,正如你之前提到的,它需要一些调试:异常:合并层Merge_1有一个可调用的<代码>模式
    参数,我们无法推断其输出形状,因为未提供输出形状参数。请确保传递形状元组(或可调用的元组)
    output\u shape
    合并。用一个工作示例编辑了我的问题。您可能需要对其进行调整,使其适用于您自己的3个分支。至少就输入维度而言;)我可能会在以后花更多时间尝试实现您的自定义目标,我会让您知道目标也完成了。我花了相当长的时间编写数学很重要,但很有趣:)好的,干得好。它对我很有用。谢谢你。