keras 를 사용 하여 쌍둥이 네트워크 의 가중치 공유 튜 토리 얼 을 실현 합 니 다.

우선 여기 서 의 가중치 공 유 는 CNN 원리 에서 의 공유 가중치 가 아니 라 Siamese Network 와 같은 다 중 분기 네트워크 를 어떻게 구축 하고 분기 구 조 를 동시에 사용 하 는 지 를 말한다.
Functional API
상기 목적 을 달성 하기 위해 keras 의 Functional API 를 사용 하 는 것 을 권장 합 니 다.물론 Sequential 유형의 모델 도 사용 할 수 있 습 니 다.본 블 로 그 는 주로 Functional API 를 예 로 들 어 설명 할 것 입 니 다.
keras 의 다 분기 가중치 공유 기능 실현,공식 문서 소개
위 는 공식 링크 이 고 본 블 로그 도 상기 공식 문 서 를 바탕 으로 이 기능 을 실현 합 니 다.한 마디 삽입 합 니 다.keras 는 중국어 문서 가 있 지만 중국어 문 서 는 이미 변경 되 었 습 니 다.또한 중국어 문서 의 일부 함수 소개 가 완전 하지 않 으 므 로 영어 공식 문 서 를 직접 보 는 것 을 권장 합 니 다)
파 라 메 터 를 공유 하지 않 는 모델
MatchNet네트워크 구 조 를 예 로 들 어 쉽게 표시 하기 위해 볼 륨 모듈 개 수 를 2 개 로 줄 였 다.우선 완전한 네트워크 구 조 를 볼 수 있 도록 파 라 메 터 를 공유 하지 않 는 모델 을 보 여 준다.
전체적인 네트워크 구 조 는 다음 과 같다.
코드 는 두 부분 을 포함 하고 첫 번 째 부분 은 두 가지 함 수 를 정 의 했 습 니 다.FeatureNetwork()생 성 특징 추출 네트워크,ClassiFilerNet()생 성 결정 네트워크 또는 도량형 네트워크 라 고 합 니 다.네트워크 구조의 시각 화 는 블 로그 말미 에 있다.ClassiFilerNet()함수 에서 FeatureNetwork()함 수 를 두 번 호출 했 고 keras.models.Model 도 두 번 사용 되 었 기 때문에 생 성 된 input 1 과 input 2 는 완전히 독립 된 모델 분기 이 며 매개 변 수 는 공유 되 지 않 습 니 다.

from keras.models import Sequential
from keras.layers import merge, Conv2D, MaxPool2D, Activation, Dense, concatenate, Flatten
from keras.layers import Input
from keras.models import Model
from keras.utils import np_utils
import tensorflow as tf
import keras
from keras.datasets import mnist
import numpy as np
from keras.utils import np_utils
from keras.callbacks import EarlyStopping, ModelCheckpoint, TensorBoard, ReduceLROnPlateau
from keras.utils.vis_utils import plot_model

# ---------------------     -------------------------
def FeatureNetwork():
  """        """
  """    ,MNIST         ,         ,   Matchnet   feature network  """
  inp = Input(shape = (28, 28, 1), name='FeatureNet_ImageInput')
  models = Conv2D(filters=24, kernel_size=(3, 3), strides=1, padding='same')(inp)
  models = Activation('relu')(models)
  models = MaxPool2D(pool_size=(3, 3))(models)

  models = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding='same')(models)
  # models = MaxPool2D(pool_size=(3, 3), strides=(2, 2))(models)
  models = Activation('relu')(models)

  models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)
  models = Activation('relu')(models)

  models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)
  models = Activation('relu')(models)
  models = Flatten()(models)
  models = Dense(512)(models)
  models = Activation('relu')(models)
  model = Model(inputs=inp, outputs=models)
  return model

def ClassiFilerNet(): # add classifier Net
  """           ,  maychnet       ,        (  ),     +   (      )"""
  input1 = FeatureNetwork()           #             
  input2 = FeatureNetwork()           #              
  for layer in input2.layers:          #   for      ,         。
    layer.name = layer.name + str("_2")
  inp1 = input1.input
  inp2 = input2.input
  merge_layers = concatenate([input1.output, input2.output])    #     ,       sum,      
  fc1 = Dense(1024, activation='relu')(merge_layers)
  fc2 = Dense(1024, activation='relu')(fc1)
  fc3 = Dense(2, activation='softmax')(fc2)

  class_models = Model(inputs=[inp1, inp2], outputs=[fc3])
  return class_models

# ---------------------   -------------------------
matchnet = ClassiFilerNet()
matchnet.summary() #       
plot_model(matchnet, to_file='G:/csdn  /picture/model.png') #        png  
공유 매개 변수 모델
FeatureNetwork()의 기능 은 위의 기능 과 같 아서 선택 하기 편 하도록 ClassiFilerNet()함수 에 공유 매개 변수 모델 사용 여 부 를 판단 하 는 기능 을 추가 하여 reuse=True 를 공유 매개 변수 모델 로 사용 합 니 다.
관건 은 바로 모델 을 한 번 만 사용 한 다 는 것 이다.즉,모델 을 한 번 만 들 었 다 는 것 이다.두 개의 입력 을 입력 했 지만 사실은 같은 모델 을 사 용 했 기 때문에 가중치 공 유 된 것 이다.

from keras.models import Sequential
from keras.layers import merge, Conv2D, MaxPool2D, Activation, Dense, concatenate, Flatten
from keras.layers import Input
from keras.models import Model
from keras.utils import np_utils
import tensorflow as tf
import keras
from keras.datasets import mnist
import numpy as np
from keras.utils import np_utils
from keras.callbacks import EarlyStopping, ModelCheckpoint, TensorBoard, ReduceLROnPlateau
from keras.utils.vis_utils import plot_model

# ----------------     -----------------------
def FeatureNetwork():
  """        """
  """    ,MNIST         ,         ,   Matchnet   feature network  """
  inp = Input(shape = (28, 28, 1), name='FeatureNet_ImageInput')
  models = Conv2D(filters=24, kernel_size=(3, 3), strides=1, padding='same')(inp)
  models = Activation('relu')(models)
  models = MaxPool2D(pool_size=(3, 3))(models)

  models = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding='same')(models)
  # models = MaxPool2D(pool_size=(3, 3), strides=(2, 2))(models)
  models = Activation('relu')(models)

  models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)
  models = Activation('relu')(models)

  models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)
  models = Activation('relu')(models)

  # models = Conv2D(64, kernel_size=(3, 3), strides=2, padding='valid')(models)
  # models = Activation('relu')(models)
  # models = MaxPool2D(pool_size=(3, 3), strides=(2, 2))(models)
  models = Flatten()(models)
  models = Dense(512)(models)
  models = Activation('relu')(models)
  model = Model(inputs=inp, outputs=models)
  return model

def ClassiFilerNet(reuse=False): # add classifier Net
  """           ,  maychnet       ,        (  ),     +   (      )"""

  if reuse:
    inp = Input(shape=(28, 28, 1), name='FeatureNet_ImageInput')
    models = Conv2D(filters=24, kernel_size=(3, 3), strides=1, padding='same')(inp)
    models = Activation('relu')(models)
    models = MaxPool2D(pool_size=(3, 3))(models)

    models = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding='same')(models)
    # models = MaxPool2D(pool_size=(3, 3), strides=(2, 2))(models)
    models = Activation('relu')(models)

    models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)
    models = Activation('relu')(models)

    models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)
    models = Activation('relu')(models)

    # models = Conv2D(64, kernel_size=(3, 3), strides=2, padding='valid')(models)
    # models = Activation('relu')(models)
    # models = MaxPool2D(pool_size=(3, 3), strides=(2, 2))(models)
    models = Flatten()(models)
    models = Dense(512)(models)
    models = Activation('relu')(models)
    model = Model(inputs=inp, outputs=models)

    inp1 = Input(shape=(28, 28, 1)) #     
    inp2 = Input(shape=(28, 28, 1)) #     2
    model_1 = model(inp1) #               
    model_2 = model(inp2) #                
    merge_layers = concatenate([model_1, model_2]) #     ,       sum,      

  else:
    input1 = FeatureNetwork()           #             
    input2 = FeatureNetwork()           #              
    for layer in input2.layers:          #   for      ,         。
      layer.name = layer.name + str("_2")
    inp1 = input1.input
    inp2 = input2.input
    merge_layers = concatenate([input1.output, input2.output])    #     ,       sum,      
  fc1 = Dense(1024, activation='relu')(merge_layers)
  fc2 = Dense(1024, activation='relu')(fc1)
  fc3 = Dense(2, activation='softmax')(fc2)

  class_models = Model(inputs=[inp1, inp2], outputs=[fc3])
  return class_models
어떻게 보면 정말 가중치 공유 일 까?특징 추출 부분의 네트워크 매개 변수 개 수 를 직접 비교 합 니 다!
공유 하지 않 는 매개 변수 모델 의 매개 변수 수:

공유 매개 변수 모델 의 매개 변수 총량

공유 매개 변수 모델 의 특징 추출 부분의 매개 변 수 는 다음 과 같 습 니 다.

캡 처 제한 으로 인해 공유 되 지 않 는 매개 변수 모델 의 특징 추출 네트워크 매개 변수 수량 은 더 이상 표시 되 지 않 습 니 다.사실은 계산 을 통 해 네트워크 부분의 매개 변수 수량 을 추출 하고 매개 변수 모델 을 공유 하지 않 는 것 이 공유 매개 변수의 두 배 이다.두 네트워크 총 참 수량의 차 이 는 공유 모델 에서 특징 추출 부분의 매개 변수의 양 이다.
네트워크 구조 시각 화
공유 되 지 않 는 가중치 의 네트워크 구조

공유 매개 변수의 네트워크 구조,그 중 모델1 대표 적 인 것 은 특징 추출 부분 이다.

이상 은 keras 를 사용 하여 쌍둥이 네트워크 의 가중치 공유 튜 토리 얼 을 실현 하 는 것 이 바로 편집장 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 시 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기