Keras에서 두 가지 모델 병합


25

두 Keras 모델을 단일 모델로 병합하려고 하는데이 작업을 수행 할 수 없습니다.

예를 들어 첨부 된 그림에서 치수 8 의 중간 레이어 를 가져 와서 모델 B 의 레이어 B 1 (차원 8의 입력)에 대한 입력으로 사용 하고 모델 A 와 모델 B 를 모두 단일 모델.A2B1BAB

기능 모듈을 사용하여 모델 와 모델 B를 독립적 으로 작성하고 있습니다 . 이 작업을 어떻게 수행 할 수 있습니까?AB

참고 : 은 모델 A 의 입력 레이어 이고 B 1 은 모델 B 의 입력 레이어 입니다.A1AB1B

그림을보십시오

답변:


22

내 질문에 대한 답변을 찾았으며 위의 답변을 기반으로하는 코드가 있습니다.

from keras.layers import Input, Dense
from keras.models import Model
from keras.utils import plot_model

A1 = Input(shape=(30,),name='A1')
A2 = Dense(8, activation='relu',name='A2')(A1)
A3 = Dense(30, activation='relu',name='A3')(A2)

B2 = Dense(40, activation='relu',name='B2')(A2)
B3 = Dense(30, activation='relu',name='B3')(B2)

merged = Model(inputs=[A1],outputs=[A3,B3])
plot_model(merged,to_file='demo.png',show_shapes=True)

그리고 내가 원하는 출력 구조는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


위의 두 가지 모델 (케 라스 모델의 의미로)을 병합 하지 않고 레이어를 병합합니다.
gented

7

Keras에는 함수형 API를 사용하여 모델을 정의하는 유용한 방법이 있습니다. 기능적 API를 사용하면 계층의 비순환 비순환 그래프를 정의하여 완전히 임의의 아키텍처를 구축 할 수 있습니다. 귀하의 예를 고려할 때 :

#A_data = np.zeros((1,30))
#A_labels = np.zeros((1,30))
#B_labels =np.zeros((1,30))

A1 = layers.Input(shape=(30,), name='A_input')
A2 = layers.Dense(8, activation='???')(A1)
A3 = layers.Dense(30, activation='???', name='A_output')(A2)


B2 = layers.Dense(40, activation='???')(A2)
B3 = layers.Dense(30, activation='???', name='B_output')(B2)

## define A
A = models.Model(inputs=A1, outputs=A3)

## define B
B = models.Model(inputs=A1, outputs=B3) 

B.compile(optimizer='??',
          loss={'B_output': '??'}
          )

B.fit({'A_input': A_data},
  {'B_output': B_labels},
  epochs=??, batch_size=??)

그게 다야! 결과는 다음과 B.summary()같습니다 . :

Layer (type)                 Output Shape              Param    
A_input (InputLayer)         (None, 30)                0         
_________________________________________________________________
dense_8 (Dense)              (None, 8)                 248     
______________________________________________________________
dense_9 (Dense)              (None, 40)                360       
_________________________________________________________________
B_output (Dense)             (None, 30)                1230      

답변 주셔서 감사하지만 위의 코드가 작동한다고 생각하지 않습니다. 먼저, B = models.Model (inputs = A2, outputs = B3)이라고하면 오류 TypeError : 입력 레이어 ModelInputLayer객체 여야 합니다. 수신 된 입력 : Tensor. 또한 앞에서 언급했듯이 기능 API를 사용하여 모델 A와 모델 B를 개별적으로 만들었습니다. 필자가 찾고있는 대답은 연결 기능을 사용하는 keras 설명서의 "다중 입력 및 다중 출력 모델"섹션과 관련이 있다고 생각합니다.
Rkz

@Rkz : 답을 편집했습니다. 지금 작동합니다. "연결"을 사용해야합니다. 실제로 모델 "B"를 정의하려는 경우 기본 입력 (A1)을 언급해야합니다.
moh

시간을 내 주셔서 감사합니다. Keras 설명서에서 답을 찾았습니다 (다음 답변 참조). 내 질문에 연결을 요구하지 않았습니다.
Rkz

@Rkz : 최종 편집을보고 모델을 컴파일하고 맞추는 방법도 보여줍니다.
moh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.