为什么调用方法在构建时在 Keras 层中被调用
Why does the call method gets called at build time in Keras layers
所以我尝试使用提供的示例在 Keras 中实现我自己的层:
class MyLayer(Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyLayer, self).__init__(**kwargs)
def build(self, input_shape):
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
super(MyLayer, self).build(input_shape) # Be sure to call this somewhere!
def call(self, x):
return K.dot(x, self.kernel)
def compute_output_shape(self, input_shape):
return (input_shape[0], self.output_dim)
我注意到当我这样做时,调用中的内容会在构建时被调用:
model.add(MyLayer(4, input_dim=(1))
这在没有调用 fit、train、predict 等的情况下发生...
为什么?
它会在您向模型添加图层时调用,以检查形状是否有效。
如果您想查看它的调用位置,请更改您的代码:
import sys
import traceback
class MyLayer(Layer):
....
def call(self, x):
traceback.print_stack(file=sys.stdout)
return K.dot(x, self.kernel)
所以我尝试使用提供的示例在 Keras 中实现我自己的层:
class MyLayer(Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyLayer, self).__init__(**kwargs)
def build(self, input_shape):
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
super(MyLayer, self).build(input_shape) # Be sure to call this somewhere!
def call(self, x):
return K.dot(x, self.kernel)
def compute_output_shape(self, input_shape):
return (input_shape[0], self.output_dim)
我注意到当我这样做时,调用中的内容会在构建时被调用:
model.add(MyLayer(4, input_dim=(1))
这在没有调用 fit、train、predict 等的情况下发生...
为什么?
它会在您向模型添加图层时调用,以检查形状是否有效。
如果您想查看它的调用位置,请更改您的代码:
import sys
import traceback
class MyLayer(Layer):
....
def call(self, x):
traceback.print_stack(file=sys.stdout)
return K.dot(x, self.kernel)