ผมจะผ่านตัวอย่างของรูปแบบภาษา LSTM นี้บน GitHub (ลิงค์) สิ่งที่ทำโดยทั่วไปค่อนข้างชัดเจนสำหรับฉัน แต่ฉันยังคงดิ้นรนเพื่อทำความเข้าใจว่าการโทรcontiguous()
ทำอะไรซึ่งเกิดขึ้นหลายครั้งในรหัส
ตัวอย่างเช่นในบรรทัด 74/75 ของการป้อนรหัสและลำดับเป้าหมายของ LSTM จะถูกสร้างขึ้น ข้อมูล (เก็บไว้ในids
) เป็น 2 มิติโดยที่มิติแรกคือขนาดแบทช์
for i in range(0, ids.size(1) - seq_length, seq_length):
# Get batch inputs and targets
inputs = Variable(ids[:, i:i+seq_length])
targets = Variable(ids[:, (i+1):(i+1)+seq_length].contiguous())
ตัวอย่างง่ายๆเมื่อใช้ขนาดแบทช์ 1 และseq_length
10 inputs
และtargets
มีลักษณะดังนี้:
inputs Variable containing:
0 1 2 3 4 5 6 7 8 9
[torch.LongTensor of size 1x10]
targets Variable containing:
1 2 3 4 5 6 7 8 9 10
[torch.LongTensor of size 1x10]
โดยทั่วไปคำถามของฉันคืออะไรcontiguous()
และทำไมฉันถึงต้องการ?
นอกจากนี้ฉันไม่เข้าใจว่าเหตุใดจึงเรียกวิธีนี้สำหรับลำดับเป้าหมาย แต่ไม่ใช่ลำดับการป้อนข้อมูลเนื่องจากตัวแปรทั้งสองประกอบด้วยข้อมูลเดียวกัน
จะไม่targets
ชัดเจนและinputs
ยังคงติดกันได้อย่างไร?
แก้ไข:
ฉันพยายามที่จะไม่โทรออกcontiguous()
แต่สิ่งนี้นำไปสู่ข้อความแสดงข้อผิดพลาดเมื่อคำนวณการสูญเสีย
RuntimeError: invalid argument 1: input is not contiguous at .../src/torch/lib/TH/generic/THTensor.c:231
เห็นได้ชัดว่าการเรียกcontiguous()
ในตัวอย่างนี้เป็นสิ่งจำเป็น
(เพื่อให้สามารถอ่านได้ฉันจึงหลีกเลี่ยงการโพสต์โค้ดแบบเต็มที่นี่สามารถพบได้โดยใช้ลิงก์ GitHub ด้านบน)
ขอบคุณล่วงหน้า!
tldr; to the point summary
โดยมีความกระชับเพื่อสรุปประเด็น