0

我正在实现一个自定义 keras 层。我班的调用方法如下。

  def call(self, inputs, mask=None):
    if type(inputs) is not list or len(inputs) <= 1:
      raise Exception('Merge must be called on a list of tensors '
                      '(at least 2). Got: ' + str(inputs))
    e1 = inputs[0]
    e2 = inputs[1]
    f = K.transpose((K.batch_dot(e1, K.dot(e2, self.W), axes=1))) #Removing K.transpose also works, why?
    return f

我验证并且代码有效,但我试图找到在 keras 中实现自定义层时更好地调试的方法。假设 e1 和 e2 是 (batch_size * d) 而 W 是 (d*d) 我怎样才能找到我的表达式的每个子部分的尺寸?例如。K.dot(e2, self.W),batch_dot 等的结果。

4

1 回答 1

1

如果您使用的是 theano 后端,您可以定义 Theano 函数。(就像弗朗索瓦建议的那样

例如

import theano
from keras import layers

input = layers.Input(params)
layer = YourLayer(params)
output = layer(input)

debug_fn = theano.function([input], output)
print(debug_fn(numpy_array))

如果您想要中间结果,我通常只是暂时返回它们,例如:

  def call(self, inputs, mask=None):
    if type(inputs) is not list or len(inputs) <= 1:
      raise Exception('Merge must be called on a list of tensors '
                      '(at least 2). Got: ' + str(inputs))
    e1 = inputs[0]
    e2 = inputs[1]
    f = K.transpose((K.batch_dot(e1, K.dot(e2, self.W), axes=1))) #Removing     K.transpose also works, why?
    return f, e1


import theano
from keras import layers

input = layers.Input(params)
layer = YourLayer(params)
output, e1 = layer(input)

debug_fn = theano.function([input], e1)
print(debug_fn(numpy_array))

我不知道是否有更好的做法,但它对我来说效果很好。

于 2016-10-04T22:58:08.420 回答