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 函数,但有一些限制。
我正在尝试在急切执行模式下编译 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 函数,但有一些限制。