2017-07-31 41 views
0

我想在Keras中製作一個自定義正規化器,我需要能夠捲動係數數組。在Keras中使用numpy卷

我知道這可能是不可能的,但任何可以複製此滾動功能的機制都將非常感激。

```

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)))) 

```

+0

'x'的維度是什麼?如果'x'是一個矩陣,那麼它可能有點奇怪。在權重矩陣上調用'np.roll'將首先使矩陣變平,線性移位元素,最後將其重構爲矩陣。這種行爲究竟是你想要的,還是它'np.roll(x,1,axis = 1)'? –

+0

x的維度總是(m,1)。我知道從測試它的一個玩具的例子與numpy那個roll是我要找的行爲 – SARose

+0

@ Yu-Yang編輯:'np.roll(x,1,axis = 1)'給出了與'np .roll(x,1)'在這個例子中,'axis = 1'更明確。 – SARose

回答

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向量,我估計開銷不會太壞。