केरस में दो अलग-अलग मॉडल विलय


26

मैं दो केरस मॉडल को एक मॉडल में विलय करने की कोशिश कर रहा हूं और मैं इसे पूरा करने में असमर्थ हूं।

संलग्न चित्र में उदाहरण के लिए, मैं आयाम 8 की मध्य परत को प्राप्त करना चाहूंगा , और इसका उपयोग मॉडल में परत (आयाम 8 फिर से) के इनपुट के रूप में करूंगा और फिर मॉडल और मॉडल दोनों को एक के रूप में संयोजित करूंगा। एकल मॉडल।2बी1बीबीबी

मैं मॉडल और मॉडल स्वतंत्र रूप से बनाने के लिए कार्यात्मक मॉड्यूल का उपयोग कर रहा हूं । मैं इस कार्य को कैसे पूरा कर सकता हूं?बी

नोट : मॉडल लिए इनपुट लेयर है और मॉडल लिए इनपुट लेयर है ।बी 1 बी1बी1बी

तस्वीर देखो

जवाबों:


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)

और यहाँ आउटपुट संरचना है जो मुझे चाहिए थी:

यहाँ छवि विवरण दर्ज करें


सूचना है कि आप कर रहे हैं नहीं दो मॉडल ऊपर में विलय (keras मॉडल के अर्थ में), आप परतों विलय कर रहे हैं।
gented

7

केरस में एक मॉडल को परिभाषित करने का एक उपयोगी तरीका है: कार्यात्मक एपीआई का उपयोग करना । कार्यात्मक एपीआई के साथ आप परतों के निर्देशित चक्रीय ग्राफ को परिभाषित कर सकते हैं, जो आपको पूरी तरह से मनमाना आर्किटेक्चर बनाने की अनुमति देता है। आपके उदाहरण को ध्यान में रखते हुए:

#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      

उत्तर के लिए धन्यवाद, लेकिन मुझे नहीं लगता कि उपरोक्त कोड काम करेगा। सबसे पहले, जब आप बी = मॉडल कहते हैं। मॉडल (इनपुट = ए 2, आउटपुट = बी 3) यह आपको एक त्रुटि देगा टाइपर्रर: इनपुट परतों को ऑब्जेक्ट Modelहोना चाहिए InputLayer। प्राप्त इनपुट्स: टेन्सर इसके अलावा, जैसा कि पहले उल्लेख किया गया है, मैंने मॉडल ए और मॉडल बी को अलग-अलग बनाने के लिए कार्यात्मक एपीआई का उपयोग किया। मुझे लगता है कि मैं जिस उत्तर की तलाश कर रहा हूं, वह सेरेस डॉक्यूमेंट में "मल्टी-इनपुट और मल्टी-आउटपुट मॉडल" सेक्शन के साथ हो सकता है, जो कॉन्टेनेट फ़ंक्शन (संपूर्ण निश्चित रूप से नहीं) का उपयोग करता है।
ऋक्

@ प्रश्न: मैंने उत्तर संपादित कर लिया है। यह अब काम करता है। हमें "समवर्ती" का उपयोग करना होगा। वास्तव में, आपको मुख्य इनपुट (A1) का उल्लेख करना चाहिए जब आप मॉडल "बी" को परिभाषित करना चाहते हैं।
एमओएच

आपके समय और संपादन के लिए धन्यवाद। मैंने केरस प्रलेखन से उत्तर का पता लगाया (निम्नलिखित उत्तर देखें)। मुझे अपने प्रश्न के लिए सहमति की आवश्यकता नहीं थी।
ऋक्

@Rkz: अंतिम संपादन को देखें, मैं यह भी दिखाता हूं कि मॉडल को कैसे संकलित और फिट किया जाए।
मो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.