乘以keras中的两层输出

鲍勃

我正在尝试使用这种设计在喀拉拉邦实现神经网络:http : //nlp.cs.rpi.edu/paper/AAAI15.pdf

该算法本质上具有三个输入。将输入2和输入3乘以相同的权重矩阵W1以产生O2和O3。输入1乘以W2以产生O1。然后,我们需要取O1 * O2和O1 * O3的点积。

我正在尝试在keras中实现这一点。

我的第一个想法是使用kerasGraph类,并使W1成为具有两个输入和两个输出的共享节点层。到目前为止很好。

然后出现的问题是如何将这两个输出的点积与O1相乘。

我试图定义一个自定义函数:

   def layer_mult(X, Y):
       return K.dot(X * K.transpose(Y))

然后:

ntm.add_node(Lambda(layer_mult, output_shape = (1,1)), name = "ls_pos", inputs = ["O1", "O2"])
ntm.add_node(Lambda(layer_mult, output_shape = (1,1)), name = "ls_neg", inputs = ["O1", "O3"])

编译时出现的问题是,keras只想给Lambda层一个输入:

   1045         func = types.FunctionType(func, globals())
   1046         if hasattr(self, 'previous'):
-> 1047             return func(self.previous.get_output(train))
   1048         else:
   1049             return func(self.input)

TypeError: layer_mult() takes exactly 2 arguments (1 given)

我认为替代方法可能是使用一个Merge类,该类dot作为允许的合并类型。但是,Merge必须将类的输入层传递给构造函数。因此,似乎没有办法将共享节点的输出Merge添加到中以将添加Merge到中Graph

如果我使用的是Sequential容器,则可以将其喂入Merge但是,那么就没有办法实现这Sequential两层需要共享相同的权重矩阵。

我考虑过尝试将O1,O2和O3连接在一起作为单个矢量作为输出层,然后在目标函数中进行乘法运算。但是,这将需要目标函数来拆分其输入,这在keras中似乎是不可能的(相关的Theano函数未传递给keras API)。

有什么解决办法吗?

编辑:

我以为我取得了一些进展,因为我发现它shared_node正在实现dot(即使它不在文档中)。

因此,我必须:

ntm = Graph()
ntm.add_input(name='g', input_shape=(300,))  #  Vector of 300 units, normally distributed around zero
ntm.add_node([pretrained bit], name = "lt", input = "g") # 300 * 128, output = (,128)
n_docs = 1000
ntm.add_input("d_pos", input_shape = (n_docs,)) # (,n_docs)
ntm.add_input("d_neg", input_shape = (n_docs,)) # (,n_docs)

ntm.add_shared_node(Dense(128, activation = "softmax", 
#                      weights = pretrained_W1, 
                      W_constraint = unitnorm(), 
                      W_regularizer = l2(0.001)
                      ), name = "ld", 
                    inputs = ["d_pos", "d_neg"],  
                    outputs = ["ld_pos", "ld_neg"], 
                    merge_mode=None) # n_docs * 128, output = (,128) * 2
ntm.add_shared_node(ActivityRegularization(0,0),   #ActivityRegularization is being used as a passthrough - the function of the node is to dot* its inputs
                    name = "ls_pos", 
                    inputs = ["lt", "d_pos"], 
                    merge_mode = 'dot')  # output = (,1)
ntm.add_shared_node(ActivityRegularization(0,0), 
                    name = "ls_neg", 
                    inputs = ["lt", "d_neg"], 
                    merge_mode = 'dot')  # output = (,1)
ntm.add_shared_node(ActivityRegularization(0,0), 
                    name = "summed", 
                    inputs = ["ls_pos", "ls_neg"], 
                    merge_mode = 'sum') # output = (,1)
ntm.add_node(ThresholdedReLU(0.5), 
             input = "summed", name = "loss") # output = (,1)
ntm.add_output(name = "loss_out", 
               input= "loss")
def obj(X, Y):
    return K.sum(Y)
ntm.compile(loss = {'loss_out' : obj},  optimizer = "sgd")

现在错误是:

>>> ntm.compile(loss = {'loss_out' : obj},  optimizer = "sgd")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build/bdist.macosx-10.5-x86_64/egg/keras/models.py", line 602, in compile
  File "build/bdist.macosx-10.5-x86_64/egg/keras/layers/advanced_activations.py", line 149, in get_output
  File "build/bdist.macosx-10.5-x86_64/egg/keras/layers/core.py", line 117, in get_input
  File "build/bdist.macosx-10.5-x86_64/egg/keras/layers/core.py", line 1334, in get_output
  File "build/bdist.macosx-10.5-x86_64/egg/keras/layers/core.py", line 1282, in get_output_sum
  File "build/bdist.macosx-10.5-x86_64/egg/keras/layers/core.py", line 1266, in get_output_at
  File "build/bdist.macosx-10.5-x86_64/egg/keras/layers/core.py", line 730, in get_output
  File "build/bdist.macosx-10.5-x86_64/egg/keras/layers/core.py", line 117, in get_input
  File "build/bdist.macosx-10.5-x86_64/egg/keras/layers/core.py", line 1340, in get_output
  File "build/bdist.macosx-10.5-x86_64/egg/keras/layers/core.py", line 1312, in get_output_dot
  File "/Volumes/home500/anaconda/envs/[-]/lib/python2.7/site-packages/theano/tensor/var.py", line 360, in dimshuffle
    pattern)
  File "/Volumes/home500/anaconda/envs/[-]/lib/python2.7/site-packages/theano/tensor/elemwise.py", line 164, in __init__
    (input_broadcastable, new_order))
ValueError: ('You cannot drop a non-broadcastable dimension.', ((False, False, False, False), (0, 'x')))
维卡斯

你可以用这个

main_branch.add(Merge([branch_1,branch_2],mode ='dot'))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

如何在keras中连接两层?

来自分类Dev

用 Keras 合并两层

来自分类Dev

如何在numpy中实现两层Keras conv1d?

来自分类Dev

计算两层的差

来自分类Dev

遍历两层 NSDictionary

来自分类Dev

如何在TensorFlow中同时将一层并行传递到两层中

来自分类Dev

Keras:如何将两层而非 Elementwise 组合成更大的形状

来自分类Dev

无法从Mapbox SDK iOS在RMMapView中显示一层以上的两层

来自分类Dev

如何实现两层DrawerLayout

来自分类Dev

两层Bootstrap 3 Nav

来自分类Dev

$ lookup用于聚合两层关系

来自分类Dev

bash变量周围的两层引号

来自分类Dev

通过两层sftp与Thunar连接

来自分类Dev

两层Bootstrap 3 Nav

来自分类Dev

如何定位模型并访问嵌套在Ruby on Rails中两层深处的记录?

来自分类Dev

如何在R代码中的两层标头上旋转数据帧

来自分类Dev

使用异常或自定义类在Java中的两层之间进行通信的最佳方法

来自分类Dev

javascript中的谷歌地图api:如何在两层循环中动态设置中心

来自分类Dev

如何将两层Canvas互相叠放

来自分类Dev

如何在两层或节点之间划分屏幕?

来自分类Dev

使用嵌套迭代器迭代两层结构

来自分类Dev

打字稿:如何访问“两层以上”属性

来自分类Dev

Dijkstra的两层表达式评估算法

来自分类Dev

Tensorflow 2:如何从保存的模型连接两层?

来自分类Dev

如何建立两层模糊推理系统

来自分类Dev

打字稿:如何访问“两层以上”属性

来自分类Dev

当两层碰撞JQUERY时停止某些动画

来自分类Dev

如何将两层Canvas互相叠放

来自分类Dev

Dijkstra的两层表达式评估算法