2017-09-18 6 views
2

저는 MXNet을 처음 사용합니다 (저는 Python3에서 사용 중입니다)MXNet : nn.Activation vs nd.relu?

자습서 시리즈에서는 자신 만의 gluon blocks을 정의 할 것을 권장합니다.

class CNN1D(mx.gluon.Block): 
    def __init__(self, **kwargs): 
     super(CNN1D, self).__init__(**kwargs) 
     with self.name_scope(): 
      self.cnn = mx.gluon.nn.Conv1D(10, 1) 
      self.bn = mx.gluon.nn.BatchNorm() 
      self.ramp = mx.gluon.nn.Activation(activation='relu') 

    def forward(self, x): 
     x = mx.nd.relu(self.cnn(x)) 
     x = mx.nd.relu(self.bn(x)) 
     x = mx.nd.relu(self.ramp(x)) 
     return x 

이 자신의 예제의 구조를 거울 :

그래서 이것이 당신의 블록 (공통 회선 구조)라고 할 수 있습니다. mx.nd.relumx.gluon.nn.Activation의 차이점은 무엇입니까?

mx.gluon.nn.Activation(activation=<act>) 

NDArray 모듈에서 기본 활성화의 호스트를 호출하는 래퍼 것 같습니다

x = self.ramp(x) 

대신

x = mx.nd.relu(self.ramp(x)) 

답변

2

의이어야한다.

따라서 - 원칙 - 전방 정의에 하나

x = mx.nd.relu(x) 

또는 relu 같은

x = mx.nd.relu(self.ramp(x)) 

단순히 최대 복용

x = self.ramp(x) 

또는

를 사용하는 경우는 문제가되지 않습니다 0과 전달 된 값 (그래서 여러 응용 프로그램은이 값 외에도 단일 호출 이상으로 값에 영향을 미치지 않습니다 약간의 런타임 지속 시간 증가).

따라서 에서이 경우에는별로 중요하지 않습니다. 물론 여러 호출을 스태킹하는 다른 활성화 함수가 영향을 미칠 수 있습니다.

gluon.Block을 정의 할 때 MXNets 설명서에서 그들은 순방향 정의에서 nd.relu을 사용합니다. 이는 mx.gluon.nn.Activation(activation='relu')을 사용하는 것보다 약간 적은 오버 헤드가 발생할 수 있습니다.

Flavor-wise gluon 모듈은 높은 수준의 추상화를위한 것입니다. 따라서 블록을 정의 할 때 nd.<act>(x) 대신 ramp = mx.gluon.nn.Activation(activation=<act>)을 사용하고 앞으로 정의에서 self.ramp(x)을 호출해야한다고 생각합니다.

그러나이 시점에서 모든 사용자 지정 설명서는 relu 활성화에 따라 달라 지므로이 결과가 오래 가지 않을지 여부는 아직 확인되지 않았습니다.

모두 함께 mx.gluon.nn.Activation을 사용하면 Gluon 모듈의 NDArray 모듈에서 활성화 함수를 호출하는 것처럼 보입니다.

+0

명확한 답변을 추가했습니다. –

1

mx.gluon.nn.Activationmx.ndarray.Activation을 감싸고 있습니다 (Gluon source code 참조).

그러나 신경망을 만들 때 Gluon을 사용하는 경우 Gluon API를 사용하고 하위 수준 MXNet API를 임의로 사용하려면 분기하지 말 것을 권장합니다. 이는 Gluon이 발전하고 잠재적으로 변경 될 수 있습니다 (예 : stop 후드에서 mx.nd 사용).