当前位置: 首页 > 知识库问答 >
问题:

NotImplementedError:无法将符号张量(第二个目标:0)转换为numpy数组

卫建义
2023-03-14

我尝试将2个损失函数传递给模型,因为Keras允许这样做。

损失:字符串(目标函数的名称)或目标函数或损失实例。见损失。如果模型有多个输出,您可以通过传递字典或损失列表对每个输出使用不同的损失。该模型将使损失值最小化,然后将是所有单个损失的总和。

两个损失函数:

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.

请帮忙,谢谢!

共有3个答案

劳烨
2023-03-14

我也面临同样的错误。当我尝试将输入层传递到数据增强顺序层时。错误和我的代码如下所示
错误:
未实现错误:无法将符号张量(数据扩充/随机旋转5/旋转矩阵/跨步切片:0)转换为numpy数组。此错误可能表示您正试图将张量传递给NumPy调用,这是不受支持的

生成错误的我的代码:


#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.较新的tensor flow版本会自动卸载并重新安装numpy版本(1.19.5)(如果您的本地计算机中已经安装了numpy)。这将自动解决该错误。在当前conda环境的终端中输入以下命令:

pip uninstall tensorflow
pip install tensorflow

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

唐晗昱
2023-03-14

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

这是因为我混合了符号张量和非符号类型,比如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

希望这有帮助!

慕容渊
2023-03-14

对我来说,问题发生在从numpy 1.19升级到1.20并使用ray的RLlib时,它在内部使用tensorflow 2.2。简单地用

pip install numpy==1.19.5

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

 类似资料:
  • 不能将符号张量(up_sampling2d_4_target: 0)转换为Numpy数组。 得到以下错误 --------------------------------------------------------------------------- 没有实现错误跟踪(最近的调用最后)在14 15而True:--- 在适合()1 def适合(): ---- ~/venv/lib/python

  • 问题内容: 将Tensorflow与Python绑定一起使用时,如何将张量转换为numpy数组? 问题答案: 急切执行默认情况下 处于启用状态,因此只需调用Tensor对象即可。 有关更多信息,请参见NumPy兼容性。值得注意的是(来自文档), Numpy数组可以与Tensor对象共享内存。 对一个的任何更改都可能反映在另一个上。 大胆强调我的。副本可以返回也可以不返回,这是基于数据是在CPU还是

  • 我有一个cuda张量列表: 我正在尝试应用k-折叠交叉验证。因此,我想使用k倍索引列表为该列表编制索引: 但它给了我错误: 根据这个答案,问题是我不能使用索引列表来索引列表。在努比是允许的。 所以我试着把它转换成Numpy: 但它给了我一个错误: 我真的必须在索引之前将这些单独的cuda张量移动到cpu吗?如何在cuda上轻松索引cuda张量列表(利用GPU进行训练模型)?或者这是不可能的,我应该

  • 问题内容: 假设我有字符串: 我得到的位置无关紧要,但是为了具体起见,假设我从二进制文件中读取了它。 我知道我的字符串是4(4字节)浮点数的二进制表示形式。我想将那些浮点数作为一个numpy数组。我 可以 做: 但是创建中间元组似乎很愚蠢。有没有一种方法可以在不创建中间元组的情况下执行此操作? 编辑 我还希望能够以可以指定字符串的字节序的方式构造数组。 问题答案: 或者,如果您想要大端字节序: 的

  • 我在尝试将未签名的 char 数组转换为 jstring 时遇到问题。 上下文是我正在使用来自Java的共享c库。所以我正在实现一个JNI c文件。我在库中使用的函数会恢复 我在 JNI C 文件中实现的函数返回一个 jstring。 所以我需要把无符号的char数组转换成jstring。 但是,尽管数组应该只包含20个字节,但我在Java中随机得到22或23个字节......(虽然 20 个字节

  • 问题内容: 在C语言中,我可以使用数字做一些技巧: 在Swift中有没有办法做到这一点?请注意,相同的方法无效: 有没有一种方法可以让C的行为在Swift中减法? 谢谢! 问题答案: 所有有符号和无符号整数类型都有一个构造函数,该构造函数从具有相同内存表示形式的有符号(反之亦然)创建无符号数字: