Keras混合模型
是否有可能在Keras中实施专家方法的MLP混合? 你能用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())#成本 型号 您完全
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个分支。至少就输入维度而言;)我可能会在以后花更多时间尝试实现您的自定义目标,我会让您知道目标也完成了。我花了相当长的时间编写数学很重要,但很有趣:)好的,干得好。它对我很有用。谢谢你。