컨볼 루션 계층은 딥 러닝 신경망에서 어떻게 작동합니까?

트윗 공유 공유

최종 업데이트 : 2020 년 4 월 17 일

컨볼 루션 레이어는 컨볼 루션 신경망에서 사용되는 주요 빌딩 블록입니다.

컨볼 루션은 활성화를 초래하는 입력에 필터를 간단히 적용하는 것입니다. 동일한 필터를 입력에 반복적으로 적용하면 이미지와 같은 입력에서 감지 된 특징의 위치와 강도를 나타내는 기능 맵이라는 활성화 맵이 생성됩니다.

컨볼 루션 신경의 혁신 네트워크는 이미지 분류와 같은 특정 예측 모델링 문제의 제약 조건 하에서 훈련 데이터 세트와 관련된 많은 수의 필터를 병렬로 자동으로 학습하는 기능입니다. 그 결과 입력 이미지 어디에서나 감지 할 수있는 매우 구체적인 기능이 있습니다.

이 자습서에서는 컨볼 루션 신경망에서 컨볼 루션이 어떻게 작동하는지 알아 봅니다.

이 자습서를 완료 한 후 알 수 있습니다.

  • 컨볼 루션 신경망은 입력에 필터를 적용하여 입력에서 감지 된 특징의 존재를 요약하는 특징 맵을 만듭니다.
  • 필터는 손으로 만들 수 있습니다. , 예를 들어, 컨볼 루션 신경망의 혁신은 특정 예측 문제의 맥락에서 학습하는 동안 필터를 학습하는 것입니다.
  • 1 차원 및 2 차원 컨볼 루션의 특성 맵을 계산하는 방법 컨볼 루션 신경망의 레이어.

단계별 자습서 및 모든 예제에 대한 Python 소스 코드 파일을 포함하여 저의 새 저서 Deep Learning for Computer Vision으로 프로젝트를 시작하십시오.

시작하겠습니다.

부드러움 딥 러닝 신경망을위한 컨볼 루션 레이어 소개
사진 : mendhak, 일부 권리 보유.

튜토리얼 개요

이 튜토리얼은 네 부분으로 나뉩니다. 다음과 같습니다.

  1. 컨볼 루션 신경망의 컨볼 루션
  2. 컴퓨터 비전의 컨볼 루션
  3. 학습 된 필터의 힘
  4. 컨볼 루션 레이어

컴퓨터 비전을위한 딥 러닝으로 결과를 원하십니까?

지금 무료 7 일 이메일 집중 강좌 (샘플 코드 포함).

등록을 클릭하고 강좌의 무료 PDF Ebook 버전을 받으세요.

무료 미니 다운로드- 코스

컨볼 루션 신경망의 컨볼 루션

컨볼 루션 신경망 또는 줄여서 CNN은 다음과 같습니다. 1 차원 및 3 차원 데이터와 함께 사용할 수 있지만 2 차원 이미지 데이터로 작업하도록 설계된 특수 유형의 신경망 모델입니다.

컨볼 루션 신경망의 중심은 다음과 같은 컨볼 루션 계층입니다. 네트워크에 이름을 제공합니다. 이 계층은 “컨볼 루션”이라고하는 연산을 수행합니다.

컨볼 루션 신경망의 맥락에서 컨볼 루션은 기존 방식처럼 가중치 집합과 입력 값을 곱하는 선형 연산입니다. 신경망. 이 기술이 2 차원 입력 용으로 설계 되었기 때문에 입력 데이터 배열과 필터 또는 커널이라고하는 2 차원 가중치 배열간에 곱셈이 수행됩니다.

필터는 다음보다 작습니다. 입력 데이터와 입력의 필터 크기 패치와 필터 사이에 적용된 곱셈 유형은 내적입니다. 내적은 입력과 필터의 필터 크기 패치 사이의 요소 별 곱셈이며, 그런 다음 합산되어 항상 단일 값이됩니다. 결과적으로 단일 값이 생성되기 때문에 연산은 종종 “스칼라 곱”이라고합니다.

입력보다 작은 필터를 사용하면 동일한 필터 (가중치 집합)가 입력의 다른 지점에서 입력 배열을 여러 번 곱합니다. 특히, 필터는 왼쪽에서 오른쪽, 위에서 아래로 입력 데이터의 각 겹치는 부분 또는 필터 크기 패치에 체계적으로 적용됩니다.

이미지에 동일한 필터를 체계적으로 적용하는 것은 강력한 아이디어입니다. . 필터가 입력에서 특정 유형의 특징을 감지하도록 설계된 경우 전체 입력 이미지에 대해 해당 필터를 체계적으로 적용하면 필터가 이미지의 어느 위치에서나 해당 특징을 발견 할 수 있습니다. 이 기능을 일반적으로 번역 불변이라고합니다. 지형지 물이있는 위치보다는 존재하는지 여부에 대한 일반적인 관심입니다.

지역 번역에 대한 불변성은 우리가 더 관심이 있다면 매우 유용한 속성이 될 수 있습니다. 어떤 기능이 정확히 어디에 있는지 여부.예를 들어, 이미지에 얼굴이 포함되어 있는지 여부를 판단 할 때 픽셀 단위의 정확도로 눈의 위치를 알 필요가 없습니다. 얼굴의 왼쪽에 눈이 있고 오른쪽에 눈이 있다는 것만 알면됩니다. 얼굴의 측면.

— Page 342, Deep Learning, 2016.

필터와 입력 배열을 곱한 결과 한 번은 단일 값입니다. 필터가 입력 배열에 여러 번 적용되면 결과는 입력 필터링을 나타내는 2 차원 출력 값 배열입니다. 따라서이 작업의 2 차원 출력 배열을 “특징 맵”이라고합니다.

특징 맵이 생성되면 특성 맵의 각 값을 다음과 같은 비선형 성을 통해 전달할 수 있습니다. ReLU는 완전히 연결된 레이어의 출력과 매우 유사합니다.

필터의 예 특징 맵을 생성하기 위해 2 차원 입력에 적용

디지털 신호 처리 분야 또는 관련 수학 분야에서 온 경우 매트릭스의 컨볼 루션 연산을 다른 것으로 이해할 수 있습니다. . 특히 필터 (커널)는 입력에 적용되기 전에 뒤집 힙니다. 기술적으로 컨볼 루션 신경망 사용에 설명 된 컨볼 루션은 실제로 “교차 상관”입니다. 그럼에도 불구하고 딥 러닝에서는 “컨볼 루션”연산이라고합니다.

많은 머신 러닝 라이브러리가 상호 상관을 구현하지만이를 컨볼 루션이라고합니다.

— 페이지 333, Deep Learning, 2016.

요약하면 픽셀 값의 이미지와 같은 입력이 있고 가중치 집합 인 필터가 있으며 필터가 입력 데이터에 체계적으로 적용되어 특성 맵을 생성합니다. .

컴퓨터 비전의 컨볼 루션

컨볼 루션 연산을 이미지 데이터에 적용하는 아이디어는 컨볼 루션 신경망에만 새롭거나 고유하지 않습니다. 이것은 컴퓨터 비전에서 사용되는 일반적인 기술입니다.

역사적으로 필터는 컴퓨터 비전 전문가가 수작업으로 디자인 한 다음 이미지에 적용하여 기능 맵을 생성하거나 필터를 적용하여 출력 한 다음 어떤 식 으로든 이미지 분석이 더 쉽습니다.

예를 들어, 아래는 수직선을 감지하기 위해 수작업으로 제작 된 3×3 요소 필터입니다.

1
2
3

0.0, 1.0, 0.0
0.0, 1.0, 0.0
0.0, 1.0, 0.0

이 필터를 이미지는 수직선 만 포함하는 기능 맵을 생성합니다. 수직선 감지기입니다.

필터의 가중치 값에서이를 확인할 수 있습니다. 중앙 수직선의 모든 픽셀 값은 긍정적으로 활성화되고 양쪽의 모든 픽셀 값은 부정적으로 활성화됩니다. 이 필터를 이미지의 픽셀 값간에 체계적으로 드래그하면 수직선 픽셀 만 강조 표시 될 수 있습니다.

수평선 감지기를 만들어 이미지에 적용 할 수도 있습니다. 예 :

1
2
3

0.0, 0.0, 0.0
1.0, 1.0, 1.0
0.0, 0.0, 0.0

두 필터의 결과 결합, 예 : 두 기능 맵을 결합하면 이미지의 모든 선이 강조 표시됩니다.

이미지의 다른 기능을 감지하도록 수십 또는 수백 개의 다른 작은 필터 모음을 설계 할 수 있습니다.

신경망에서 컨볼 루션 연산을 사용하는 혁신은 필터의 값이 네트워크 학습 중에 학습되는 가중치라는 것입니다.

네트워크는 어떤 유형의 특성을 학습할지 학습합니다. 입력에서 추출하십시오. 특히 확률 적 경사 하강 법 하에서 훈련하는 경우 네트워크는 네트워크가 해결하도록 훈련되는 특정 작업에 대한 손실을 최소화하는 이미지에서 특징을 추출하는 방법을 학습해야합니다. 이미지를 개 또는 고양이로 분류하는 데 가장 유용한 특징을 추출합니다.

이 맥락에서 이것이 강력한 아이디어임을 알 수 있습니다.

학습 된 필터의 힘

기계 학습 작업에 특정한 단일 필터를 학습하는 것은 강력한 기술입니다.

그러나 컨볼 루션 신경망은 실제로 훨씬 더 많은 것을 달성합니다. .

다중 필터

컨볼 루션 신경망은 단일 필터를 학습하지 않습니다. 실제로 그들은 주어진 입력에 대해 병렬로 여러 기능을 학습합니다.

예를 들어, 컨볼 루션 계층이 주어진 입력에 대해 병렬로 32 ~ 512 개의 필터를 학습하는 것이 일반적입니다.

이는 모델 32 또는 심지어 512 개, 입력에서 특징을 추출하는 다양한 방법, 또는 “보는 법을 배우는”방법과 훈련 후 입력 데이터를 “보는”방법의 다양한 방법을 제공합니다.

이 다양성은 전문화를 허용합니다. 선뿐만 아니라 특정 훈련 데이터에 표시되는 특정 선입니다.

다중 채널

색상 이미지에는 일반적으로 빨강, 녹색, 및 파란색입니다.

데이터 관점에서 보면 모델에 입력으로 제공되는 단일 이미지는 사실 3 개의 이미지라는 것을 의미합니다.

필터는 항상 동일한 숫자를 가져야합니다. “깊이”라고도하는 입력으로 채널 수. 입력 이미지에 3 개의 채널 (예 : 깊이 3)이있는 경우 해당 이미지에 적용된 필터에도 3 개의 채널 (예 : 깊이 3)이 있어야합니다. 이 경우 3×3 필터는 실제로 3x3x3 또는 행, 열 및 깊이에 대한 것입니다. 입력의 깊이와 필터의 깊이에 관계없이 필터는 내적 연산을 사용하여 입력에 적용되며 결과적으로 단일 값이됩니다.

즉, 컨볼 루션 레이어에 32 개의 필터가있는 경우 이 32 개의 필터는 2 차원 이미지 입력을위한 2 차원 일뿐만 아니라 3 차원이며, 3 개 채널 각각에 대한 특정 필터 가중치를가집니다. 그러나 각 필터는 단일 기능 맵을 생성합니다. 즉, 32 개의 필터가있는 컨벌루션 레이어를 적용한 출력의 깊이는 생성 된 32 개의 피처 맵에 대해 32입니다.

다중 레이어

컨볼 루션 레이어는 입력 데이터에만 적용되지 않습니다. , 예 : 원시 픽셀 값이지만 다른 레이어의 출력에도 적용 할 수 있습니다.

컨볼 루션 레이어를 쌓으면 입력의 계층 적 분해가 가능합니다.

작동하는 필터를 고려하세요. 원시 픽셀 값에서 직접 선과 같은 저수준 특징을 추출하는 방법을 배웁니다.

첫 번째 선 레이어의 출력에 대해 작동하는 필터는 저수준 특징의 조합 인 특징을 추출 할 수 있습니다. 모양을 표현하기 위해 여러 선을 구성하는 기능 등입니다.

이 과정은 매우 깊은 층이 얼굴, 동물, 집 등을 추출 할 때까지 계속됩니다.

이것이 바로 우리가 보는 것과 같습니다. 실제로. 네트워크의 깊이가 증가함에 따라 기능을 고차 및 고차로 추상화합니다.

컨볼 루션 레이어의 작업 된 예

Keras 딥 러닝 라이브러리는 컨볼 루션 레이어 모음을 제공합니다.

인위적인 데이터와 직접 만든 필터를 사용하여 작업 한 몇 가지 예제를 살펴보면 컨볼 루션 연산을 더 잘 이해할 수 있습니다.

이 섹션에서는 1 차원 컨볼 루션 레이어와 컨볼 루션 연산을 구체적으로 만들고 Keras 레이어를 사용하는 실제 예제를 제공하는 2 차원 컨볼 루션 레이어 예제입니다.

1D 컨볼 루션 레이어 예제

우리는 1 차원 컨볼 루션 레이어를 정의 할 수 있습니다. 값이 모두 0.0이고 중간에 값이 1.0 인 두 요소 범프가있는 8 개의 요소가있는 차원 입력.

1

Keras에 대한 입력은 1D 컨벌루션 레이어의 경우 3 차원이어야합니다.

첫 번째 차원은 각 입력 샘플을 참조합니다. 이 경우 샘플은 하나뿐입니다. 두 번째 차원은 각 샘플의 길이를 나타냅니다. 이 경우 길이는 8입니다. 세 번째 차원은 각 샘플의 채널 수를 나타냅니다. 이 경우에는 채널이 하나뿐입니다.

따라서 입력 배열의 모양은.

1
2
3

# 정의 입력 데이터
data = asarray ()
data = data.reshape (1, 8, 1)

입력 샘플이 모양을 가질 것으로 예상하는 모델을 정의합니다.

모델에는 다음과 같은 단일 필터가 있습니다. 3 개 또는 3 개 요소 너비의 모양입니다. Keras는 필터의 모양을 kernel_size라고합니다.

1
2
3

# 모델 생성
model = Sequential ()
model.add (Conv1D (1, 3, input_shape = (8, 1)))

기본적으로 컨볼 루션 레이어의 필터는 초기화됩니다. 임의의 가중치로. 이 인위적인 예에서는 단일 필터에 대한 가중치를 수동으로 지정합니다. 입력 예제에서 정의한 것처럼 범프를 감지 할 수있는 필터, 즉 낮은 입력 값으로 둘러싸인 높은 입력 값을 정의합니다.

정의 할 세 가지 요소 필터는 다음과 같습니다.

1

컨볼 루션 레이어에는 가중치를 0으로 설정해야하는 바이어스 입력 값도 있습니다.

따라서, 다음과 같이 1 차원 컨볼 루션 레이어의 가중치에 직접 만든 필터를 사용하도록 강제 할 수 있습니다.

가중치는 다음에서 지정해야합니다. 행, 열 및 채널 측면에서 3 차원 구조. 필터에는 행 1 개, 열 3 개, 채널 1 개가 있습니다.

가중치를 검색하고 올바르게 설정되었는지 확인할 수 있습니다.

1
2

# 저장되었는지 확인
print (model.get_weights ())

마지막으로 입력 데이터에 단일 필터를 적용 할 수 있습니다.

모델에서 predict () 함수를 호출하여이를 달성 할 수 있습니다. 이렇게하면 특성 맵이 직접 반환됩니다. 즉, 입력 시퀀스 전체에 걸쳐 체계적으로 필터를 적용한 결과입니다.

1
2
3

# 입력 데이터에 필터 적용
yhat = model.predict (data)
print (yhat )

이 모든 것을 결합하면 완전한 예는 다음과 같습니다. 아래에 나열되어 있습니다.

예제를 먼저 실행하면 네트워크의 가중치가 인쇄됩니다. 그것은 우리의 손으로 만든 필터가 우리가 예상 한대로 모델에 설정되었음을 확인하는 것입니다.

다음으로, 필터는 입력 패턴에 적용되고 피처 맵이 계산되어 표시됩니다. 기능 맵의 값에서 범프가 올바르게 감지되었음을 알 수 있습니다.

1
2
3
4
5
6
7
8
9
10

],
],
]], dtype = float32), array (, dtype = float32)]
]]

여기서 무슨 일이 일어 났는지 자세히 살펴 보겠습니다.

입력은 값이있는 8 개 요소 벡터 :.

먼저, 3 개 요소 필터가 입력의 처음 3 개 입력에 적용되었습니다. 내적 ( “.”연산자)을 계산하여 입력하면 기능 맵에서 단일 출력 값이 0이됩니다.

1
2

from numpy import asarray
print (asarray (). dot (asarray ()))

수동 예제에서 이것은 다음과 같습니다.

1

= 0

그런 다음 필터가 입력 시퀀스와 프로세스가 반복되었습니다. 특히, 색인 1, 2, 3의 입력 시퀀스에 동일한 필터가 적용되어 기능 맵에서 출력이 0이되었습니다.

1

= 0

우리는 체계적입니다. 필터는 입력의 하나 이상의 요소를 따라 이동되고 인덱스 2, 3 및 4의 입력에 적용됩니다. 이번에는 출력이 기능 맵에서 1의 값입니다. 기능을 감지하고 적절히 활성화했습니다.

1

= 1

전체를 계산할 때까지 프로세스가 반복됩니다. 기능 맵.

1

특징 맵에는 6 개의 요소가 있지만 입력에는 8 개의 요소가 있습니다. 이것은 필터가 입력 시퀀스에 적용된 방식의 인공물입니다. 패딩과 같이 결과 특성 맵의 모양을 변경하는 입력 시퀀스에 필터를 적용하는 다른 방법이 있지만이 게시물에서는 이러한 방법에 대해 설명하지 않습니다.

다른 방법으로이를 상상할 수 있습니다. 입력 시퀀스에서 서로 다른 특징을 감지 할 필터의 가중치가 더 많거나 적은 특징을 감지 할 수 있습니다.

2D 컨볼 루션 레이어의 예

이전 섹션의 범프 감지 예를 2 차원 이미지의 수직선 감지기로 확장 할 수 있습니다.

다시 , 입력을 제한 할 수 있습니다.이 경우에는 중앙에 단일 수직선이있는 단일 채널 (예 : 그레이 스케일)이있는 정사각형 8×8 픽셀 입력 이미지로 제한 할 수 있습니다.

1
2
3
4
5
6
7
8

Conv2D 레이어에 대한 입력은 4 차원이어야합니다.

첫 번째 차원은 샘플을 정의합니다. 이 경우 하나의 샘플 만 있습니다. 두 번째 차원은 행 수를 정의합니다. 이 경우 8 개입니다. 세 번째 차원은 열 수를 정의합니다.이 경우에는 다시 8 개, 마지막으로이 경우에는 채널 수가 1 개입니다.

따라서 입력은 4 차원 모양 또는이 모양이어야합니다. 예.

이전 섹션에서 Conv1D 예제에서했던 것처럼 단일 필터로 Conv2D를 정의합니다.

필터는 2 차원이며 모양이 3 인 정사각형입니다. × 3. 레이어는 입력 샘플이 또는 모양을 가질 것으로 예상합니다.

1
2
3

# 모델 생성
model = Sequential ()
model.add (Conv2D (1, (3,3), input_shape = (8, 8, 1)))

카테고리를 정의하겠습니다. 입력 데이터에서 단일 수직선을 감지하는 선 감지기 필터입니다.

필터는 다음과 같습니다.

1
2
3

0, 1, 0
0, 1, 0
0, 1, 0

다음과 같이 구현할 수 있습니다.

마지막으로 입력 이미지에 필터를 적용하면 입력 이미지에서 수직선 감지를 표시 할 것으로 예상되는 기능 맵이 생성됩니다.

1
2
# 입력 데이터에 필터 적용
yhat = model.predict (data)

특징지도 출력의 모양은 모양과 함께 4 차원이됩니다. 단일 배치를 수행하고 단일 필터 (필터 1 개와 입력 채널 1 개)가 있으므로 출력 형태는. 단일 기능 맵의 내용을 다음과 같이 예쁘게 인쇄 할 수 있습니다.

1
2
3

for r in range (yhat.shape) :
# 행의 각 열을 인쇄
print (for c in range ( yhat.shape)])

이 모든 것을 하나로 연결 , 전체 예가 아래에 나열되어 있습니다.

먼저 예제를 실행하면 수제 필터가 레이어 가중치에 올바르게 정의되었는지 확인합니다.

다음으로 계산 된 피쳐 맵이 인쇄됩니다. 실제로 필터가 기능 맵 중간에 강력한 활성화가있는 단일 수직선을 감지 한 숫자의 척도를 통해 알 수 있습니다.

계산 된 내용을 자세히 살펴 보겠습니다.

먼저 이미지의 왼쪽 상단 모서리 또는 3×3 요소의 이미지 패치에 필터를 적용했습니다. 기술적으로 이미지 패치는 단일 채널이있는 3 차원이며 필터의 크기는 동일합니다. dot () 함수를 사용하여 NumPy에서이를 구현할 수 없습니다. 대신 tensordot () 함수를 사용하여 모든 차원에서 적절하게 합산 할 수 있습니다. 예를 들면 다음과 같습니다.

이 계산은 단일 출력 값을 생성합니다 예를 들어, 기능이 감지되지 않았습니다. 이렇게하면 기능 맵의 왼쪽 상단 모서리에 첫 번째 요소가 표시됩니다.

수동으로 이것은 다음과 같습니다.

1
2
3

0, 1, 0 0, 0, 0
0, 1, 0. 0, 0, 0 = 0
0, 1, 0 0, 0, 0

필터가 왼쪽으로 한 열을 따라 이동하고 프로세스가 반복됩니다. 다시, 기능이 감지되지 않습니다.

1
2
3

0, 1, 0 0, 0, 1
0, 1, 0. 0, 0, 1 = 0
0, 1, 0 0, 0, 1

왼쪽으로 한 번 더 이동하여 다음 열로 이동하면 처음으로 기능이 감지되어 강력한 활성화가됩니다.

1
2
3

0, 1, 0 0, 1, 1
0, 1, 0. 0, 1, 1 = 3
0, 1, 0 0, 1, 1

이 프로세스는 필터의 가장자리가 입력 이미지의 가장자리 또는 마지막 열에 닿을 때까지 반복됩니다. 이렇게하면 기능 맵의 첫 번째 전체 행에있는 마지막 요소가 제공됩니다.

1

필터는 한 행 아래로 이동 한 다음 다시 첫 번째 열로 이동하고 프로세스는 기능 맵의 두 번째 행을 제공하기 위해 왼쪽에서 오른쪽으로 관련됩니다. 그리고 필터의 하단이 입력 이미지의 하단 또는 마지막 행에 놓일 때까지 계속합니다.

이전 섹션과 마찬가지로 피처 맵이 더 작은 6×6 행렬임을 알 수 있습니다. 필터를 입력 이미지에 적용 할 수있는 방법의 제한으로 인해 8×8 입력 이미지보다.

추가 읽기

이 섹션에서는 해당 주제에 대한 더 많은 리소스를 제공합니다. 자세히 알아보기

게시물

  • 기계 학습을위한 컨볼 루션 신경망 단기 집중 과정

  • 9 장 : 컨볼 루션 네트워크, 딥 러닝, 2016.
  • 5 장 : 컴퓨터 비전을위한 딥 러닝, Python을 사용한 딥 러닝, 2017.

API

  • Keras Convolutional Layers API
  • numpy.asarray API

요약

이 자습서에서 컨볼 루션이 컨볼 루션 신경망에서 작동하는 방식

구체적으로 배웠습니다.

  • 컨볼 루션 신경망이 입력에 필터를 적용합니다. 입력에서 감지 된 기능의 존재를 요약하는 기능 맵을 생성합니다.
  • 필터는 라인 감지기와 같이 수작업으로 만들 수 있지만 컨볼 루션 신경망의 혁신은 특정 예측 문제의 맥락에서 학습하는 동안 필터를 학습하는 것입니다.
  • 계산 방법 컨볼 루션 신경망의 1 차원 및 2 차원 컨볼 루션 레이어에 대한 기능 맵입니다.

궁금한 점이 있습니까?
아래 의견에 질문하면 제가 할 것입니다. 최선의 답변입니다.

오늘의 비전을위한 딥 러닝 모델을 개발하세요!

단 몇 줄의 Python 코드로 몇 분 만에 자신 만의 비전 모델 개발

… 방법 알아보기 내 새 Ebook :
컴퓨터 비전을위한 딥 러닝

분류, 물체 감지 (yolo 및 rcnn), 얼굴 인식 (vggface 및 facenet)과 같은 주제에 대한자가 학습 자습서를 제공합니다. , 데이터 준비 및 기타 …

마지막으로 비전 프로젝트에 딥 러닝 도입

학문을 건너 뛰십시오. 결과 만.

내용보기

트윗 공유 공유

Leave a Reply

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다