keras - Keras 中的按列操作
问题描述
假设我有一个向量 v 和一个矩阵 M——它们不是输入,而是其他操作产生的中间张量。我想做一个按列操作——即,对 M 的每一列应用一个函数 f。也就是说,
操作(v, M) = [f(v, M[:,i])] 对于 i = 1 .. N。
我所做的是以下(伪代码):
for i range(K.int_shape(M))[1]:
column = Lambda(lambda x:x[:,i])(M)
... <a code performing f(v, column)> ...
我发现,在运行时(即 model.fit())列在 for 循环内是相同的,而不是检索每一列。我怀疑 Lambda(lambda x:x[:,i]) 不是在 Keras 中检索列的正确方法。
在 Keras 的矩阵中进行按列操作的正确方法是什么?
解决方案
我发现了一个问题。Python 中的 lambda 函数进行惰性求值。也就是说,它不是在声明时而是在执行时在 lambda 函数中设置 i 的值。这就是为什么所有 Lambda 层都试图检索最后一列的原因。
当我将 lambda 函数定义更改为它时,column = Lambda(lambda j:lambda x:x[:,j](i))(M)
它现在可以工作了。