본문 바로가기
Artificial Intelligence/Keras

[Tensorflow 2][Keras] Week 1 - Siamese Network

by 개발자J의일상 2021. 3. 13.
반응형

본 포스팅은 다음 과정을 정리 한 글입니다.

 

Custom Models, Layers, and Loss Functions with TensorFlow

www.coursera.org/specializations/tensorflow-advanced-techniques

 

Siamese network: a Multiple-Input model, References about the Siamese network, Coding a Multi-Input Siamese network, Reference "The distance between two vectors", Siamese network code walkthrough, Siamese network

 

이전 시간 포스팅이 보고 싶으시면 아래 링크를 클릭해 주시기 바랍니다.

 

2021/03/08 - [Artificial Intelligence/Keras] - [Tensorflow 2][Keras] Week 1 - Creating a Multi-Output Architecture

 

[Tensorflow 2][Keras] Week 1 - Creating a Multi-Output Architecture

본 포스팅은 다음 과정을 정리 한 글입니다. Custom Models, Layers, and Loss Functions with TensorFlow www.coursera.org/specializations/tensorflow-advanced-techniques TensorFlow: Advanced Techniques de..

mypark.tistory.com

지난시간에는 Functional API를 사용하여 서로 다른 여러개의 output 레이어에서 예측 된 값이 있는 모델을 정의하였고, 다중 출력 모델의 예를 보았습니다.

 

이번시간에는 두 개의 입력이 있는 네트워크, Siamese network라고 하는 특정 유형의 기계학습 구조에 대해 살펴보겠습니다. 

Siamese network는 아래와 같습니다. Image A, Image B 두 개의 입력이 있으며, 동일한 기본 신경망 아키텍쳐를 가진 두개의 하위 네트워크로 처리됩니다. 네트워크의 출력 Vector A, Vector B간의 유클리드 거리(Euclidean Distance)를 측정하여 이 두 입력이 얼마나 유사한지, 다른지를 예측할 수 있습니다.

이 경우에 Fashion-MNIST의 이미지를 Input으로 사용합니다. 

 

하나의 이미지를 네트워크의 한쪽에 전달하고 다른 이미지를 네트워크의 다른 쪽에 전달하면, 각 서브 네트워크가 각 입력 이미지를 대표하는 벡터를 출력합니다.

 

 

그런 다음 유클리드 거리라고하는 수학적 연산을 사용하여 이 두 출력 벡터 간의 차이를 계산하여 유사한 지 여부를 알 수 있습니다.

모델을 학습 할 때 이미지 쌍이 같은지 다른지 여부를 지정하는 Y레이블을 제공하면 모델이 학습을 진행합니다.

 

 

이 구조는 여러 다른 논문에서 나왔으며 여기에서 그 중 일부를 언급했습니다.

 

 

Fashion-MNIST는 많은 데이터를 제공하지만 쌍으로 되어 있지 않습니다. 전처리 하는 코드를 작성하여 쌍으로 데이터들을 정리한 다음 해당 쌍이 유사한지, 아닌지에 대해 레이블을 지정해야 합니다. 

왼쪽에 있는 이미지 쌍은 동일하게 셔츠이기 때문에 레이블을 1로 지정하고 오른쪽의 이미지 쌍은 서로 다른 것이기 때문에 0으로 표시합니다. 

 

 

Siamese 네트워크 아키텍처를 다시보면 Neural Network 아키텍처의 이 두 부분이 동일한 구조와 동일한 가중치로 동일하다는 것을 알 수 있습니다. 이제 이 Neural Network => base network를 functional API를 통해 만들어 보겠습니다.

 

MNIST데이터를 사용하여 아래와 같이 간단한 deep neural network를 구성합니다. functional API를 사용하여 python 함수(def)안에 Model을 정의 합니다. 이 함수는 model을 리턴합니다. 이 것을 나중에 사용할 것입니다.

 

 

전체 아키텍처를 그리면 레이어들은 아래와 같습니다. 

이제 우리는 base network를 가지게 되었고 (initialize_base_network : 위에서 정의한 Model) 이 base network를 두 input layer에 사용할 것입니다. 

먼저 initialize_base_network 함수를 호출하여 model을 return받아 base_network에 대입하고 

 

28x28 size의 Input layer을 선언하여 base_network 다음에 오게 지정합니다.

 

 

다른 Input에 대해서도 똑같이 28x28사이즈인 Input layer를 정의하고 base_network에 연결해줍니다.

 

 

아래 그림은 위에서 정의한 코드를 그림으로 보여줍니다. 두개의 InputLayer와 base model로 구성되어 있는 것을 볼 수 있습니다.

 

model_15이라고 이름이 되어있는 것이 바로 위에서 정의했던 base model입니다. 

 

이제는 network들의 output에 대해 살펴보겠습니다.

output vector들을 Euclidean Distance를 통해 비교하여 얼마나 유사한지를 결정합니다. 

 

Euclidean distance는 아래 사이트에서 잘 설명되어 있고, 수학적으로 다루고 넘어가지는 않겠습니다.

또한 아래 euclidean distance를 구하는 파이썬 코드가 있습니다. 

 

우리는 Lambda Layer를 사용하여 euclidean distance function을호출 할 수 있습니다.

Lambda Layer와 Tensorflow는 커스텀 코드를 코딩할 수 있는 기능을 제공합니다. euclidean distance 예제에 딱 맞는 기능입니다. 여전히 Functional API 구문을 사용하여 vector_output_a와 b를 연결하고 있습니다.

 

마지막으로 Model을 정의해 보겠습니다. Model object에 inputs과 outputs을 넣어주는데 inputs은 앞에서 만들었던 MNIST 28x28 input_a,b이고 outputs는 위에서 정의한 Lambda layer의 output입니다. 

 

이제 아키텍처는 아래와 같습니다. base model이후에 Lambda layer가 오게 됩니다. 

 

 

우리는 model을 compile하는데 loss로 contrastive_loss를 사용합니다. 아마 처음 들어보시는 분도 계실텐데요.

이것은 custom loss function으로 이러한 시나리오를 위해 쓰여집니다. 

우리는 다음주에 custom loss function을 어떻게 만들고 사용하는지 배울 예정 이기 때문에 걱정 안하셔도 될 것 같습니다. 지금은 그냥 이 것이 어떻게 동작하는지 몰라도 상관 없습니다. 

 

이제 네트워크 훈련을 시작합니다. model.fit의 매개변수로 어떤 값을 주는지에 주목해야 합니다.

Training 데이터는 유사성을 나타내는 레이블과, 이미지 쌍으로 이루어집니다. tr_pairs[:,0]는 첫 번째 항목을 가져와서 네트워크의 왼쪽으로 공급하고 tr_pairs[:,1]는 쌍의 두 번째 항목을 가져와서 오른쪽으로 공급합니다. tr_y는 레이블을 포함하며, 다른 쌍이면 0이고 유사한 쌍이면 1입니다. 

 

 

여기에서 두 쌍의 예를 볼 수 있습니다. 왼쪽에는 두 개의 티셔츠가 있고 tr_y는 1로 두개가 유사한 것으로 분류 되었고, 오른쪽에는 티셔츠와 재킷이 있습니다. 두 개는 다르기 때문에 tr_y는 0으로 표시됩니다.

 

 

일단 모델 학습이 완료되면 이미지 쌍을 모델에 넣으면 아웃풋으로 유사한지 안한지의 값을 얻을 수 있습니다. 거리 점수가 낮을수록 두 항목이 유사하다고 볼 수 있고 거리 점수가 높을 수록 두 항목이 서로 다르다고 볼 수 있습니다.

예를 들어, 맨 왼쪽에 티셔츠는 비슷하게 생겼고 거리 점수 0.17을 얻었습니다. 왼쪽에서 세 번째는 바지와 재킷으로 서로 다르기 때문에 1.26을 얻었습니다. 

유클리디안 거리(Euclidean Distance)

mathonline.wikidot.com/the-distance-between-two-vectors

 

The Distance Between Two Vectors - Mathonline

The Distance Between Two Vectors The Distance Between Two Vectors Sometimes we will want to calculate the distance between two vectors or points. We will derive some special properties of distance in Euclidean n-space thusly. Given some vectors $\vec{u}, \

mathonline.wikidot.com

코드는 아래 블로그에 잘 설명이 되어 있으니 참고하시면 될 것 같습니다.


deepfusionai.github.io/blog/tf.keras/functional%20api/2020/12/17/siamese-network.html

 

Siamese network with Functional API

Build a model with more than one input using the Functional API.

deepfusionai.github.io

감사합니다.

300x250

댓글