首页 > 解决方案 > 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 的矩阵中进行按列操作的正确方法是什么?

标签: keras

解决方案


我发现了一个问题。Python 中的 lambda 函数进行惰性求值。也就是说,它不是在声明时而是在执行时在 lambda 函数中设置 i 的值。这就是为什么所有 Lambda 层都试图检索最后一列的原因。

当我将 lambda 函数定义更改为它时,column = Lambda(lambda j:lambda x:x[:,j](i))(M)它现在可以工作了。


推荐阅读