2017-07-10 24 views
5

Chcę przekazać multidimensionnal tablicę do Reluprime funkcjiRelu Prime z numpy tablicy

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

... gdzie x jest cała tablica. Zwraca

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

miałem ten problem z normalnym relu funkcji i zamiast korzystać z funkcji Pythona max() użyłem np.max() i to działało. Ale w przypadku relu prim nie działa tak czy inaczej. Próbowałem:

def reluprime(x): 
    if np.greater(x, 0): 
     return 1 
    else: 
     return 0 

... i nadal zwracał ten sam błąd. Jak mogę to naprawić? Dziękuję Ci.

+2

Twój problem jest to, że Instrukcja 'if 'nie działa dla kodu wektoryzowanego. Operator '>' jest w porządku – Eric

Odpowiedz

5

Instrukcja if nie ma sensu, ponieważ jest oceniana tylko raz dla całej tablicy. Jeśli chcesz równowartość czy komunikat do każdego elementu tablicy, należy zrobić coś takiego:

def reluprime(x): 
    return np.where(x > 0, 1.0, 0.0) 
+3

Jest to około 3 razy wolniejsze od odpowiedzi Miriam, ale jest w istocie najbardziej naturalną wektoryzacją oryginalnego kodu i ogólnie jest właściwym podejściem do tłumaczenia instrukcji "if". – Eric

6

Od Relu prime Zwraca 1, jeśli wpis w wektorze jest większe niż 0 i 0 w przeciwnym razie, można po prostu zrobić:

def reluprime(x): 
    return (x>0).astype(x.dtype) 

w powyższym kodzie, tablica wejście x zakłada się numpy tablicy. Na przykład reluprime(np.array([-1,1,2])) zwraca array([0, 1, 1]).

+0

'astype (x.dtype)' jest prawdopodobnie bardziej przydatny tutaj – Eric

+0

@Eric, dziękuję, to ma sens! Zmieniłem odpowiedź. –

+0

Ponieważ w kontekście uczenia maszynowego zwykle używasz 'float32' lub' float64', a będziesz chciał uzyskać wynik tej samej precyzji – Eric

4

"relupime" lub gradient funkcji ReLU, jest lepiej znany jako "funkcja kroku heaviside".

Numpy 1.13 wprowadza ufunc na to:

def reluprime(x): 
    return np.heaviside(x, 0) 
    # second value is value at x == 0 
    # note that ReLU is not differentiable at x==0, so there is no right value to 
    # pass here 

wyniki czasowe na moim komputerze koncert to występ bardzo słabo, co sugeruje, więcej pracy jest tam potrzebne:

In [1]: x = np.random.randn(100000) 

In [2]: %timeit np.heaviside(x, 0) #mine 
1.31 ms ± 58.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

In [3]: %timeit np.where(x > 0, 1.0, 0.0) # Jonas Adler's 
658 µs ± 74.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

In [4]: %timeit (x>0).astype(x.dtype) # Miriam Farber's 
172 µs ± 34.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)