我尝试将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数组。
请帮助,谢谢!
答案 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)