NotImplementedError: Cannot convert a symbolic Tensor (2nd_target:0) to a numpy array

NotImplementedError: Cannot convert a symbolic Tensor (2nd_target:0) to a numpy array

我尝试将 2 个损失函数传递给模型 Keras allows that.

loss: String (name of objective function) or objective function or Loss instance. See losses. If the model has multiple outputs, you can use a different loss on each output by passing a dictionary or a list of losses. The loss value that will be minimized by the model will then be the sum of all individual losses.

两个损失函数:

def l_2nd(beta):
    def loss_2nd(y_true, y_pred):
        ...
        return K.mean(t)

    return loss_2nd

def l_1st(alpha):
    def loss_1st(y_true, y_pred):
        ...
        return alpha * 2 * tf.linalg.trace(tf.matmul(tf.matmul(Y, L, transpose_a=True), Y)) / batch_size

    return loss_1st

然后我建立模型:

l2 = K.eval(l_2nd(self.beta))
l1 = K.eval(l_1st(self.alpha))
self.model.compile(opt, [l2, l1])

当我训练时,它产生错误:

1.15.0-rc3 WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/resource_variable_ops.py:1630:
calling BaseResourceVariable.__init__ (from
tensorflow.python.ops.resource_variable_ops) with constraint is
deprecated and will be removed in a future version. Instructions for
updating: If using Keras pass *_constraint arguments to layers.
--------------------------------------------------------------------------- 
NotImplementedError                       Traceback (most recent call
last) <ipython-input-20-298384dd95ab> in <module>()
     47                          create_using=nx.DiGraph(), nodetype=None, data=[('weight', int)])
     48 
---> 49     model = SDNE(G, hidden_size=[256, 128],)
     50     model.train(batch_size=100, epochs=40, verbose=2)
     51     embeddings = model.get_embeddings()

10 frames <ipython-input-19-df29e9865105> in __init__(self, graph,
hidden_size, alpha, beta, nu1, nu2)
     72         self.A, self.L = self._create_A_L(
     73             self.graph, self.node2idx)  # Adj Matrix,L Matrix
---> 74         self.reset_model()
     75         self.inputs = [self.A, self.L]
     76         self._embeddings = {}

<ipython-input-19-df29e9865105> in reset_model(self, opt)

---> 84         self.model.compile(opt, loss=[l2, l1])
     85         self.get_embeddings()
     86 

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/training/tracking/base.py
in _method_wrapper(self, *args, **kwargs)
    455     self._self_setattr_tracking = False  # pylint: disable=protected-access
    456     try:
--> 457       result = method(self, *args, **kwargs)
    458     finally:
    459       self._self_setattr_tracking = previous_value  # pylint: disable=protected-access

NotImplementedError: Cannot convert a symbolic Tensor (2nd_target:0)
to a numpy array.

请帮忙,谢谢!

我找到了解决这个问题的方法:

这是因为我将符号张量与非符号类型混合在一起,例如 numpy。例如。不建议有这样的东西:

def my_mse_loss_b(b):
     def mseb(y_true, y_pred):
         ...
         a = np.ones_like(y_true) #numpy array here is not recommended
         return K.mean(K.square(y_pred - y_true)) + a
     return mseb

相反,您应该像这样将所有转换为符号张量:

def my_mse_loss_b(b):
     def mseb(y_true, y_pred):
         ...
         a = K.ones_like(y_true) #use Keras instead so they are all symbolic
         return K.mean(K.square(y_pred - y_true)) + a
     return mseb

希望对您有所帮助!

对我来说,问题发生在从 numpy 1.19 升级到 1.20 并使用 ray 的 RLlib 时,后者在内部使用 tensorflow 2.2。 只需使用

降级
pip install numpy==1.19.5

解决了问题;错误不再发生。

更新(@codeananda 的评论):您现在也可以更新到解决问题的较新的 TensorFlow (2.6+) 版本 (pip install -U tensorflow)。

  1. 转到 Anaconda Navigator
  2. 找到你安装的包 (numpy)
  3. 点击包裹左边的绿色勾
  4. “特定版本安装的标记”
  5. Select版本,适用

我遇到了同样的错误。当我尝试将我的输入层传递到数据扩充序列层时。报错和我的代码如下图。
错误:
NotImplementedError: Cannot convert a symbolic Tensor (data_augmentation/random_rotation_5/rotation_matrix/strided_slice:0) to a numpy array. This error may indicate that you're trying to pass a Tensor to a NumPy call, which is not supported.

我产生错误的代码:


#Create data augmentation layer using the Sequential model using horizontal flipping, rotations and zoom etc.
data_augmentation = Sequential([
    preprocessing.RandomFlip("horizontal"),
    preprocessing.RandomRotation(0.2),
    preprocessing.RandomZoom(0.2),
    preprocessing.RandomHeight(0.2),
    preprocessing.RandomWidth(0.2)
   # preprocessing.Rescale()
], name="data_augmentation")

# Setting up the input_shape and base model, and freezing the underlying base model layers.
input_shape = (224,224,3)
base_model = tf.keras.applications.EfficientNetB0(include_top=False)
base_model.trainable=False

#Create the input layers
inputs = tf.keras.Input(shape=input_shape, name="input_layer")

#Add in data augmentation Sequential model as a layer
x = data_augmentation(inputs) #This is the line of code that generated the error.

我对生成的错误的解决方案:
解决方案 1:
我是 运行 在较低版本的 Tensorflow 2.4.0 版本上。所以我卸载它并重新安装它以获得更高版本 2.6.0。较新的张量流版本会自动卸载并重新安装 numpy 版本 (1.19.5)(如果 numpy 已安装在您的本地计算机中)。这将自动解决该错误。在当前conda环境的终端中输入以下命令:

pip uninstall tensorflow
pip install tensorflow

方案二:
我猜这是所有建议解决方案中最简单的。 运行 您的代码在 Google colab 而不是您的本地计算机中。 Colab 将始终预装最新的软件包。

我尝试向我的模型添加一个 SimpleRNN 层,但收到类似错误(NotImplementedError:无法将符号张量 (SimpleRNN-1/strided_slice:0) 转换为 numpy 数组)Python 3.9 .5.

当我用 Python 3.8.10 和我需要的所有其他模块创建另一个环境时,问题就解决了。

正如其他人指出的那样,这是由于特定的 tensorflow 版本和特定的 numpy 版本之间不兼容。

以下是我的具体环境和安装的包列表:

康达版本 4.11.0

设置工作环境的命令:

conda activate base
conda create -y --name myenv python=3.9
conda activate myenv
conda install -y tensorflow=2.4
conda install -y numpy=1.19.2
conda install -y keras

系统信息

System:    Kernel: 5.4.0-100-generic x86_64 bits: 64 compiler: gcc v: 9.3.0 
           Desktop: Cinnamon 5.2.7 wm: muffin dm: LightDM Distro: Linux Mint 20.3 Una 
           base: Ubuntu 20.04 focal 
Machine:   Type: Laptop System: LENOVO product: 20308 v: Lenovo Ideapad Flex 14 serial: <filter> 
           Chassis: type: 10 v: Lenovo Ideapad Flex 14 serial: <filter> 
           Mobo: LENOVO model: Strawberry 4A v: 31900059Std serial: <filter> UEFI: LENOVO 
           v: 8ACN30WW date: 12/06/2013 
CPU:       Topology: Dual Core model: Intel Core i5-4200U bits: 64 type: MT MCP arch: Haswell 
           rev: 1 L2 cache: 3072 KiB 
           flags: avx avx2 lm nx pae sse sse2 sse3 sse4_1 sse4_2 ssse3 vmx bogomips: 18357 
           Speed: 798 MHz min/max: 800/2600 MHz Core speeds (MHz): 1: 798 2: 798 3: 798 4: 799 
Graphics:  Device-1: Intel Haswell-ULT Integrated Graphics vendor: Lenovo driver: i915 v: kernel 
           bus ID: 00:02.0 chip ID: 8086:0a16 
           Display: x11 server: X.Org 1.20.13 driver: modesetting unloaded: fbdev,vesa 
           resolution: 1366x768~60Hz 
           OpenGL: renderer: Mesa DRI Intel HD Graphics 4400 (HSW GT2) v: 4.5 Mesa 21.2.6 
           compat-v: 3.0 direct render: Yes 
 

我 运行 在将暗网权重转换为 TensorFlow 模型时遇到了这个问题。 当我使用 Tensorflow v2.3(之前是 Tensorflow v2.2)创建新环境并预装 NumPy 时,我摆脱了这个问题。

所以也许更新您的 TF 版本可能会解决这个问题。

我遇到了同样的问题并解决了。

为了找到根本原因,我用 python 3.8 创建了一个新的 anaconda 环境,并且 conda 安装了 tensorflow(安装 2.4)

当我 运行 keras LSTM 代码时,它在

上出错了
rnnmodel.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))

通过安装最新的 tensorflow 2.8 修复了它

pip uninstall tensorflow
pip install tensorflow