다운로드
작성자: admin 작성일시: 2019-01-22 11:18:50 조회수: 1560 다운로드: 71
카테고리: 기타 태그목록:

Xception

Xception은 2016년에 논문을 통해 발표된 CNN 모델이다. Inception에 그 기초를 두고 있다. InceptionV1(GoogLeNet)에서 inception module을 이용하여 노드들 간의 연결을 줄이고자 했다는 것을 이전에 학습했다. Xception은 거기서 더 나아가 채널 간의 관계를 찾는 것과 이미지의 지역 정보를 찾는 것을 완전히 분리하고자 했다.

그림 20.4.14 : extreme version of inception module

그러한 의도로 제안한 것이 그림에 묘사되는 "extreme version of inception module"이다. 그림의 연산은, 1x1 convolution 연산을 하고 결과 피쳐맵의 채널을 모두 별개로 3x3 convolution 연산 하는 것이다.

Depth-wise separable convolution

그림 20.4.15 : Depthwise separable convolution

실제로 Xception에서 사용하는 것은 이 연산을 수정하여 만든 Depth-wise-separable convolution이다. depth-wise separable convolution 연산은 각 채널 별로 convolution 연산을 시행하고 그 결과에 1x1 convolution 연산을 취하는 것이다. 기존의 convolution이 모든 채널과 지역 정보를 고려해서 하나의 feature map을 만들었다면, depthwise convolution은 각 채널 별로 feature map을 하나씩 만들고, 그 다음 1x1 convolution 연산을 수행하여 출력되는 피쳐맵 수를 조정한다. 이 때의 1x1 convolution 연산을 point-wise convolution이라 한다.

먼저, 말한 extream version of Inception과 다른 점은 연산의 순서와 중간 단계의 비선형 활성화함수의 유무이다. 실험을 통해 연산의 지역 정보와 채널 간의 상관관계를 연산하는 사이에 비선형함수가 있으면 성능이 크게 저하된다는 사실을 알게 되었다.

Xception의 구조

Xception

유형 입력 크기 출력 크기 커널 크기 횟수
입력 (299,299,3)
Conv (299,299,3) (149,149,32) (3,3)
Conv (149,149,32) (147,147,64) (3,3)
Separable Conv (147,147,64) (147,147,128)
Separable Conv (147,147,128) (147,147,128)
Maxpool (147,147,128) (74,74,128)
Add (74,74,128) (74,74,128)
Separable Conv (74,74,128) (74,74,256)
Separable Conv (74,74,256) (74,74,256)
Maxpool (74,74,256) (37,37,256)
Add ((37,37,256) (37,37,256)
Separable Conv (37,37,256) (37,37,728)
Separable Conv (37,37,728) (37,37,728)
Maxpool (37,37,728) (19,19,728)
Add (19,19,728) (19,19,728)
Separable $\times$3 + Add (19,19,728) (19,19,728) $\times$ 8
Separable Conv (19,19,256) (19,19,728)
Separable Conv (19,19,728) (19,19,1024)
Maxpool (19,19,1024) (10,10,1024)
Add (10,10,1024) (10,10,1024)
Separable Conv (10,10,1024) (10,10,1536)
Separable Conv (10,10,1536) (10,10,2048)
Average pool (10,10,1536) (2048,)
Dense (2048,) (1000)

Xception의 구조에는 Depth-wise convolution과 함께 ResNet의 skip connection 또한 적용하였다. skip connection은 Maxpooling 연산 다음에 위치해 있기 때문에 이전 입력에 대해 크기를 줄이는 연산을 취해야한다. Xception에서는 1x1 convolution의 스트라이드를 2로 설정하여 크기를 반으로 줄였다.

In [1]:
from keras.applications.xception import Xception, decode_predictions

xcep = Xception(input_shape=(299,299,3))
# xcep.summary()
Using TensorFlow backend.
In [2]:
import cv2
import time 


img = cv2.imread('bird1.jpg', -1)
img = cv2.resize(img, (299, 299))

start = time.time() 
yhat = xcep.predict(img.reshape(-1, 299, 299, 3))
time = time.time() - start
# label_key = np.argmax(yhat)
label = decode_predictions(yhat)
label = label[0][0]

print("테스트 시 소요 시간 : {}".format(time))
print('%s (%.2f%%)' % (label[1], label[2]*100))
img = img[:,:,::-1]
plt.figure(figsize=(11,11))
plt.imshow(img)
plt.axis("off")
plt.show()
테스트 시 소요 시간 : 0.7263011932373047
mixing_bowl (100.00%)

질문/덧글

사용자에 의해 삭제되었습니다. qasd*** 2019년 5월 30일 3:40 오후

사용자에 의해 삭제되었습니다.