2017-06-29 40 views
0

我有一個類Node它應該包含激活功能。但是,在使用kwargs創建對象時,必須確定它的激活函數。像這樣,如何在Python中創建對象之前使成員函數不確定?

n1 = Node(activation='name_of_activation function') 

我有工作的例子,但我不知道我是否錯過了一些東西。這是我的代碼:

import math 


def Signum(x): 
    return 1 if x > 0 else 0 

def Sigmoid(x): 
    return math.tanh(x) 

def Sin(x): 
    return math.sin(x) 


class Node(): 
    ''' 
    This is class of one node 

    Each node contains an activation function. 
    ''' 
    def __init__(self, **kwargs): 
     #possible functions 
     self.__functions = { 'sgn' : Signum, 'sigmoid' : Sigmoid, 'sin' : Sin } 
     self.__activate = self.__functions[kwargs.get('activation', Sigmoid)]          

    def Activation(self, input_value): 
     return self.__activate(input_value) 

n1 = Node(activation='sgn') 
n2 = Node(activation='sigmoid') 
n3 = Node(activation='sin') 
print n1.Activation(-1), n2.Activation(-1), n3.Activation(-1) 

我不知道這是否是正確的,做我想做的以這種方式,即碰巧我有兩個引用一個函數:self.__activateActivation。但我不知道如何擺脫它,因爲:

  1. 一方面,我想使用鍵值原則來聲明一個對象。
  2. 另一方面,它需要可以在課堂外調用方法。

問題:如何離開未定,直到它通過kwarg確定對象的申報的瞬間激活功能?此外,還需要調用課堂外的激活功能。

回答

1

實際上,你可以只通過本身的功能,讓你的類將是激活功能的獨立的:

def Signum(x): 
    return 1 if x > 0 else 0 

def Sigmoid(x): 
    return math.tanh(x) 

def Sin(x): 
    return math.sin(x) 


class Node(): 
    ''' 
    This is class of one node 

    Each node contains an activation function. 
    ''' 
    def __init__(self, activation=Sigmoid): 
     #possible functions 
     self.__activate = activation          

    def Activation(self, input_value): 
     return self.__activate(input_value) 

這樣,你的類將默認使用Sigmoid,也注意到,您可以檢查是否激活函數是可以調用的:

def __init__(self, activation=Sigmoid): 
     #possible functions 
     if not callable(actvation): 
      raise ValueError("activation should be a callable function") 
     self.__activate = activation 

如果你真的需要通過函數在kwargs只是檢查,如果你需要的關鍵是在那裏:

def __init__(self, **kwargs): 
     #possible functions 
     activation = None 
     if "activation" in kwargs: 
      activation = kwargs["activation"] 
     if not callable(actvation): 
      raise ValueError("activation should be a callable function") 
     self.__activate = activation 
+0

+1檢查該功能是否可調用更好。但。還有兩個引用一個函數。而且我不喜歡時間變量('激活'),它們在物體存在的同時存在。 – BogdanSikach

+0

@Wolfgang,'activation'只是一個指針,一旦創建了對象並且你的代碼超出了'__init__'的範圍就會過期。 – Netwave

+0

你是對的。忘記'__init__'。 – BogdanSikach

1

你可以通過函數本身作爲一個參數

class Node: 

    def __init__(self, func) 
     self.activation = func 

然後你做Node(func).activation()它將運行func

我認爲這是不是傳遞函數名作爲參數,這是更容易出錯

相關問題