我正在实施自定义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等的结果。
答案 0 :(得分:1)
如果您使用的是theano后端,则可以定义Theano功能。 (like François suggested)
E.g。
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))
我不知道是否有更好的做法,但它对我来说效果很好。