프로젝트 폴더에서 즉, .git이 존재하는 폴더에 .gitignore 파일를 만듭니다.

vi .gitignore -> 'i' 입력 -> push를 원하지않는 파일 입력 -> :wq를 눌러 나가기

# .idea
*.idea

# .ipynb_checkpoints
*.ipynb_checkpoints

# etc.
*.jar
*.war
.DS_Store
file.xml

위처럼 *.확장자명을 입력하면, 해당 확장자명을 가진 파일을 push하지 않습니다.

후에 아래처럼 다시 commit합니다.

git rm -r --cached .
git add .
git commit -m "git add ignore"
git push (origin master)

 

다음 사이트를 통해 자동으로 위 내용을 생성할 수 있습니다.

www.toptal.com/developers/gitignore

Abstract

The central building block of convolutional neural networks (CNNs) is the convolution operator, which enables networks to construct informative features by fusing both spatial and channel-wise information within local receptive fields at each layer. A broad range of prior research has investigated the spatial component of this relationship, seeking to strengthen the representational power of a CNN by enhancing the quality of spatial encodings throughout its feature hierarchy. In this work, we focus instead on the channel relationship and propose a novel architectural unit, which we term the “Squeeze-and-Excitation” (SE) block, that adaptively recalibrates channel-wise feature responses by explicitly modelling interdependencies between channels. We show that these blocks can be stacked together to form SENet architectures that generalise extremely effectively across different datasets. We further demonstrate that SE blocks bring significant improvements in performance for existing state-of-the-art CNNs at slight additional computational cost. Squeeze-and-Excitation Networks formed the foundation of our ILSVRC 2017 classification submission which won first place and reduced the top-5 error to 2.251%, surpassing the winning entry of 2016 by a relative improvement of ∼25%. Models and code are available at https://github.com/hujie-frank/SENet.


CNN 구성에서 핵심 기능은 각 layer의 receptive field에서 공간적, 채널별 정보를 혼합하는 체계로 구성하는 것이다.

이전에 수행한 광범위한 연구는 두 가지 관계의 공간적 요소를 조사했고, 계층적 특징 전반에 걸쳐 공간 인코딩의 품질을 향상시킴으로써 CNN의 표현력을 강화하고자 했다.

이 논문은 채널별 관계를 살펴보는 것 대신에 채널 간의 상호의존성을 명시적으로 모델링하여 채널별로 추출하는 특징을 재조정하는 새로운 아키텍쳐 단위인 SE(Squeeze-and-Excitation) block을 소개한다.

우리는 이 block을 쌓은 SENet 아키텍처가 서로 다른 데이터셋에서 효율적으로 일반화할 수 있다는 것을 확인했다.

게다가 SE block은 약간의 계산비용이 추가되지만 SOTA 모델에 적용했을 때, 성능적으로 주요한 향상을 보여주었다.

ILSVRC 2017에서 우승을 차지했고, 2016년 우승자보다 25%의 차이를 보여주었다.


요약

  • 최근 CNN에서의 연구는 특정 아키텍처를 통해 공간 정보를 손실하지 않고 특징을 잘 포착할 수 있도록 도와주는 다양한 아키텍처를 모델에 통합하고 있다. 예를 들면, inception module은 다양한 크기의 컨볼루션을 사용하였다.
  • SE block의 사용을 통해 채널별 상호의존성을 모델링하여 CNN의 표현을 강화하고, 성능을 향상시키는 것이 목표이다. 또, 유용한 정보를 선택적으로 강조하기 위한 전역 정보를 다시 생성해내는 작업을 수행하는 메커니즘을 소개한다.
  • SE block은 밑의 그림과 같으며, 매우 단순하고, 다른 SOTA 모델의 모듈과 대체하여 사용할 수 있고, 성능을 향상시킬 수 있다.(squeeze --> excitation)

SE Block

  • 컨볼루션을 통과한 output U는 먼저 squeeze 연산을 수행하게 되는데, squeeze 연산은 GAP(Global Average Pooling)을 통해 전역 공간 정보를 다룰 수 있게 한다. (여기서는 GAP를 사용했지만, 다른 channel descriptor를 사용해도 된다고 논문에 언급되어 있다) 단순하게 생각하자면 GAP를 사용하는 이유를 떠올려보자.

squeeze

  • excitation 연산은 시그모이드 함수를 활용한 게이트 메커니즘을 사용하는데, 여기서 차원 감소를 위해 reduction ratio r을 적용한 두 개의 Fully connected layer를 사용한다. squeeze와 excitation 연산을 거친 최종 output U는 rescaling된 결과로 반환된다. reduction ratio default value는 16이다.

excitation

  • 최종적으로 논문에서 제안된 순서는 [GAP -> FC -> ReLU -> FC -> Sigmoid]가 된다. 논문에 나와있는 SE-Inception module은 다음 그림에서 볼 수 있다.

SE-Inception Module

  • 위와 같이 SE-block은 유명한 Inception 계열 또는 ResNet 계열에도 적용할 수 있어 매우 유연하다는 점을 강조한다.
  • SE block을 적용한 ResNet, Inception 등 모델에서는 base 모델보다 향상된 성능을 보여주었으며, 아주 약간의 complexity 증가로 매우 효율적인 구조임을 증명한다.

Performance and Complexity

또, CIFAR-10, CIFAR-100 등 데이터셋에서의 성능 실험과 SE block이 가지는 여러 가지 파라미터에 대해 추가 실험을 진행하여 해당 결과를 논문에서 공유하고 있다.

GAP 부분을 1x1 컨볼루션으로 교체하고(이를 NoSqueeze라고 한다) 실험한 결과 GAP가 더 우수한 결과를 보여주었다.

마지막으로 논문의 끝에서 사용한 SE block의 activation의 상태변화를 보여주는데, 모델의 후반부로 갈수록 SE block의 의미가 감소하는 것을 보여준다. 밑의 그림에서 SE_5_2와 SE_5_3은 클래스별로 그래프의 모양이 거의 다르지 않은 것에서 이를 생각해볼 수 있다.
SE block은 Input을 추론하기 위한 중요한 특징을 추출하는 channel에 scale weight를 부여해서 더욱 강조하겠다는 의미기 때문에 전자 그래프처럼 클래스마다 activation 그래프의 모양이 서로 달라야 정상적으로 작동하고 있음을 알 수 있다. 따라서, 이를 생각해보면 모델 후반부에 SE block을 사용하지 않음으로써 성능은 그대로 유지하되 model complexity는 감소시킬 수 있음을 알 수 있다(모델 파라미터가 더 줄어든다는 의미).

Excitation Activation

 


# 거듭제곱을 빠르게 구하는 방법은 
# 백준 1629번을 참고하세요.
def solve(A, B):
    if(B % 2 > 0):
        return solve(A, B - 1) * A
    elif(B == 0):
        return 1
    elif(B == 1):
        return A
    else:
        result = solve(A, B//2)
        return result ** 2 % p

N, K = map(int, input().split())    

n_part = 1
nk_part = 1

p =  1000000007

# N! 부분
for num in range(1, N+1):
    n_part *= num; n_part %= p

# K! 부분
for num in range(1, K+1):
    nk_part *= num; nk_part %= p

# (N-K)! 부분
for num in range(1, N-K+1):
    nk_part *= num; nk_part %= p
    
# (p-2) 제곱 부분은 거듭제곱을 빠르게 구하는 방법을
# 그대로 가져와서 사용합니다.
nk_part = solve(nk_part, p-2) % p

result = (n_part * nk_part) % p
print(result)

페르마의 정리를 처음 접해봤는데, 무엇보다 이항계수가 페르마의 정리에 의해 어떻게 단순화될 수 있는지 직접 손으로 풀어보면 바로 코드로 옮길 수 있을 것이다.

페르마의 정리를 통해 이항계수의 분모에 해당하는 K!(N-K)!를 거듭제곱 형태로 바꿔주어 시간복잡도를 줄일 수 있다.

'# 코딩 문제 관련 > 파이썬' 카테고리의 다른 글

백준 10830번(python)  (0) 2020.07.11
백준 2740번(python)  (0) 2020.07.11
백준 1629번(python)  (0) 2020.05.04
백준 1780번(python)  (0) 2020.05.04
백준 1992번(python)  (0) 2020.05.04

https://hwiyong.tistory.com/27

 

posterior과 bayesian

논문을 읽다보면 확률 모델에 대한 이야기가 많이 나옵니다. 사실상 이해를 못한 채 넘어가는 부분이 많은데, 검색을 통해서 공부하고 또 공부한 내용을 한번 적어보도록 하겠습니다. 대표적으�

hwiyong.tistory.com


위 글에서 사전확률과 사후확률을 충분히 설명했습니다.

사전확률은 내가 알고있는 지식으로부터 얻어진 특정 사건의 확률

사후확률은 특정 사건이 일어났을 때, 어떤 원인때문이다 라고 생각되는 확률입니다.

 

베이즈 정리의 대표적인 수식은 다음과 같습니다.

 위 수식은 두 가지 사건이 존재할때 성립하고, 그보다 더 많은 사건이 존재할 때는 다음과 같이 표현할 수 있습니다.

간단한 예를 들어서 베이즈 정리를 사용해보겠습니다.

우리는 지금 세 개의 상자를 가지고 있고, 각 상자는 흰돌과 검은돌을 아래 표처럼 가지고 있습니다.

상자 흰돌의 개수 검은돌의 개수
A 3 6
B 1 9
C 3 3

위 표를 통해 알 수 있는 것은 세 개의 상자 중 하나를 선택하는 확률이 1/3 이라는 것과 상자에서 검은돌과 흰돌이 뽑힐 확률을 알 수 있습니다.

예를 들어 A 상자에서 흰돌을 뽑을 확률은 3/9입니다. 또, 이를 P(흰돌|A) 이라고 표현할 수 있습니다.
위에서 알 수 있는 강조된 확률은 정확히 사전확률에 해당합니다.

그래서 우리가 알고 싶은 것은 '흰돌을 뽑았는데, 이 흰돌이 A 상자로부터 나올 확률은 무엇인가?' 입니다.
이 확률은 굉장히 알기 어렵습니다. 하지만 우리가 알고있는 사전확률과 베이즈 정리을 사용하면 구할 수 있을 것입니다.
위 문제는 다음과 같이 표현합니다. P(A|흰돌)

베이즈 정리를 사용하면 다음 수식으로 P(A|흰돌)를 구할 수 있습니다.

직접 확률을 대입해보면 다음과 같습니다.