AttributeError: 'Tensor' object has no attribute 'numpy' while extending keras sequential model

AttributeError: 'Tensor' object has no attribute 'numpy' while extending keras sequential model

我正在尝试在急切执行模式下编译 Keras Sequential 模型(在 TF2 中)。 以下是我的自定义图层:

class CustomLayer(Layer):
  def __init__(self, output_shape, **kwargs):
    self.output_shape = output_shape
    super(CustomLayer, self).__init__(**kwargs)

  def build(self, input_shape):
    assert len(input_shape) == 2
    input_dim = input_shape[1]

  def call(self, inputs, mask=None, **kwargs):
    y_pred = inputs.numpy() #<---- raise error
    return y_pred

我使用这一层来扩展另一个顺序模型如下:

encoder = Sequential(encoders)  # encoders is a bunch of Dense layers
encoder.compile(
    loss='mse',
    optimizer=SGD(lr=self.learning_rate, decay=0, momentum=0.9),
    run_eagerly=True
)
self.MyModel = Sequential([encoder, CustomLayer(output_shape=output_shape)])
self.MyModel.compile(
    loss='MSE',
    optimizer=sgd,
    run_eagerly=True
)

原始模型是一个带有去噪层的自动编码器,我在瓶颈之后添加了一个新层以进行一些自定义预测。 我需要访问新层中的张量值。 这样做会引发以下错误:

    Traceback (most recent call last):
  File "main.py", line 185, in initialize
    self.DEC = Sequential([encoder, CustomingLayer(input_shape=input_shape,
  File ".virtualenvs/vision/lib/python3.8/site-packages/tensorflow/python/training/tracking/base.py", line 530, in _method_wrapper
    result = method(self, *args, **kwargs)
  File ".virtualenvs/vision/lib/python3.8/site-packages/keras/utils/traceback_utils.py", line 67, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File ".virtualenvs/vision/lib/python3.8/site-packages/tensorflow/python/autograph/impl/api.py", line 699, in wrapper
    raise e.ag_error_metadata.to_exception(e)
AttributeError: Exception encountered when calling layer "custom_layer" (type CustomLayer).

in user code:

    File "custom_layer.py", line 25, in call  *
        y_pred = inputs.numpy()

    AttributeError: 'Tensor' object has no attribute 'numpy'


Call arguments received:
  • inputs=tf.Tensor(shape=(None, 10), dtype=float32)
  • mask=None
  • kwargs={'training': 'None'}

直接使用这个 numpy 函数是不可能的——因为它既没有在 Tensorflow 中也没有在 Theano 中实现。此外,张量和数组之间没有直接对应关系。张量应理解为代数变量,而 numpy 数组应理解为数字。张量是一个抽象的东西,通常不可能对其应用 numpy 函数。

但您仍然可以使用 keras.backend 尝试 re-implement 您自己的函数。然后你将使用有效的张量操作,不会出现问题。

另一种解决问题的方法是使用 tf.numpy_function,参见 the documentation,这允许您使用 numpy 函数,但有一些限制。