1x1 Convolutions เหมือนกับเลเยอร์ที่เชื่อมต่ออย่างเต็มที่อย่างไร


55

ฉันเพิ่งอ่านYan LeCuns แสดงความคิดเห็นใน 1x1 convolutions :

ใน Convolutional Nets ไม่มีสิ่งเช่น "เลเยอร์ที่เชื่อมต่อเต็มที่" มีเลเยอร์ Convolution เพียงชั้นเดียวที่มีเมล็ดคอนวีเนียน 1x1 และตารางการเชื่อมต่อเต็มรูปแบบ

มันเป็นความจริงที่ไม่ค่อยเข้าใจมากนักที่ ConvNets ไม่จำเป็นต้องมีอินพุตที่มีขนาดคงที่ คุณสามารถฝึกอบรมพวกเขาเกี่ยวกับอินพุตที่เกิดขึ้นเพื่อสร้างเวกเตอร์เอาต์พุตเดี่ยว (โดยไม่มีขอบเขต) แล้วนำไปใช้กับภาพที่มีขนาดใหญ่ขึ้น แทนที่จะเป็นเวกเตอร์เอาต์พุตเดี่ยวคุณก็จะได้แผนที่อวกาศของเวกเตอร์เอาต์พุต เวกเตอร์แต่ละตัวจะเห็นหน้าต่างอินพุตในตำแหน่งต่างๆของอินพุต ในสถานการณ์นั้น "เลเยอร์ที่เชื่อมต่ออย่างเต็มที่" ทำหน้าที่เป็นความเชื่อมั่น 1x1

ฉันต้องการดูตัวอย่างง่ายๆสำหรับสิ่งนี้

ตัวอย่าง

สมมติว่าคุณมีเครือข่ายที่เชื่อมต่ออย่างสมบูรณ์ มันมีเพียงชั้นเข้าและชั้นออก เลเยอร์อินพุตมี 3 โหนดชั้นเลเยอร์มี 2 โหนด เครือข่ายนี้มีพารามิเตอร์เพื่อให้เป็นรูปธรรมมากยิ่งขึ้นสมมติว่าคุณมีฟังก์ชั่นการเปิดใช้งาน ReLU ในชั้นเอาต์พุตและเมทริกซ์น้ำหนัก32=6

W=(011235)R2×3b=(813)R2

ดังนั้นเครือข่ายเป็นกับ 3f(x)=ReLU(Wx+b)xR3

เลเยอร์ convolutional จะมีหน้าตาเป็นอย่างไร LeCun หมายถึงอะไรกับ "ตารางการเชื่อมต่อแบบเต็ม"?

ฉันเดาว่าจะได้ CNN ที่เทียบเท่ากันมันจะต้องมีจำนวนพารามิเตอร์เท่ากันทุกประการ MLP จากด้านบนมีพารามิเตอร์23+2=8

คำตอบ:


29

ตัวอย่างของคุณ

ในตัวอย่างของคุณเรามี 3 input และ 2 output unit หากต้องการใช้การโน้มน้าวใจให้นึกถึงหน่วยที่มีรูปร่าง: [1,1,3]และ[1,1,2]ตามลำดับ ในแง่ของซีเอ็นเอ็นเรามี3การป้อนข้อมูลและคุณสมบัติออกแผนที่แต่ละคนมีมิติเชิงพื้นที่21 x 1

การประยุกต์ใช้n x nบิดไปยังชั้นที่มีแผนที่คุณลักษณะคุณจะต้องมีเคอร์เนลของรูปร่างk [n,n,k]ดังนั้นเคอร์เนลของคุณ1x1convolutions [1, 1, 3]มีรูปร่าง คุณต้องการ2เมล็ด (หรือฟิลเตอร์) เหล่านั้นเพื่อสร้าง2แม็พคุณสมบัติเอาต์พุต โปรดทราบ: convolutions จริง ๆ คือ convolutions อันสุดท้ายไม่ค่อยมีใครพูดถึง1×11×1×number of channels of the input

แน่นอนถ้าคุณเลือกเป็นเมล็ดและอคติ:

w1=(011)R3w2=(235)R3b=(813)R2

Conv-layer จะคำนวณกับ 3f(x)=ReLU((w1xw2x)+(b1b2))xR3

การเปลี่ยนแปลงในรหัสจริง

สำหรับตัวอย่างในชีวิตจริงดูการใช้งานvgg-fcnของฉันด้วย รหัสที่ให้ไว้ในไฟล์นี้ใช้น้ำหนัก VGG แต่เปลี่ยนเลเยอร์ที่เชื่อมต่ออย่างเต็มที่เป็นเลเยอร์ convolutional เครือข่ายที่ส่งผลให้อัตราผลตอบแทนการส่งออกเช่นเดียวกับเมื่อนำไปใช้กับภาพที่นำเข้าของรูปร่างvgg [244,244,3](เมื่อใช้ทั้งสองเครือข่ายโดยไม่มีการขยาย)

เลเยอร์ convolutional ที่ถูกแปลงถูกนำเสนอในฟังก์ชัน_fc_layer(บรรทัดที่ 145) พวกมันมีขนาดเคอร์เนล7x7สำหรับ FC6 (ซึ่งเป็นขนาดสูงสุดเมื่อpool5VGG แสดงผลการแมปคุณสมบัติของรูปร่าง[7,7, 512]เลเยอร์FC7และFC8ถูกนำไปใช้ใน1x1รูปแบบของการแปลง

"ตารางการเชื่อมต่อแบบเต็ม"

ฉันไม่แน่ใจ 100% แต่เขาอาจอ้างถึงตัวกรอง / เคอร์เนลซึ่งมีมิติเดียวกับแผนที่คุณลักษณะการป้อนข้อมูล ในทั้งสองกรณี (รหัสและตัวอย่างของคุณ) มิติข้อมูลเชิงพื้นที่มีความสำคัญสูงสุดในแง่ที่ว่ามิติเชิงพื้นที่ของตัวกรองเป็นเช่นเดียวกับมิติเชิงพื้นที่เช่นเดียวกับอินพุต


"ดังนั้นเคอร์เนลของคุณ 1x1 convolutions มีรูปร่าง [1, 1, 3]" อะไร? ดูเหมือนจะมีความเข้าใจผิดที่ใหญ่กว่าของการโน้มน้าวใจ ฉันคิดว่าถ้าเคอร์เนล convolution มีรูปร่าง [1, 1, 3] แล้วใครจะบอกว่ามันคือ 1x1x3 convolution? ดังนั้นการแปลง 1x1 จึงเกี่ยวกับเอาต์พุตเท่านั้นไม่ใช่เกี่ยวกับเคอร์เนล
Martin Thoma

2
สำหรับฉันkernel = filterคุณเห็นด้วยไหม >> "ดังนั้น 1x1 บิดเป็นเพียงเกี่ยวกับการส่งออกไม่ได้เกี่ยวกับเคอร์เนลหรือไม่ไม่ได้ทั้งหมดก. 3x3บิดสามารถมีรูปร่างที่การส่งออกโดยพล." แน่นอนถ้า padding และใช้แล้วstride=1 output shape = input shape>> "ฉันคิดว่าถ้าเคอร์เนล convolution มีรูปร่าง [1, 1, 3] ดังนั้นใครจะบอกว่ามันคือ 1x1x3 convolution?" ไม่ฉันไม่เคยได้ยินใครพูดถึงเรื่องการ3x3x512โน้มน้าวใจ อย่างไรก็ตามตัวกรองสังวัตนาทั้งหมดที่ฉันได้เห็นมีมิติเชิงพื้นที่ที่สามเท่ากับจำนวนแผนที่คุณลักษณะของเลเยอร์อินพุต
MarvMind

สำหรับการอ้างอิงมีลักษณะที่เป็นConvolution Demoของหลักสูตร Karpathies CS321n: cs231n.github.io/convolutional-networks/#conv หรือที่ API tensorflow: tensorflow.org/versions/r0.9/api_docs/python/nn.html#conv2d[filter_height, filter_width, in_channels, out_channels]กรองควรจะมีรูปร่าง
MarvMind

ฉันขอเพิ่มสิ่งด้วยคำว่า "1x1 convolutions เป็น 1 x 1 x จำนวนช่องของอินพุต" ในคำตอบของคุณได้ไหม? นี่เป็นที่มาของความสับสนของฉันและฉันก็ลืมมันไปเรื่อย ๆ
Martin Thoma

แน่นอนไปเลย!
MarvMind

4

ชั้นเชื่อมต่ออย่างเต็มที่ (สำหรับขนาดของอินพุตไปกับช่องและเซลล์ประสาทเอาท์พุท) จะไม่เทียบเท่ากับชั้น 1x1 บิด แต่ไปยัง xชั้นบิด (เช่นเมล็ดใหญ่ขนาดเดียวกับ input- ไม่มี pad) ที่มีจำนวนตัวกรองเท่ากับ FC เอาท์พุท / เลเยอร์ที่ซ่อนอยู่ (เช่นตัวกรอง )nnimnnm

ตามที่คุณถามมันมีพารามิเตอร์จำนวนเดียวกับ FCN นั่นคือ (บวกอคติ):nnim

FCN: (น้ำหนักต่อเลเยอร์อินพุต = ช่องสัญญาณอินพุต ) (คูณเวลา / ความกว้างเลเยอร์ที่ซ่อนอยู่)nnim

CNN: (แต่ละเคอร์เนล) (เคอร์เนลต่อช่องสัญญาณเข้า) (จำนวนตัวกรอง)nnim

( ที่มา )


1
แน่นอนว่าสองสิ่งนี้เทียบเท่ากันในกรณีพิเศษ ; ฉันคิดว่านั่นเป็นสิ่งที่เกิดความสับสนขึ้นมาn=1
Yibo Yang

2

เคอร์เนลที่เท่ากันนั้นมีรูปทรงที่อินพุตมีอยู่และคำนวณหาจุดผลิตภัณฑ์เทนเซอร์ (ฉันใช้คำว่า "รูปร่าง" เนื่องจากดูเหมือนจะมีความสับสนเกี่ยวกับ "ขนาด" ซึ่งมักจะมองข้ามมิติของช่อง / ความลึก) ไม่มี "การเลื่อนเคอร์เนลข้ามอินพุต" ที่เกี่ยวข้องเนื่องจากเคอร์เนลมีขนาดใหญ่เท่าที่ควรจะเป็น เธซเธฑStanford CS บันทึกหลักสูตร 231n :

เลเยอร์ FC ใด ๆ สามารถแปลงเป็นเลเยอร์ CONV ตัวอย่างเช่นเลเยอร์ FC ที่มี K = 4096 ที่ดูที่ปริมาณอินพุตบางส่วนของขนาด 7 × 7 × 512 สามารถแสดงได้อย่างเท่าเทียมกันในฐานะชั้น CONV ที่มี F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096 กล่าวอีกนัยหนึ่งเรากำลังตั้งค่าขนาดตัวกรองให้มีขนาดเท่ากับปริมาณการป้อนข้อมูลอย่างแท้จริงและด้วยเหตุนี้เอาต์พุตจะเป็น 1 × 1 × 4096 เนื่องจากมีคอลัมน์เชิงลึกเพียงคอลัมน์เดียวที่พอดีกับปริมาณอินพุตที่ให้ผลลัพธ์เหมือนกัน เลเยอร์ FC เริ่มต้น

ฉันเชื่อว่า "F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096" ที่นี่หมายถึงเคอร์เนล Conv แต่ละอันมีรูปร่าง 7x7x512 และมีตัวกรองดังกล่าว 4096 ตัว

คำตอบก่อนหน้านี้กล่าวถึงว่า fc ล่าสุดของ AlexNet (ซึ่งรับอินพุตด้วยรูปร่าง 1x1x4096 และคำนวณคะแนน 1,000 คลาส) ถูกใช้งานเป็น "1x1 convolution" ให้เสร็จสมบูรณ์เคอร์เนล Conv แต่ละอันมีรูปร่าง 1x1x4096 และมี 1,000 รายการ

Le Cunn ยังอธิบายสิ่งนี้ในกระดาษ CNN , หน้า 8, คำอธิบายของ LeNet5:

Layer C5 เป็นเลเยอร์ convolutional พร้อมด้วยฟีเจอร์ 120 แผนที่ แต่ละหน่วยเชื่อมต่อกับพื้นที่ใกล้เคียง 5x5 ในแผนที่คุณลักษณะทั้งหมด 16 จาก S4 ที่นี่เนื่องจากขนาด S4 เป็น 5x5 ขนาดของคุณสมบัติแผนที่ของ C5 คือ 1x1; จำนวนนี้เป็นการเชื่อมต่อเต็มรูปแบบระหว่าง S4 และ C5


1

สำหรับผู้ใช้งานมือใหม่อย่าง PyTorch อย่างฉัน - อย่าสับสน "เลเยอร์ที่เชื่อมต่อเต็มที่" กับ "เลเยอร์เชิงเส้น"

Linear layer และ 1x1 convolutions เป็นสิ่งเดียวกัน ฉันใช้เวลาพอสมควรที่จะเข้าใจว่าไม่มีสิ่งเช่น "เลเยอร์ที่เชื่อมต่อเต็มที่" - มันเป็นเพียงมิติเชิงพื้นที่ที่แบนราบลงไปในเทนเซอร์ยักษ์ 1D การทำให้แบนทำให้องค์ประกอบทั้งหมดในตำแหน่งเชิงพื้นที่ทั้งหมดแสดงเป็นแผนที่แยก / ช่อง / มิติคุณลักษณะ (สิ่งที่คุณต้องการเรียก) ดังนั้นเมื่อเราใช้เลเยอร์เชิงเส้นบนเทนเซอร์แบนเราได้รับการเชื่อมต่ออย่างสมบูรณ์ซึ่งเห็นได้ชัดว่าไม่เหมือนกับการสนทนาแบบ 1x1

1x1บิดเป็นเพียงผลรวมถ่วงน้ำหนักของแผนที่คุณลักษณะการป้อนข้อมูลในคำถามของ OP 3. O [0] =[0] ในทำนองเดียวกัน O [1] =และ O [2] =[2]j=01X[j]W0[j]+b[0]j=01X[j]W1[j]+b[1]j=01X[j]W2[j]+b[2]

ดังกล่าวข้างต้น 3 สมการเปิดขึ้นจะกลายเป็น1}O=W2×3X3×1+b2×1

คำตอบอื่น ๆ ที่อ้างว่าเลเยอร์ที่เชื่อมต่ออย่างสมบูรณ์นั้นเป็นเพียงเลเยอร์ Convolution ที่ถูกต้อง nxnสำหรับอินพุตที่มีขนาดnxnสับสน (แม้ว่าจะถูกต้อง)

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