ผสานสองรุ่นที่แตกต่างกันใน Keras


25

ฉันกำลังพยายามรวมโมเดล Keras สองแบบเป็นแบบจำลองเดียวและฉันไม่สามารถทำสิ่งนี้ให้สำเร็จ

ตัวอย่างเช่นในรูปที่แนบมาฉันต้องการดึงชั้นกลางของมิติ 8 และใช้สิ่งนี้เป็นอินพุตไปยังชั้น (จากมิติ 8 อีกครั้ง) ในรุ่นแล้วรวมทั้งแบบและแบบเป็นหนึ่งเดียว แบบA2B1BAB

ฉันใช้โมดูลการทำงานเพื่อสร้าง Modelและ Modelอย่างอิสระ ฉันจะทำงานนี้ให้สำเร็จได้อย่างไรAB

หมายเหตุ :เป็นชั้นที่ป้อนเข้ากับรูปแบบและเป็นชั้นป้อนข้อมูลไปยังรุ่นBA1AB1B

ดูรูปภาพ

คำตอบ:


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 Model) ข้างต้นคุณกำลังรวมเลเยอร์
สุภาพบุรุษ

7

ใน Keras มีวิธีที่เป็นประโยชน์ในการกำหนดรูปแบบ: การใช้API ของการทำงาน ด้วย API การใช้งานคุณสามารถกำหนดกราฟ acyclic ของเลเยอร์ซึ่งช่วยให้คุณสร้างสถาปัตยกรรมตามอำเภอใจโดยสมบูรณ์ พิจารณาตัวอย่างของคุณ:

#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: ชั้นเลเยอร์สำหรับ a Modelต้องเป็นInputLayerวัตถุ อินพุตที่ได้รับ: เทนเซอร์ นอกจากนี้ตามที่กล่าวไว้ก่อนหน้านี้ฉันใช้ API การทำงานเพื่อสร้าง Model A และ Model B แยกกัน ฉันคิดว่าคำตอบที่ฉันกำลังมองหาอาจเกี่ยวข้องกับหัวข้อ "Multi-input และ multi-output" ในเอกสารประกอบของ keras ที่ใช้ฟังก์ชั่นการต่อข้อมูล (ไม่แน่ใจทั้งหมด)
Rkz

@Rkz: ฉันได้แก้ไขคำตอบ มันใช้งานได้แล้ว เราต้องใช้ "concatenate" ที่จริงแล้วคุณควรพูดถึงอินพุตหลัก (A1) เมื่อคุณต้องการกำหนดรุ่น "B"
moh

ขอบคุณสำหรับเวลาและการแก้ไขของคุณ ฉันหาคำตอบจากเอกสาร Keras (ดูคำตอบต่อไปนี้) ฉันไม่ต้องการให้มีการเรียงต่อกันสำหรับคำถามของฉัน
Rkz

@Rkz: ดูการแก้ไขขั้นสุดท้ายฉันยังแสดงให้เห็นถึงวิธีการรวบรวมและพอดีกับแบบ
moh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.