我正在尝试使用神经网络进行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。
答案 0 :(得分:0)
在tf1.x
中,默认情况下禁用急切执行(自2
版开始启用)。
您必须通过调用脚本顶部来启用它:
import tensorflow as tf
tf.enable_eager_execution()
此模式允许您将类似Python的抽象用于流控制(例如,您在代码中一直使用的if
语句和for
循环)。如果已禁用,则需要使用Tensorflow函数(if
和for
分别使用tf.cond
和tf.while_loop
)。
有关它的更多信息in the docs。
顺便说一句。我不确定是否要展平,但是请记住您的y_true
和y_pred
需要相同的形状,并且样本必须彼此对应,如果可以的话,您应该没事。