낙태는 분명히 살인입니다

교훈생각|2019.06.29 09:47

낙태가 2021년부터 합법화된다는 소식을 들었습니다.

 

어쩌다 낙태가 합법화되는 이 상황까지 왔을까요. 여성인권을 주장하시는 분들께서는 태아의 인권은 유린해도 된다고 생각하시는 겁니까? 태아가 가장 사회적 약자 중의 약자 아닙니까? 낙태죄 폐지를 찬성하고 요구하시는 분들께서는 낙태죄를 폐지하자 외치기 전에 이 질문들에 대답해보시기 바랍니다. 

 

 

하나, 왜 아기를 가지셨나요? 

 

둘, 왜 아무런 계획도, 준비도 없이 가지셨나요? 왜 피임은 하지 않았나요?

 

셋, 왜 애초에 낙태를 생각하고 싶은 상황을 만드셨습니까? 그 상황을 만든 것에 대해 본인의 책임이 정말 없습니까? 

 

넷, 혼외 정사(불륜)로 인해 생긴 아기를 지우려고 하시는 것은 아닙니까?  

 

다섯, 왜 여기저기 문란하게 성관계를 하고 다니셨나요? 

 

여섯, 왜 원나잇을 요구하는 사람이 가득할 것을 알고도 클럽 등의 장소를 가셨나요? 

 

일곱, 여러분의 삶이 태아의 생명보다 귀합니까? 그 근거가 무엇입니까?

 

여덜, 부모가 되어서 본인의 자식(태아)을 죽이기로 결정하는 것은 옳은 일입니까?

 

아홉, 태아는 사람 아닙니까? (임신 7주차만 되도 심장소리를 들을 수 있고, 13주차만 되고 성별을 알 수 있는데.) 

 

열, 태아가 도대체 무슨 잘못을 했습니까? 왜 죽어야 합니까? 

 

열하나, 낙태 시술을 집행해야하는 산부인과 의사는 무슨 죄입니까? 이것이 청부살인 아닙니까?

 

열둘, 태어나봤자 불행한 인생을 산다고요? 어떻게 남(태아)의 삶을 그렇게 쉽게 단정지을 수 있습니까? 

 

이 질문들에 떳떳하게, 논리적으로 답하실 수 있다면, 낙태죄 폐지 외치십시오. 

 

 

아래는 1200여명의 낙태시술을 집도했던 의사의 증언 영상입니다. 이 영상을 보면 낙태가 분명히 살인이라는 것을 알 수 있으실 것입니다. 낙태죄 폐지 외치시는 분들 제발 정신차리십시오. 낙태는 살인입니다. 그것도 너무나 끔찍한 살인입니다. 

 

https://www.youtube.com/watch?v=l0z6YxRs1wI&t=19s

 

댓글()

[CNN 알고리즘들] VGGNet의 구조 (VGG16)

CNN 알고리즘들 중에서 이미지 분류용 알고리즘에 대해서 계속해서 포스팅을 하고 있다. 현재까지 LeNet-5, AlexNet, VGG-F, VGG-M, VGG-S에 대해 소개했었다. 

 

LeNet-5 => https://bskyvision.com/418

AlexNet => https://bskyvision.com/421

VGG-F, VGG-M, VGG-S => https://bskyvision.com/420

 

오늘은 VGGNet에 대해서 글을 쓰려고 한다. VGGNet은 옥스포드 대학의 연구팀 VGG에 의해 개발된 모델로써, 2014년 이미지넷 이미지 인식 대회에서 준우승을 한 모델이다. 여기서 말하는 VGGNet은 16개 또는 19개의 층으로 구성된 모델을 의미한다(VGG16, VGG19로 불림). 이전에 포스팅한 VGG-F, VGG-M, VGG-S와는 차이가 있다. 그 모델들은 8개의 층을 가진 AlexNet과 유사한 모델들이다. 하지만 AlexNet와 같이 병렬적 구조로 이뤄지진 않았다. 

 

역사적으로 봤을 때 VGGNet 모델부터 시작해서 네트워크의 깊이가 확 깊어졌다. 아래 그림을 참고하자. 

 

네트워크의 깊이 변화에 따른 top-5 error의 변화 [1]

2012년, 2013년 우승 모델들은 8개의 층으로 구성되었었다. 반면 2014년의 VGGNet(VGG19)는 19층으로 구성되었고, 또한 GoogLeNet은 22층으로 구성되었다. 그리고 2015년에 이르러서는 152개의 층으로 구성된 ResNet이 제안되었다. 네크워크가 깊어질 수록 성능이 좋아졌음을 위 그림을 통해 확인할 수 있다. VGGNet은 사용하기 쉬운 구조와 좋은 성능 덕분에 그 대회에서 우승을 거둔 조금 더 복잡한 형태의 GoogLeNet보다 더 인기를 얻었다. 

 

자, 그러면 VGGNet은 이전 모델들과 비교해서 어떤 점이 있는지 살펴보도록 하자. 이 VGGNet의 original 논문은 Karen Simonyan과 Andrew Zisserman에 의해 2015 ICLR에 게재된 "Very deep convolutional networks for large-scale image recognition"이다. 

 

VGGNet의 구조

VGGNet의 original 논문의 개요에서 밝히고 있듯이 이 연구의 핵심은 네트워크의 깊이를 깊게 만드는 것이 성능에 어떤 영향을 미치는지를 확인하고자 한 것이다. VGG 연구팀은 깊이의 영향만을 최대한 확인하고자 컨볼루션 필터커널의 사이즈는 가장 작은 3 x 3으로 고정했다.

 

개인적으로 나는 모든 필터 커널의 사이즈를 3 x 3으로 설정했기 때문에 네트워크의 깊이를 깊게 만들 수 있다고 생각한다. 왜냐하면 필터커널의 사이즈가 크면 그만큼 이미지의 사이즈가 금방 축소되기 때문에 네트워크의 깊이를 충분히 깊게 만들기 불가능하기 때문이다. 

 

VGG 연구팀은 original 논문에서 총 6개의 구조(A, A-LRN, B, C, D, E)를 만들어 성능을 비교했다. 여러 구조를 만든 이유는 기본적으로 깊이의 따른 성능 변화를 비교하기 위함이다. 이중 D 구조가 VGG16이고 E 구조가 VGG19라고 보면 된다. 

 

VGGNet 구조 설명 표 [출처: original 논문]

 

VGG 연구팀은 AlexNet과 VGG-F, VGG-M, VGG-S에서 사용되던 Local Response Normalization(LRN)이 A 구조와 A-LRN 구조의 성능을 비교함으로 성능 향상에 별로 효과가 없다고 실험을 통해 확인했다. 그래서 더 깊은 B, C, D, E 구조에는 LRN을 적용하지 않는다고 논문에서 밝혔다. 또한 그들은 깊이가 11층, 13층, 16층, 19층으로 깊어지면서 분류 에러가 감소하는 것을 관찰했다. 즉, 깊어질수록 성능이 좋아진다는 것이었다. 

 

VGGNet의 구조를 깊이 들여다보기에 앞서 먼저 집고 넘어가야할 것이 있다. 그것은 바로 3 x 3 필터로 두 차례 컨볼루션을 하는 것과 5 x 5 필터로 한 번 컨볼루션을 하는 것이 결과적으로 동일한 사이즈의 특성맵을 산출한다는 것이다(아래 그림 참고). 3 x 3 필터로 세 차례 컨볼루션 하는 것은 7 x 7 필터로 한 번 컨볼루션 하는 것과 대응된다.

 

 

그러면 3 x 3 필터로 세 차례 컨볼루션을 하는 것이 7 x 7 필터로 한 번 컨볼루션하는 것보다 나은 점은 무엇일까? 일단 가중치 또는 파라미터의 갯수의 차이다. 3 x 3 필터가 3개면 총 27개의 가중치를 갖는다. 반면 7 x 7 필터는 49개의 가중치를 갖는다. CNN에서 가중치는 모두 훈련이 필요한 것들이므로, 가중치가 적다는 것은 그만큼 훈련시켜야할 것의 갯수가 작아진다. 따라서 학습의 속도가 빨라진다. 동시에 층의 갯수가 늘어나면서 특성에 비선형성을 더 증가시키기 때문에 특성이 점점 더 유용해진다. 

 

VGG16 구조 분석

그러면 이제 VGG16(D 구조)를 예시로, 각 층마다 어떻게 특성맵이 생성되고 변화되는지 자세하게 살펴보자. 아래 구조도와 함께 각 층의 세부사항을 읽어나가면 이해하기가 그렇게 어렵지 않을 것이다. 

 

VGG16 구조 [6]

 

0) 인풋: 224 x 224 x 3 이미지(224 x 224 RGB 이미지)를 입력받을 수 있다.

 

1) 1층(conv1_1): 64개의 3 x 3 x 3 필터커널로 입력이미지를 컨볼루션해준다. zero padding은 1만큼 해줬고, 컨볼루션 보폭(stride)는 1로 설정해준다. zero padding과 컨볼루션 stride에 대한 설정은 모든 컨볼루션층에서 모두 동일하니 다음 층부터는 설명을 생략하겠다. 결과적으로 64장의 224 x 224 특성맵(224 x 224 x 64)들이 생성된다. 활성화시키기 위해 ReLU 함수가 적용된다. ReLU함수는 마지막 16층을 제외하고는 항상 적용되니 이 또한 다음 층부터는 설명을 생략하겠다. 

 

2) 2층(conv1_2): 64개의 3 x 3 x 64 필터커널로 특성맵을 컨볼루션해준다. 결과적으로 64장의 224 x 224 특성맵들(224 x 224 x 64)이 생성된다. 그 다음에 2 x 2 최대 풀링을 stride 2로 적용함으로 특성맵의 사이즈를 112 x 112 x 64로 줄인다. 

 

*conv1_1, conv1_2와 conv2_1, conv2_2등으로 표현한 이유는 해상도를 줄여주는 최대 풀링 전까지의 층등을 한 모듈로 볼 수 있기 때문이다.  

 

3) 3층(conv2_1): 128개의 3 x 3 x 64 필터커널로 특성맵을 컨볼루션해준다. 결과적으로 128장의 112 x 112 특성맵들(112 x 112 x 128)이 산출된다. 

 

4) 4층(conv2_2): 128개의 3 x 3 x 128 필터커널로 특성맵을 컨볼루션해준다. 결과적으로 128장의 112 x 112 특성맵들(112 x 112 x 128)이 산출된다. 그 다음에 2 x 2 최대 풀링을 stride 2로 적용해준다. 특성맵의 사이즈가 56 x 56 x 128로 줄어들었다.

 

5) 5층(conv3_1): 256개의 3 x 3 x 128 필터커널로 특성맵을 컨볼루션한다. 결과적으로 256장의 56 x 56 특성맵들(56 x 56 x 256)이 생성된다. 

 

6) 6층(conv3_2): 256개의 3 x 3 x 256 필터커널로 특성맵을 컨볼루션한다. 결과적으로 256장의 56 x 56 특성맵들(56 x 56 x 256)이 생성된다. 

 

7) 7층(conv3_3): 256개의 3 x 3 x 256 필터커널로 특성맵을 컨볼루션한다. 결과적으로 256장의 56 x 56 특성맵들(56 x 56 x 256)이 생성된다. 그 다음에 2 x 2 최대 풀링을 stride 2로 적용한다. 특성맵의 사이즈가 28 x 28 x 256으로 줄어들었다. 

 

8) 8층(conv4_1): 512개의 3 x 3 x 256 필터커널로 특성맵을 컨볼루션한다. 결과적으로 512장의 28 x 28 특성맵들(28 x 28 x 512)이 생성된다. 

 

9) 9층(conv4_2): 512개의 3 x 3 x 512 필터커널로 특성맵을 컨볼루션한다. 결과적으로 512장의 28 x 28 특성맵들(28 x 28 x 512)이 생성된다. 

 

10) 10층(conv4_3): 512개의 3 x 3 x 512 필터커널로 특성맵을 컨볼루션한다. 결과적으로 512장의 28 x 28 특성맵들(28 x 28 x 512)이 생성된다. 그 다음에 2 x 2 최대 풀링을 stride 2로 적용한다. 특성맵의 사이즈가 14 x 14 x 512로 줄어든다.

 

11) 11층(conv5_1): 512개의 3 x 3 x 512 필터커널로 특성맵을 컨볼루션한다. 결과적으로 512장의 14 x 14 특성맵들(14 x 14 x 512)이 생성된다.

 

12) 12층(conv5_2): 512개의 3 x 3 x 512 필터커널로 특성맵을 컨볼루션한다. 결과적으로 512장의 14 x 14 특성맵들(14 x 14 x 512)이 생성된다.

 

13) 13층(conv5-3): 512개의 3 x 3 x 512 필터커널로 특성맵을 컨볼루션한다. 결과적으로 512장의 14 x 14 특성맵들(14 x 14 x 512)이 생성된다. 그 다음에 2 x 2 최대 풀링을 stride 2로 적용한다. 특성맵의 사이즈가 7 x 7 x 512로 줄어든다.

 

14) 14층(fc1): 4096개의 7 x 7 x 512 필터커널로 특성맵을 컨볼루션한다. 특성맵의 크기와 동일한 사이즈의 필터커널이므로 결과적으로 1 x 1 사이즈의 4096장의 특성맵이 산출된다. 이것을 하나로 연결해주면 4096차원의 벡터가 된다. 4096개의 뉴런으로 볼 수 있다. 훈련시 dropout이 적용된다. 

 

15) 15층(fc2): 4096개의 뉴런으로 구성해준다. fc1층의 4096개의 뉴런과 연결된다. 훈련시 dropout이 적용된다. 

 

16) 16층(fc3): 1000개의 뉴런으로 구성된다. fc2층의 4096개의 뉴런과 연결된다. 출력값들은 softmax 함수로 활성화된다. 1000개의 뉴런으로 구성되었다는 것은 1000개의 클래스로 분류하는 목적으로 만들어진 네트워크란 뜻이다. 

 


이미지 분류용 CNN 모델의 발전 과정을 추적해가는 과정이 꽤 흥미롭다. 질문 있으시면 댓글로 남겨주세요. 혹시 제 이해가 잘못된 부분 있다면 지적 부탁드립니다. 

 

 

 

<참고자료>

[1] https://laonple.blog.me/220738560542, 라온피플, VGGNet[1]
[2] https://laonple.blog.me/220749876381, 라온피플, VGGNet[2]
[3] https://reniew.github.io/08/, reniew's blog, Modern CNN
[4] https://cv-tricks.com/cnn/understand-resnet-alexnet-vgg-inception/, KOUSTUBH, "ResNet, AlexNet, VGGNet, Inception: Understanding various architectures of Convolutional Networks"

[5] http://www.vlfeat.org/matconvnet/models/imagenet-vgg-verydeep-16.svg

[6] https://neurohive.io/en/popular-networks/vgg16/, Neurohive, "VGG16 - Convolutional Network for Classification and Detection"

댓글()

[CNN 알고리즘들] VGG-F, VGG-M, VGG-S의 구조

컨볼루션 신경망(CNN)은 딥러닝 알고리즘 중에 컴퓨터 비전 분야에서 절대 강자로 군림하고 있다. CNN 알고리즘 중 LeNet-5AlexNet에 대해서는 이미 소개했다. 

 

옥스포드 대학의 연구팀 VGG에 의해 개발된 VGGNet은 2014년 이미지넷 이미지 인식 대회(ILSVRC)에서 준우승했다. 준우승한 모델이긴 하지만 오히려 우승한 모델인 GoogLeNet보다 더 각광받았다. 이 VGGNet부터 네트워크의 깊이가 확 깊어지기 시작했다. 여기서 말하는 VGGNet은 VGG16, VGG19와 같은 모델들이다. 

 

그러나 옥스포드 대학의 VGG팀은 VGG16, VGG19를 개발하기 전에, 먼저 AlexNet과 거의 유사한 CNN 모델들을 개발했었다. VGG-F, VGG-M, VGG-S로 불리는 모델들이다. 오늘은 바로 그 모델들에 대해서 정리하고자 한다. VGG16, VGG19에 대해서는 머지 않은 시일 내에 포스팅할 것이다. 

 

VGG-F, VGG-M, VGG-S 모델을 담고 있는 original 논문의 제목은 "Return of the Devil in the Details: Delving Deep into Convolutional Nets"이다. 2014년에 게재되었다. 

 

VGG-F, VGG-M, VGG-S의 구조

VGG-F, VGG-M, VGG-S는 속도와 정확도의 트레이드오프를 고려한 모델들이다. VGG-F는 fast, 즉 빠름에 초점을 맞춘 모델이고, VGG-S는 slow, 즉 느리지만 정확도에 초점을 맞춘 모델이다. VGG-M은 medium으로 이 둘의 중간 정도라고 보면 된다. VGG-F, VGG-M, VGG-S의 세부적 내용은 다음 표에서 잘 설명하고 있다.

 

VGG-F, VGG-M, VGG-S 구조 설명표 [출처: original paper].

 

VGG-F, VGG-M, VGG-S는 표에서 알 수 있듯이 5층의 컨볼루션 층들과 3층의 fully-connected 층들로 구성되어 있다. 이 글에서는 VGG-F를 중점으로 설명하려고 한다. VGG-F에 대한 설명을 잘 읽고나면 VGG-M과 VGG-S도 충분히 이해할 수 있을 것이라 생각한다. 

 

0) 인풋: VGG-F는 224 x 224 x 3 사이즈의 이미지(224 x 224의 RGB 컬러이미지)를 입력받을 수 있다.

 

1) 첫번째 레이어(컨볼루션 레이어, conv1): 64개의 11 x 11 x 3 사이즈 필터커널로 입력영상을 컨볼루션해준다. 이때 컨볼루션의 보폭(stride)은 4로 설정해주고, zero-padding은 사용하지 않는다. zero-padding이란 컨볼루션시 영상의 가장자리 부분에 0을 추가하여 가장자리에 있는 정보의 손실을 줄이는 것이다. 결과적으로 54 x 54 사이즈의 64장의 특성맵이 산출된다. 컨볼루션으로 산출되는 특성맵의 크기를 계산하는 방법과 관련해서는 아래 따로 설명해놓았다. ReLU 활성화 함수로 특성맵은 활성화된다. 그 다음에는 LRN(local response normalization)을 시행한다. 그 다음에 최대 풀링(max pooling)을 적용하여 2만큼 다운샘플링(downsampling)해준다. 그 결과 64장의 특성맵의 사이즈가 27 x 27로 줄어든다. 참고로 ReLU 활성화 함수 및 LRN에 대한 설명은 AlexNet 포스팅에서 찾아볼 수 있다. 

 

2) 두번째 레이어(컨볼루션 레이어, conv2): 256개의 5 x 5 x 64 사이즈 필터커널로 특성맵을 컨볼루션해준다. (전 층에서 생성된 64장의 특성맵을 입체적으로 겹쳐놓고 5 x 5 x 64 사이즈의 3차원 입체 필터커널로 컨볼루션해준다는 뜻이다.) 컨볼루션 보폭은 1로 설정하고, zero-padding은 2만큼 해준다. 결과적으로 27 x 27 사이즈의 256장의 특성맵이 산출된다. 역시 ReLU 활성화 함수를 적용한 후, LRN을 적용한다. 그 다음에 최대 풀링을 이용해서 2만큼 다운샘플링 해준다. 따라서 256장의 27 x 27 사이즈의 특성맵이 13 x 13으로 작아진다. 

 

3) 세번째 레이어(컨볼루션 레이어, conv3): 256개의 3 x 3 x 256 사이즈 필터커널로 특성맵을 컨볼루션해준다. 컨볼루션 보폭은 1로 설정하고, zero-padding은 1만큼 해준다. 결과적으로 13 x 13 사이즈의 256장의 특성맵이 산출된다. ReLU활성화 함수를 적용한다. 

 

4) 네번째 레이어(컨볼루션 레이어, conv4): 256개의 3 x 3 x 256 사이즈 필터커널로 특성맵을 컨볼루션해준다. 컨볼루션 보폭은 1로 설정하고, zero-padding은 1만큼 해준다. 결과적으로 13 x 13 사이즈의 256장의 특성맵이 산출된다. ReLU활성화 함수를 적용한다. 

 

5) 다섯번째 레이어(컨볼루션 레이어, conv5): 56개의 3 x 3 x 256 사이즈 필터커널로 특성맵을 컨볼루션해준다. 컨볼루션 보폭은 1로 설정하고, zero-padding은 1만큼 해준다. 결과적으로 13 x 13 사이즈의 256장의 특성맵이 산출된다. ReLU활성화 함수를 적용한다. 그 다음에 최대 풀링을 이용해서 2만큼 다운샘플링 해준다. 256장의 13 x 13 사이즈의 특성맵이 6 x 6으로 작아진다. 

 

6) 여섯번째 레이어(fully-connected 레이어, full6): 4096개의 6 x 6 x 256 사이즈 필터커널로 특성맵을 컨볼루션해준다. 전 층의 특성맵의 크기와 동일한 사이즈의 커널이므로 단 한번의 컨볼루션만 진행될 수 있다. 따라서 1x1 사이즈의 4096장의 특성맵이 산출된다. 이것을 하나로 연결해주면 4096 차원의 벡터가 된다(4096개의 뉴런). ReLU 함수로 활성화해준다. 과적합을 막기 위해 full6에는 훈련시 dropout이 적용된다. dropout에 대해서는 AlexNet 포스팅을 참고하자. 

 

7) 일곱번째 레이어(fully-connected 레이어, full7): 4096개의 뉴런으로 구성되어 있다. full6의 4096개 뉴런과 fully-connected(전 층과 이번 층의 모든 뉴런이 서로 다 연결)되어 있다. 출력된 값을 역시 ReLU 함수로 활성화해준다. full7에는 훈련시 dropout이 적용된다. 

 

8) 여덟번째 레이어(fully-connected 레이어, full8): 1000개의 뉴런으로 구성되어 있다. full7의 4096개 뉴런과 fully-connected 되어 있다. 출력된 값은 softmax 함수로 활성화되어 입력된 이미지가 어느 클래스에 속하는지 알 수 있게 해준다. 

 

왜 VGG-F가 가장 빠른가?

방금 전 챕터에서 VGG-F의 구조에 대해서 자세히 살펴봤다. 글의 초반부에 VGG-F가 VGG-M과 VGG-S에 비해 계산에 있어 더 빠르다고 했는데, 그 이유에 대해 살펴보려고 한다.

 

먼저 VGG-F와 VGG-M의 연산량을 비교해보자. 연산량에 가장 큰 차이를 유발하는 곳은 바로 첫번째 레이어다. VGG-F는 첫번째 레이어에서 입력영상을 64개의 11 x 11 x 3 사이즈 필터커널로 보폭 4로 컨볼루션해주는 반면, VGG-M은 첫번째 레이어에서 입력영상을 96개의 7 x 7 x 3 사이즈 필터커널로 보폭 2로 컨볼루션해준다. 필터커널의 사이즈가 작을수록, 또한 보폭이 작을수록 연산량은 많아진다. 

 

이번에는 VGG-M과 VGG-S의 연산량을 비교해보자. 연산량에 가장 큰 차이를 유발하는 곳은 바로 두번째 레이어다. 두번째 레이어에서 VGG-S는 VGG-M이 보폭2로 컨볼루션을 진행하는 것과 달리 보폭1로 컨볼루션을 진행한다. 

 

이와 같은 이유로 VGG-F가 VGG-M보다 빠르고, VGG-M은 VGG-S보다 빠르다. 반면 느린 만큼 정확도는 VGG-S가 가장 좋다. 

 

특성맵 크기 계산 관련

컨볼루션 이후 산출되는 특성맵의 크기 계산해서 좀 더 설명할 필요가 있어보인다. 간단한 예를 들어 실제로 특성맵의 크기를 구해보자. 9 x 9 사이즈의 입력 영상을 zero padding을 1만큼 해준 후 5 x 5 사이즈의 필터커널로 컨볼루션을 해주면 산출되는 특성맵의 크기는 어떻게 될까? 컨볼루션 보폭(stride)은 1로 설정하겠다.  

 

zero padding이 1만큼 이뤄진 후에는 다음과 같이 11 x 11 사이즈의 이미지가 된다.

 

9 x 9 이미지에 zero padding을 1만큼 적용해준 결과

 

가장자리에 0이 하나씩 더 추가된 것을 확인할 수 있을 것이다. 이제 5 x 5 필터커널을 가지고 좌측상단부터 보폭1로 컨볼루션을 진행해준다. 

 

5 x 5 필터커널은 우로 이동하면서 총 7번의 컨볼루션 연산을 진행하고, 또한 아래로 이동하면서 총 7번의 컨볼루션 연산을 진행한다. 따라서 7 x 7 특성맵이 산출되는 것이다. 

 

만약 컨볼루션 보폭이 2라면 두 칸씩 움직이기 때문에, 오른쪽 끝에 도달할 때까지 4번, 아래 끝에 도달할 때까지 4번 컨볼루션 연산이 진행된다. 이때는 4 x 4 특성맵이 산출된다. 

 

 

이것을 일반화하면 다음과 같은 공식이 만들어진다. 입력 이미지의 크기가 H x W이고, zero padding을 P만큼 해주고, 필터의 크기가 $F_H$ x $F_W$이고, 컨볼루션 보폭(stride)이 S라면, 특성맵의 높이와 너비는 각각

 

$Feature \: Map \: Height = \frac{H + 2P - F_H}{S} + 1$

 

$Feature \: Map \: Width = \frac{W + 2P - F_W}{S} + 1$

 

이 된다.

 

공식이 잘 작동하는지 확인해보자. 9 x 9 이미지에 zero padding을 1만큼 해주고, 필터의 크기가 5 x 5이고, 보폭이 1일 때 특성맵의 높이 및 너비는

 

(9 + 2 - 5)/1 + 1 = 6/1 + 1 = 7

 

이므로 위에서 구한 7 x 7과 동일하다. 또한 동일한 조건에 보폭만 2로 바꿨을 때 특성맵의 높이 및 너비는

 

(9 + 2 - 5)/2 + 1 = 6/2 + 1 = 4

 

이므로 위에서 구한 4 x 4와 동일하다. 공식이 잘 작동됨을 확인했다. 

 


 

오늘은 VGG-F, VGG-M, VGG-S의 구조에 대해서 살펴봤다. 다음에는 VGG16, VGG19에 대해서 포스팅하도록 하겠다. 여기까지 열심히 읽어준 분들께 감사의 말씀을 드립니다^^

 

 

<참고자료>

[1] http://taewan.kim/post/cnn/, TAEWAN.KIM 블로그, "CNN, Convolutional Neural Network 요약"

[2] http://www.vlfeat.org/matconvnet/models/imagenet-vgg-f.svg, VGG-F 상세 구조도

댓글()

동국대학교와 톈진대학교의 순위는?(2019년 QS 세계대학평가 기준)

삶과 여행 사이/일상|2019.06.26 01:14

동국대 졸업생들에게 보내는 메일에 다음과 같은 내용이 실려왔다. 

 

"동국대 2019년 QS 세계대학평가 454위, 국내 13위 기록."  

 

사실인가 싶어서 QS 세계대학평가 사이트에 들어가서 확인해봤다. 국내 13위? 내가 예전에 입학했을 때보다 동국대의 위상이 좀 더 높아진 것 같다. 

 

=> https://www.topuniversities.com/university-rankings/world-university-rankings/2019

 

QS World University Rankings 2019

Discover the world's top universities. Explore the QS World University Rankings® 2019. 1,000 of the world’s top universities are ranked in the table below, with Massachusetts Institute of Technology (MIT) topping the list for a record seventh consecutive y

www.topuniversities.com

 

위 사이트에서 동국대를 검색해서 나온 결과는 다음과 같다. 

동국대 2019년 QS 세계대학평가

 

학교 측의 이메일의 내용처럼 동국대의 전세계 순위는 454위였다. 아시아에서는 91위에 랭크되었다. 그러나 국내 순위는 15위로 이메일의 내용과는 살짝 차이가 있었다. 학교에서 보내는 공식적인 이메일에서 수작을 부린 것으로 생각하고 싶진 않다. 아마도 랭킹이 일정 기간 단위로 계속해서 갱신되는 것이 아닐까? 

 

내가 석사과정을 밟았고 또 현재 박사과정을 밟고 있는 톈진대학교는 2019년 기준 전세계에서 또한 중국에서 몇 위에 해당할까? 갑자기 궁금해졌다. QS 세계대학평가를 확인해봤다. 톈진대를 검색해서 나온 결과는 다음과 같다. 

 

톈진대 2019년 QS 세계대학평가

 

톈진대학교는 전세계에서 429위, 중국에서는 21위를 기록했다. 또한 위 그림에서는 안나왔지만 아시아에서는 83위를 기록했다. 

 

두 대학에 대한 평가를 요약하면 다음과 같다. 

 

전세계 454위의 동국대와 429위의 톈진대.  

아시아 91위의 동국대와 83위의 톈진대. 

research output 면에서 high 평가를 받은 동국대와 very high 평가를 받은 톈진대. 

 

이 지표에 의하면 동국대와 톈진대는 고만고만한 수준의 대학인 것 같다. 구지 따지자면 톈진대가 전반적으로 조금 더 나은 평가를 받고 있다. 

 

참고로 아시아 1위는 싱가폴국립대가 차지했고, 2위는 홍콩대, 공동 3위는 싱가폴난양기술대와 칭화대, 5위는 북경대가 차지했다. 국내 대학 중에서는 카이스트가 8위로 가장 높았고, 서울대가 10위로 그 다음을 차지했다. 동경대는 11위로 서울대보다 한 단계 낮았다(이것이 살짝 의외).

 

재미삼아 찾아봤다. 랭킹에 크게 의미두진 않는다.

부끄러워할 필요도 없고, 자만할 필요도 없는 수준의 대학에 다녔고, 다니고 있다는 사실을 확인했을 뿐이다.  

댓글()

[선형대수학] 가우스-요르단 소거법으로 n차 정방행렬의 역행렬 구하기

2차 정방행렬(정사각형행렬)의 역행렬을 구하는 법은 고등학교 수학과정을 배운 사람이라면 모두 다 알 것이다. 다음과 같은 2차 정방행렬이 있다.

 

$A = \begin{bmatrix}
1 & 2\\ 
3 & 4
\end{bmatrix}$

 

이 행렬의 역행렬은 다음과 같다. 

 

$A^{-1} = -\frac{1}{2}\begin{bmatrix}
4 & -2\\ 
-3 & 1
\end{bmatrix}$

 

방금 나는 아래 공식에 따라 역행렬을 구했다. 아마 익숙한 공식일 것이다. 

 

2차 정방행렬의 역행렬 구하는 공식

그런데 이 공식은 2차 정방행렬에만 적용될 수 있다. 만약 정방행렬의 차수가 3차, 4차,..., n차라면 역행렬을 어떤 방식으로 구할 수 있을까? 오늘은 바로 그에 대한 해결책에 대해 살펴보려고 한다. 

 

가우스-요르단 소거법으로 n차 정방행렬의 역행렬 구하기

가역(invertible)인 n차 정방행렬의 역행렬은 가우스-요르단 소거법으로 구할 수 있다. 가역이라는 것은 역행렬이 존재한다는 뜻이다. 가우스-요르단 소거법의 기본적인 아이디어는 다음과 같다.

 

"AX = I(항등행렬)라면 X는 A의 역행렬일 것이다. AX의 좌변을 IX로 바꿔주기 위해 기본행연산(elementary row operation)을 해주면, 그에 따라 우변도 바뀌게 될 것이고, 그 우변의 값이 바로 A의 역행렬을 의미하게 된다."

 

자, 이 말이 무슨 뜻인지 천천히 하나하나 살펴보자. 일단 기본행연산연립방정식의 해를 바꾸지 않으면서 행렬을 변형하는 방법들로 다음과 같은 것들을 포함한다.

 

1) 행렬의 한 행을 상수배한다.

2) 행렬의 두 행을 맞바꾼다.

3) 한 행을 상수배하여 다른 행에 더한다. 

 

여기서 행렬의 각 행은 각 일차방정식을 의미한다. 우리가 연립일차방정식의 해를 구할 때를 생각해보자. 해를 구하기 위해 어떤 일차방정식에는 상수배를 해주기도 하고, 또 상수배를 곱한 일차방정식을 또다른 일차방정식에서 더해주거나 빼주기도 한다. 그리고 각 일차방정식의 나열 순서는 계산 편의에 따라 바꿔주기도 한다. 이런 과정들을 해준다고 그 연립일차방정식의 해가 바뀌었던가? 그렇지 않았다. 해는 결국 동일했다. 

 

이러한 기본행연산을 행렬로 나타낸 것을 기본 행렬(elementary matrix)이라고 한다. 보통 E라고 표기한다.

 

우리는 $AX = I$의 좌변에 여러 개의 기본행렬을 곱해줘서 $AX$가 $IX$로 변하게 하고 싶다. 이것을 행렬의 곱으로 나타내면 다음과 같이 나타낼 수 있다.

 

$E_rE_{r-1}...E_2E_1AX = E_rE_{r-1}...E_2E_1I$

 

$IX = E_rE_{r-1}...E_2E_1I$

 

어떤 행렬에 항등행렬을 곱해주면 행렬 그 자신이 나오므로, 

 

$X = E_rE_{r-1}...E_2E_1$ 

 

이다. 따라서 A의 역행렬 $A^{-1}$은 $E_rE_{r-1}...E_2E_1$이다. X가 A의 역행렬이라고 위에서 언급했었다. 

 

가우스-요르단 소거법으로 3차 정방행렬의 역행렬 구하기 예제

아마 위 증명 과정이 막연하게 느껴지실 수도 있을 것 같다. 예제를 통해서 가우스-요르단 소거법을 좀 더 확실히 이해해보자. 다음과 같은 3차 정방행렬이 있다. 

 

$A = \begin{bmatrix}
2 & 1 & 1\\ 
4 & -6 & 0\\ 
-2 & 7 & 2
\end{bmatrix}$ 

 

가우스-요르단 소거법을 이용해서 A의 역행렬을 구해보자.

 

$AX = I$라면 X는 A의 역행렬일 것이다. 여기서 X와 I는 모두 3차 정방행렬이다. 기본행렬을 좌변과 우변의 왼쪽에 곱해주어 좌변의 A를 I로 바꿔줄 것이다. 그 결과 우리는 X, 즉 A의 역행렬을 알게 된다. 자, 이제 시작해보자. 

 

$AX = I$

 

$\begin{bmatrix}
2 & 1 & 1\\ 
4 & -6 & 0\\ 
-2 & 7 & 2
\end{bmatrix}X = \begin{bmatrix}
1 & 0 & 0\\ 
0 & 1 & 0\\ 
0 & 0 & 1
\end{bmatrix}$ 

 

먼저 A가 대각 성분 아래쪽이 모두 0인 상삼각행렬(upper triangular matrix)이 되도록 기본행연산을 해줄 것이다. 이를 위해 두번째 행과 세번째 행에서 첫번째 행의 상수배를 각각 빼준다.  

 

$\begin{bmatrix}
2 & 1 & 1\\ 
0 & -8 & -2\\ 
0 & 8 & 3
\end{bmatrix}X = \begin{bmatrix}
1 & 0 & 0\\ 
-2 & 1 & 0\\ 
1 & 0 & 1
\end{bmatrix}$

 

두번째 행에서는 첫번째 행을 2배한 것을 빼줬고, 세번째 행에서는 첫번째 행을 1배한 것을 더해줬다(-1배한 것을 빼줬다). 이번에는 세번째 행에서 두번째 행의 상수배를 빼준다. 

 

$\begin{bmatrix}
2 & 1 & 1\\ 
0 & -8 & -2\\ 
0 & 0 & 1
\end{bmatrix}X = \begin{bmatrix}
1 & 0 & 0\\ 
-2 & 1 & 0\\ 
-1 & 1 & 1
\end{bmatrix}$

 

세번째 행에서 두번째 행을 1배한 것을 더해줬다(-1배한 것을 빼줬다). A가 상삼각행렬로 변형되었다. pivot은 2, -8, 1인 것을 알 수 있다. 이제 상삼각행렬이 대각행렬(diagonal matrix)이 되도록 기본행연산을 해줄 것이다. 대각행렬이란 대각성분을 제외하고는 모든 성분이 0인 행렬을 의미한다. 첫번째 행과 두번째 행에서 세번째 행의 상수배를 빼서 각 행의 세번째 성분이 0이 되게 하자.  

 

$\begin{bmatrix}
2 & 1 & 0\\ 
0 & -8 & 0\\ 
0 & 0 & 1
\end{bmatrix}X = \begin{bmatrix}
2 & -1 & -1\\ 
-4 & 3 & 2\\ 
-1 & 1 & 1
\end{bmatrix}$

 

첫번째 행에서는 세번째 행을 1배한 것을 빼줬고, 두번째 행에서는 세번째 행을 2배한 것을 더해줬다(-2배한 것을 빼줬다). 이번에는 첫번째 행의 두번째 성분이 0이 되게 하기 위해서 첫번째 행에서 두번째 행의 상수배를 빼주자.

 

$\begin{bmatrix}
2 & 0 & 0\\ 
0 & -8 & 0\\ 
0 & 0 & 1
\end{bmatrix}X = \begin{bmatrix}
\frac{3}{2} & -\frac{5}{8} & -\frac{3}{4}\\ 
-4 & 3 & 2\\ 
-1 & 1 & 1
\end{bmatrix}$

 

첫번째 행에서 두번째 행을 1/8배 해준 것을 더해줬다(-1/8배 해준 것을 빼줬다). 그 결과 A가 대각행렬이 되었다. 이제 각 대각요소를 1로 만들어주자. 각 행을 적당한 상수를 곱해주면 된다. 첫번째 행은 1/2을 곱해주고, 두번째 행은 -1/8을 곱해주고, 세번째 행은 그대로 둔다(1로 곱해준다).

 

$\begin{bmatrix}
1 & 0 & 0\\ 
0 & 1 & 0\\ 
0 & 0 & 1
\end{bmatrix}X = \begin{bmatrix}
\frac{3}{4} & -\frac{5}{16} & -\frac{3}{8}\\ 
\frac{1}{2} & -\frac{3}{8} & -\frac{1}{4}\\ 
-1 & 1 & 1
\end{bmatrix}$  

 

여기서 X의 왼쪽이 항등행렬 $I$이므로, 

 

$X = \begin{bmatrix}
\frac{3}{4} & -\frac{5}{16} & -\frac{3}{8}\\ 
\frac{1}{2} & -\frac{3}{8} & -\frac{1}{4}\\ 
-1 & 1 & 1
\end{bmatrix}$

 

이다. 이 X가 바로 A의 역행렬이다. 

 

이 예제에서 우리는 3차 정방행렬의 역행렬을 구해봤는데, 4차, 5차,..., 100차 정방행렬의 역행렬도 동일한 방식으로 구할 수 있다. 이런 알고리즘을 개발해냈다는 것이 참 놀랍다.

 

 

<참고자료>

[1] 박부성 지음, "8일간의 선형대수학", 경문사

[2] Gilbert Strang 지음, "Linear algebra and its applications (제4판)", BROOKS/COLE CENGAGE Learning

댓글()