NotImplementedError:无法将符号张量(2nd_target:0)转换为numpy数组

时间:2019-10-21 03:48:16

标签: python tensorflow keras loss-function

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

  

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

两个损失函数:

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警告:tensorflow:来自/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/resource_variable_ops.py:1630:   调用BaseResourceVariable。初始化(来自   具有约束的tensorflow.python.ops.resource_variable_ops)是   已过时,将在以后的版本中删除。有关说明

     

更新:如果使用Keras,则将* _constraint参数传递给图层。

     

NotImplementedError错误回溯(最近的调用   最后)在()        47 create_using = nx.DiGraph(),nodetype = None,data = [('weight',int)])        48   ---> 49模型= SDNE(G,hidden_​​size = [256,128],)        50 model.train(batch_size = 100,epochs = 40,verbose = 2)        51个嵌入= model.get_embeddings()

     

init (自身,图形,   hidden_​​size,alpha,beta,nu1,nu2)        72 self.A,self.L = self._create_A_L(        73 self.graph,self.node2idx)#调整矩阵,L矩阵   ---> 74 self.reset_model()        75 self.inputs = [self.A,self.L]        76 self._embeddings = {}

     

在reset_model(自我,选择)中

     

---> 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   在_method_wrapper中(self,* args,** kwargs)       455 self._self_setattr_tracking = False#pylint:disable =受保护的访问       456尝试:   -> 457 result = method(self,* args,** kwargs)       458最后:       459 self._self_setattr_tracking = previous_value#pylint:disable =受保护的访问

     

NotImplementedError:无法转换符号张量(2nd_target:0)   到一个numpy数组。

请帮助,谢谢!

4 个答案:

答案 0 :(得分:61)

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

pip install numpy==1.19.5

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

答案 1 :(得分:14)

这可能是 numpy 版本的问题。尝试使用小于 1.20 的 numpy

pip install numpy==1.19

答案 2 :(得分:3)

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

这是因为我将符号张量与非符号类型(例如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

希望获得帮助!

答案 3 :(得分:0)

  1. 转到 Anaconda 导航器
  2. 找到你安装的包 (numpy)
  3. 点击包裹左侧的绿色钩子
  4. “标记特定版本安装”
  5. 选择版本,应用