我从tensorflow的文档中复制了这段代码来实现自定义层:
import tensorflow as tf
class MyDenseLayer(tf.keras.layers.Layer):
def __init__(self, num_outputs):
super(MyDenseLayer, self).__init__()
self.num_outputs = num_outputs
def build(self, input_shape):
self.kernel = self.add_weight("kernel",
shape=[int(input_shape[-1]),
self.num_outputs])
def call(self, inputs):
return tf.matmul(inputs, self.kernel)
layer = MyDenseLayer(10)
_ = layer(tf.zeros([10, 5])) # Calling the layer `.builds` it.
print([var.name for var in layer.trainable_variables])
当我尝试使用 Tensorflow 2.17.0 在 Spyder 中运行代码时,出现递归错误。
RecursionError: maximum recursion depth exceeded in comparison
回溯如下:
Traceback (most recent call last):
File "/Users/xoxo/Documents/test.py", line 2, in <module>
class MyDenseLayer(tf.keras.layers.Layer):
好点,TF 文档中确实是错误的。 函数
add_weight
的参数已重新排序,文档尚未更新。你只需要在 name=
之前添加一个 "kernel"
,它应该可以工作(至少在 tf2.16.1 上对我来说是这样)。
所以正确的代码(简单地打印
"kernel"
):
import tensorflow as tf
class MyDenseLayer(tf.keras.layers.Layer):
def __init__(self, num_outputs):
super(MyDenseLayer, self).__init__()
self.num_outputs = num_outputs
def build(self, input_shape):
self.kernel = self.add_weight(name="kernel",
shape=[int(input_shape[-1]),
self.num_outputs])
def call(self, inputs):
return tf.matmul(inputs, self.kernel)
layer = MyDenseLayer(10)
_ = layer(tf.zeros([10, 5])) # Calling the layer `.builds` it.
print([var.name for var in layer.trainable_variables])