在 Tensorflow 中实现自定义层的问题

问题描述 投票:0回答:1

我从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):
tensorflow neural-network tensorflow2.0
1个回答
0
投票

好点,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])
© www.soinside.com 2019 - 2024. All rights reserved.