【问题标题】:Using numpy roll in Keras在 Keras 中使用 numpy roll
【发布时间】:2017-07-31 20:59:36
【问题描述】:

我正在尝试在 Keras 中制作一个自定义正则化器,我需要能够滚动系数数组。

我知道这可能是不可能的,但是任何可以复制此滚动功能的机制将不胜感激。

```

def __call__(self, x):
    regularization = 0.

    # Add components if they are given
    if self.l1:
        # \lambda ||x||
        regularization += self.l1 * K.sum(K.abs(x))
    if self.fuse:
        # \lambda \sum{ |x - x_+1| }
        regularization += self.fuse * K.sum(K.abs(x - np.roll(x, 1)))
    if self.abs_fuse:
        # \lambda \sum{ ||x| - |x_+1|| }
        regularization += self.abs_fuse * K.sum(K.abs(K.abs(x) - K.abs(np.roll(x, 1))))

```

【问题讨论】:

  • x的维度是多少?如果x 是一个矩阵,那么它可能有点奇怪。在权重矩阵上调用np.roll 将首先展平矩阵,线性移动元素,最后将其重新整形为矩阵。这种行为正是您想要的,还是np.roll(x, 1, axis=1)
  • x 的维数始终为 (m, 1) 。而且我通过用 numpy 在玩具示例上对其进行测试知道,roll 是我正在寻找的行为
  • @Yu-Yang 编辑:np.roll(x, 1, axis=1) 在此示例中给出与np.roll(x, 1) 相同的结果,但axis=1 更明确。
  • 我已经发布了一个可能的实现方式,请看看是否是你想要的。

标签: numpy tensorflow keras


【解决方案1】:

鉴于x 的形状为(m, 1),一个可能的解决方案是使用tile

def roll_reg(x):
    length = K.int_shape(x)[0]
    x_tile = K.tile(x, [2, 1])
    x_roll = x_tile[length - 1:-1]
    return K.sum(K.abs(x - x_roll))

这会导致一些额外的内存使用,但如果x 是一个 1-dim 向量,我想开销不会太糟糕。

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2014-05-16
    • 2023-03-22
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多