ตัวอย่าง LSTM แบบหลายต่อหนึ่งและหลายตัวใน Keras


108

ฉันพยายามทำความเข้าใจ LSTM และวิธีสร้างด้วย Keras ฉันพบว่าโดยหลักแล้วมี 4 โหมดในการเรียกใช้ RNN (4 โหมดที่ถูกต้องในภาพ)

ใส่คำอธิบายภาพที่นี่ แหล่งที่มาของภาพ: Andrej Karpathy

ตอนนี้ฉันสงสัยว่าข้อมูลโค้ดแบบเรียบง่ายสำหรับแต่ละส่วนจะเป็นอย่างไรใน Keras ดังนั้นสิ่งที่ชอบ

model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, data_dim)))
model.add(Dense(1))

สำหรับแต่ละ 4 งานอาจมีคำอธิบายเล็กน้อย

คำตอบ:


121

ดังนั้น:

  1. ตัวต่อตัว : คุณสามารถใช้Denseเลเยอร์ได้เนื่องจากคุณไม่ได้ประมวลผลลำดับ:

    model.add(Dense(output_size, input_shape=input_shape))
  2. แบบตัวต่อตัว : ตัวเลือกนี้ไม่ได้รับการสนับสนุนเช่นเดียวกับโมเดลการผูกมัดนั้นไม่ง่ายKerasนักดังนั้นเวอร์ชันต่อไปนี้จึงเป็นเวอร์ชันที่ง่ายที่สุด:

    model.add(RepeatVector(number_of_times, input_shape=input_shape))
    model.add(LSTM(output_size, return_sequences=True))
  3. หลายต่อหนึ่ง : จริงๆแล้วข้อมูลโค้ดของคุณ (เกือบ) เป็นตัวอย่างของแนวทางนี้:

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim)))
  4. หลายต่อหลายคน : นี่เป็นตัวอย่างข้อมูลที่ง่ายที่สุดเมื่อความยาวของอินพุตและเอาต์พุตตรงกับจำนวนขั้นตอนที่เกิดซ้ำ:

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
  5. หลายต่อหลายคนเมื่อจำนวนขั้นตอนแตกต่างจากความยาวอินพุต / เอาต์พุต : นี่เป็นเรื่องที่ผิดปกติใน Keras ไม่มีข้อมูลโค้ดง่ายๆในการเขียนโค้ดนั้น

แก้ไข: โฆษณา 5

ในหนึ่งในแอปพลิเคชันล่าสุดของฉันเราได้ใช้บางสิ่งที่อาจคล้ายกับหลายต่อหลายคนจากภาพที่ 4 ในกรณีที่คุณต้องการมีเครือข่ายที่มีสถาปัตยกรรมต่อไปนี้ (เมื่ออินพุตยาวกว่าเอาต์พุต):

                                        O O O
                                        | | |
                                  O O O O O O
                                  | | | | | | 
                                  O O O O O O

คุณสามารถทำได้ในลักษณะต่อไปนี้:

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
    model.add(Lambda(lambda x: x[:, -N:, :]

Nจำนวนขั้นตอนสุดท้ายที่คุณต้องการครอบคลุมอยู่ที่ไหน(บนภาพN = 3)

จากจุดนี้ไปที่:

                                        O O O
                                        | | |
                                  O O O O O O
                                  | | | 
                                  O O O 

ง่ายพอ ๆ กับลำดับความยาวของช่องว่างเทียมNโดยใช้เช่นกับ0เวกเตอร์เพื่อปรับให้มีขนาดที่เหมาะสม


10
คำชี้แจงอย่างหนึ่ง: ตัวอย่างเช่นสำหรับหลายคนต่อหนึ่งคุณใช้ LSTM (1, input_shape = (timesteps, data_dim))) ฉันคิดว่า 1 หมายถึงจำนวนเซลล์ LSTM / โหนดที่ซ่อนอยู่ แต่ไม่ได้หมายความว่าคุณจะเขียนโค้ด a Many ได้อย่างไร ต่อหนึ่งด้วยสมมติว่า 512 โหนดมากกว่า? (เพราะฉันอ่านบางอย่างที่เรียบง่ายฉันคิดว่ามันน่าจะทำด้วย model.add (LSTM (512, input_shape = ... )) model.add (Dense (1)) ที่ใช้สำหรับอะไร?)
Luca Thiede

1
ในกรณีนี้ - รหัสของคุณ - หลังจากแก้ไขการพิมพ์ผิดควรจะโอเค
Marcin Możejko

เหตุใดเราจึงใช้ RepeatVector ไม่ใช่เวกเตอร์ที่มีรายการแรก 1 = 0 และรายการอื่น ๆ ทั้งหมด = 0 (ตามภาพด้านบนคือไม่มีอินพุตเลยในสถานะต่อมาและไม่ใช่อินพุตเดียวกันเสมอไป สิ่งที่ Repeat Vector จะทำในความเข้าใจของฉัน)
Luca Thiede

1
หากคุณคิดอย่างรอบคอบเกี่ยวกับภาพนี้มันเป็นเพียงการนำเสนอแนวคิดแบบหนึ่งต่อกลุ่มเท่านั้น หน่วยที่ซ่อนอยู่ทั้งหมดนี้ต้องยอมรับบางสิ่งเป็นอินพุต ดังนั้น - พวกเขาจะรับข้อมูลเช่นเดียวกับการป้อนข้อมูลได้ดีกับการป้อนค่าแรกเท่ากับและเท่าเทียมกันอื่นx0แต่ในทางกลับกันพวกเขาอาจยอมรับสิ่งเดิมxซ้ำ ๆ หลายครั้งเช่นกัน Kerasวิธีการที่แตกต่างกันกับรูปแบบห่วงโซ่ซึ่งเป็นเรื่องยากใน ตัวเลือกที่ฉันให้ไว้เป็นกรณีที่ง่ายที่สุดของสถาปัตยกรรมแบบหนึ่งต่อกลุ่มในKeras.
Marcin Możejko

ดี! Iam กำลังคิดเกี่ยวกับการใช้ LSTM N ถึง N ในสถาปัตยกรรม GAN ฉันจะมีเครื่องกำเนิดไฟฟ้าที่ใช้ LSTM ฉันจะให้ generetor นี้ (ตามที่ใช้ใน "ตัวแปรแฝง" ใน gans) ครึ่งแรกของอนุกรมเวลาและเครื่องกำเนิดไฟฟ้านี้จะสร้างอนุกรมเวลาครึ่งหลัง จากนั้นฉันจะรวมสองครึ่ง (ของจริงและสร้างขึ้น) เพื่อสร้างอินพุต "ปลอม" สำหรับแกน คุณคิดว่าการใช้ poin 4 ของคุณจะได้ผลหรือไม่? หรืออีกนัยหนึ่งนี่ (วิธีแก้ปัญหา 4) เป็นวิธีที่ถูกต้องหรือไม่?
rjpg

6

คำตอบที่ดีโดย @Marcin Możejko

ฉันจะเพิ่มสิ่งต่อไปนี้ใน NR 5 (หลายรายการเป็นหลาย ๆ ตัวที่มีความยาวเข้า / ออกต่างกัน):

A) เป็น Vanilla LSTM

model = Sequential()
model.add(LSTM(N_BLOCKS, input_shape=(N_INPUTS, N_FEATURES)))
model.add(Dense(N_OUTPUTS))

B) เป็น Encoder-Decoder LSTM

model.add(LSTM(N_BLOCKS, input_shape=(N_INPUTS, N_FEATURES))  
model.add(RepeatVector(N_OUTPUTS))
model.add(LSTM(N_BLOCKS, return_sequences=True))  
model.add(TimeDistributed(Dense(1)))
model.add(Activation('linear')) 

1
คุณช่วยอธิบายรายละเอียดของB) Encoder-Decoder LSTMสถาปัตยกรรมได้หรือไม่? ฉันมีปัญหาในการทำความเข้าใจบทบาทของขั้นตอน "RepeatVector" / "TimeDistributed"
Marsellus Wallace
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.