3

저는 MNIST 데이터 세트에서 기계를 학습 할 수있는 파이썬으로 간단한 CNN 프로그램을 구현했습니다. 나는 3 층 구현했습니다 : 완전히 연결 숨겨진 레이어를 기본적으로 네트워크의 softmax를 출력을 제공 평균 풀링을 파이썬을 사용한 프레임 워크없는 CNN 구현으로 변경합니다.

  • SoftmaxLayer입니다
  • FullyConnectedLayer을 풀링 의미 하는가 다음 컨볼 루션과

    1. ConvPoolLayer을

    ConvPoolLayer에 평균 풀링을 구현했습니다. 여기에 앞으로 전파하는 동안 풀링을 의미합니까 코드 줄의 :

    # 'activation' is a numpy array of 3D activations from the convolutional code (not shown here)  
    skimage.measure.block_reduce(activation, block_size=(1, 1, 2, 2), func=np.mean) 
    

    는 그리고 여기에 해당하는 역 전파 코드입니다 :

    # delta is a numpy array of 3D error matrices back-propagated from the upper layers 
    delta = delta.repeat(2, axis=2).repeat(2, axis=3) 
    

    그냥 오류를 업 스케일링되어하고있어 모두.

    내 질문은 어떻게 성능 저하없이 최대 풀링을위한 backpropagation을 구현합니까? 또는 함수 호출없이이 작업을 수행하는 더 좋은 방법이 있습니까? 평균 풀링을 사용하여 몇 번 반복 한 후 ~ 90-95 %의 정확도를 얻었으므로 최대 풀링이 성능에 미치는 영향을보고 싶습니다.

    여기에 적용 할 수있는 NumPy 트릭이 있다면, 그것들을 배우게되어 기쁩니다. CNN에서 일어나는 일, 왜 일하는 방식, 그리고 작업을 최적화 할 수 있는지에 대해 이해하고 싶습니다. 따라서 프레임 워크를 사용하는 것은 나를위한 선택 사항이 아닙니다.

    도움 주셔서 감사합니다.

  • +0

    당신은 FUNC = np.max이이 정확히 최대 풀링을 어떻게해야되지 않습니다. 그리고 func = np.mean은 평균 풀링을할까요? – taarraas

    +0

    문제는 max-pooling 오류를 역 전파합니다. 오류를 업 스케일링 할 때 올바른 색인으로 오류를 전송해야합니다. –

    답변

    3
    1. [업데이트] 최대 풀링을 사용하기 위해 앞으로 전파 : 평균 풀링에 대한

      skimage.measure.block_reduce(activation, block_size=(1, 1, 2, 2), func=np.max)

    2. 귀하의 역 전파가 완전히 정확하지 않습니다. 델타를 풀링 된 셀 수로 나눠야합니다 (귀하의 경우 4 개). 슬라이드 11의 수식을 http://www.slideshare.net/kuwajima/cnnbp

    3. 최대 풀링을 전파하려면 전달 경로에서 가장 높은 값을 가진 셀에만 델타를 할당해야합니다. 따라서 풀링 레이어의 순방향 통과 중에는 최대 활성화 (종종 스위치라고도 함)의 인덱스를 추적하여 백 그라핑 라우팅이 백 프로 모션 동안 효율적 이도록하는 것이 일반적입니다. 이를 구현하기 위해 http://cs231n.github.io/convolutional-networks/#pool

    매우 비효율적 인 방법을 참조하십시오 :

    #forward 
    activationPrevious = np.copy(activation) 
    skimage.measure.block_reduce(activation, block_size=(1, 1, 2, 2), func=np.max) 
    maxs = activations.repeat(2, axis=2).repeat(2, axis=3) 
    mask = np.equal(activationPrevious, maxs).astype(int) 
    
    #backward 
    delta = delta.repeat(2, axis=2).repeat(2, axis=3) 
    delta = np.multiply(delta, mask) 
    
    +0

    죄송합니다. 몇 가지 실험을하고 있었고 코드를 np.mean으로 다시 변경하는 것을 잊었습니다. 어쨌든, 나는 그것을 업데이트했다. 최대 풀링을 전파하기 위해 나를 보여줄 수있는 코드 예제가 있습니까? –

    +0

    파이썬 최적화가 잘되지 않습니다. 1과 0 만 저장하는 정방향 패스에서 하나 이상의 배열을 만들 수 있습니다.블록에서 최대 값을 갖는 위치에 대해서는 1이고, 해당 블록에있는 다른 모든 셀에 대해서는 0입니다. 그리고 backpropagation에서,이 배열에 의한 평균 풀링을 위해 델타를 요소 적으로 곱하면됩니다. – taarraas

    +0

    그게 나에게 일어난 일이지만, block_reduce를 사용하고 있기 때문에 어떻게해야할지 모르겠다. 나는 numpy와 scipy에서 꽤 초보자 다. 그래서 이것은 newb 질문이지만 사과한다. 며칠 동안 이걸 붙잡 았어. –