尝试在Keras中创建自定义损失函数时出现“仅当启用急切执行时,张量对象才可迭代”错误

时间:2019-08-11 19:03:50

标签: python tensorflow keras loss-function svd

我正在尝试使用神经网络进行SVD​​。我的输入是一个矩阵(仅说4x4矩阵),输出是一个表示分解形式的向量(假设输入是4x4,这将是一个36元素向量,其中U元素为16个元素,S元素为4个元素,S元素为16个元素对于VT)。

我试图定义一个自定义损失函数,而不是在分解后的表单上使用MSE之类的东西。因此,我不想比较36个长度向量的损失,而是要计算重建矩阵之间的损失。因此,如果A = U * S * V.T(实际)和A' = U' * S' * V.T'(预测),我想计算A和A'之间的损耗。

我对tensorflow和keras相当陌生,所以我可能会做一些幼稚的事情,但是到目前为止,这是我所拥有的。尽管逻辑对我来说似乎还可以,但是我得到了TypeError: Tensor objects are only iterable when eager execution is enabled. To iterate over this tensor use tf.map_fn.,但我不确定为什么会这样以及如何解决?另外,是否需要像我当前所做的那样将reconstruct_matrix的输出变平,还是应该保持原样?

# This function takes the decomposed matrix (vector of U, S, V.T)
# and reconstructs the original matrix

def reconstruct_matrix(decomposed_vector):
  example = decomposed_vector
  s = np.zeros((4,4))
  for en, i in enumerate(example[16:20]):
    s[en, en] = i
  u = example[:16].reshape(4,4)
  vt = example[20:].reshape(4,4)
  orig = np.matmul(u, s)
  orig = np.matmul(orig, vt)
  return orig.flatten() # Given that matrices are 4x4, this will be a length 16 vector

# Custom loss that essentially computes MSE on reconstructed matrices 

def custom_loss(y_true, y_pred):
    Y = reconstruct_matrix(y_true)
    Y_prime = reconstruct_matrix(y_pred)
    return K.mean(K.square(Y - Y_prime)) 

model.compile(optimizer='adam',
              loss=custom_loss)

注意:我的keras版本是2.2.4,我的tensorflow版本是1.14.0。

1 个答案:

答案 0 :(得分:0)

tf1.x中,默认情况下禁用急切执行(自2版开始启用)。

您必须通过调用脚本顶部来启用它:

import tensorflow as tf

tf.enable_eager_execution()

此模式允许您将类似Python的抽象用于流控制(例如,您在代码中一直使用的if语句和for循环)。如果已禁用,则需要使用Tensorflow函数(iffor分别使用tf.condtf.while_loop)。

有关它的更多信息in the docs

顺便说一句。我不确定是否要展平,但是请记住您的y_truey_pred需要相同的形状,并且样本必须彼此对应,如果可以的话,您应该没事。