在lasagne中自定義層,實現highway network layer

一、自定義lasagne

    比如我要定義一個Highway network層(關於highway network的知識在網上有很多)

1)首先需要繼承lasagne的基礎層:


可以看到,自定義的層是繼承了lasagne.layers.Layer.

2)然後定義Highway network所需要更新的參數值:

    def __init__(self, incoming, h_w=lasagne.init.Normal(), h_b=lasagne.init.Normal(), t_w=lasagne.init.Normal(), t_b=lasagne.init.Normal(), **kwargs):
        super(HighwayNetwork2D,self).__init__(incoming, **kwargs)
        num_filters = self.input_shape[1]
        cnn_size = self.input_shape[2]
        self.h_w = self.add_param(h_w, (num_filters,cnn_size), name='h_w')
        self.h_b=self.add_param(h_b, (cnn_size,), name='h_b')
        self.t_w=self.add_param(t_w, (num_filters,cnn_size), name='t_w')
        self.t_b=self.add_param(t_b, (cnn_size,), name='t_b')

3)定義實際的操作,在get_output_for()這個函數中進行

    def get_output_for(self, input, **kwargs):
#        #batch_size
#        batch_size=T.arange(input.shape[0])
        
        #H(x)=tanh(W*x+b)
        h_x=T.tanh(self.h_w*input+self.h_b)
        #t=sigmoid(W*x+b)
        t=T.nnet.sigmoid(self.t_w*input+self.t_b)
        #z=t*H(x)+(1-t)*x
        z=t*h_x+(1-t)*input

        return z

4)最後定義輸出時候的shape

    def get_output_shape_for(self, input_shape):
        return (input_shape[0], input_shape[1], input_shape[2])

最後整一個自定義層的代碼如下:

class HighwayNetwork2D(lasagne.layers.Layer):
    """
    Highway network  and use it has 3D
    1.z=t*H(x)+(1-t)*x
    2.H(x)=tanh(W*x+b)
    3.t=sigmoid(W*x+b)
    """
    def __init__(self, incoming, h_w=lasagne.init.Normal(), h_b=lasagne.init.Normal(), t_w=lasagne.init.Normal(), t_b=lasagne.init.Normal(), **kwargs):
        super(HighwayNetwork2D,self).__init__(incoming, **kwargs)
        num_filters = self.input_shape[1]
        cnn_size = self.input_shape[2]
        self.h_w = self.add_param(h_w, (num_filters,cnn_size), name='h_w')
        self.h_b=self.add_param(h_b, (cnn_size,), name='h_b')
        self.t_w=self.add_param(t_w, (num_filters,cnn_size), name='t_w')
        self.t_b=self.add_param(t_b, (cnn_size,), name='t_b')
        
    def get_output_for(self, input, **kwargs):
#        #batch_size
#        batch_size=T.arange(input.shape[0])
        
        #H(x)=tanh(W*x+b)
        h_x=T.tanh(self.h_w*input+self.h_b)
        #t=sigmoid(W*x+b)
        t=T.nnet.sigmoid(self.t_w*input+self.t_b)
        #z=t*H(x)+(1-t)*x
        z=t*h_x+(1-t)*input

        return z
    
    def get_output_shape_for(self, input_shape):
        return (input_shape[0], input_shape[1], input_shape[2])




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章