首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras混合模型

Keras混合模型
EN

Stack Overflow用户
提问于 2016-10-16 19:50:05
回答 1查看 2.5K关注 0票数 16

是否有可能在Keras中实现专家方法学的混合MLP?请您用Keras中的一个简单代码来指导我解决一个与2位专家有关的二进制问题。

它需要像这样定义一个成本函数:

代码语言:javascript
复制
g = gate.layers[-1].output
o1 = mlp1.layers[-1].output
o2 = mlp2.layers[-1].output

def ME_objective(y_true, y_pred):
    A = g[0] * T.exp(-0.5*T.sqr(y_true – o1))
    B = g[1] * T.exp(-0.5*T.sqr(y_true – o2))
    return -T.log((A+B).sum())  # cost
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-18 12:57:23

模型

您可以使用合并层在Keras中对这样的结构进行建模,这使您能够组合不同的输入。下面是一个SSCCE,希望您能够适应您的结构

代码语言:javascript
复制
import numpy as np
from keras.engine import Merge
from keras.models import Sequential
from keras.layers import Dense
import keras.backend as K

xdim = 4
ydim = 1
gate = Sequential([Dense(2, input_dim=xdim)])
mlp1 = Sequential([Dense(1, input_dim=xdim)])
mlp2 = Sequential([Dense(1, input_dim=xdim)])


def merge_mode(branches):
    g, o1, o2 = branches
    # I'd have liked to write
    # return o1 * K.transpose(g[:, 0]) + o2 * K.transpose(g[:, 1])
    # but it doesn't work, and I don't know enough Keras to solve it
    return K.transpose(K.transpose(o1) * g[:, 0] + K.transpose(o2) * g[:, 1])


model = Sequential()
model.add(Merge([gate, mlp1, mlp2], output_shape=(ydim,), mode=merge_mode))
model.compile(optimizer='Adam', loss='mean_squared_error')

train_size = 19
nb_inputs = 3  # one input tensor for each branch (g, o1, o2)
x_train = [np.random.random((train_size, xdim)) for _ in range(nb_inputs)]
y_train = np.random.random((train_size, ydim))
model.fit(x_train, y_train)

定制目标

这里是您所描述的目标的实现。不过,有几个数学问题需要记住,(见下文)。

代码语言:javascript
复制
def me_loss(y_true, y_pred):
    g = gate.layers[-1].output
    o1 = mlp1.layers[-1].output
    o2 = mlp2.layers[-1].output
    A = g[:, 0] * K.transpose(K.exp(-0.5 * K.square(y_true - o1)))
    B = g[:, 1] * K.transpose(K.exp(-0.5 * K.square(y_true - o2)))
    return -K.log(K.sum(A+B))

# [...] edit the compile line from above example
model.compile(optimizer='Adam', loss=me_loss)

一些数学

简略版:在你的模型中,我认为至少应该有一个约束(也许是两个):

对于任何xsum(g(x)) = 1 对于任何xg0(x) > 0 and g1(x) > 0 #可能不是绝对必要的

域研究

  1. 如果o1(x)o2(x)是无限,那么就远离y
代码语言:javascript
复制
- the exp term tends toward +0
- `A -> B -> +-0`  depending on `g0(x)` and `g1(x)` signs
- `cost -> +infinite` or `nan`

  1. 如果o1(x)o2(x)是无限,则y之间的关系
代码语言:javascript
复制
- the exp term tends toward 1
- `A -> g0(x)` and `B -> g1(x)`
- `cost -> -log(sum(g(x)))`

问题是log只定义在]0, +inf[上。这意味着,要始终定义目标,需要有一个约束来确保sum(A(x) + B(x)) > 0 for any x。该约束的一个更严格的版本将是(g0(x) > 0g1(x) > 0)。

收敛

这里一个更重要的问题是,这一目标似乎并不是为了收敛到0。当mlp1mlp2开始正确地预测y时(案例2),目前没有什么可以阻止优化器使sum(g(x))趋向于+infinite,使loss趋向于-inifinite

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

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40074730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档