ชั้น deconvolutional คืออะไร?


188

ฉันเพิ่งอ่านเครือข่าย Convolutional ครบวงจรสำหรับการแบ่งส่วนแบบ Semanticโดย Jonathan Long, Evan Shelhamer, Trevor Darrell ฉันไม่เข้าใจว่า "เลเยอร์ deconvolutional" ทำอะไร / ทำงานอย่างไร

ส่วนที่เกี่ยวข้องคือ

3.3 การยกกลับคือการบิดอย่างช้าๆ

อีกวิธีหนึ่งในการเชื่อมต่อเอาต์พุตหยาบกับพิกเซลหนาแน่นคือการแก้ไข ตัวอย่างเช่นการประมาณค่าแบบสองจังหวะง่ายคำนวณแต่ละเอาต์พุตจากอินพุตสี่ที่ใกล้ที่สุดโดยแผนที่เชิงเส้นที่ขึ้นอยู่กับตำแหน่งสัมพัทธ์ของเซลล์อินพุตและเอาต์พุตเท่านั้น เรียกอีกอย่างว่าการยกตัวอย่างด้วยแฟคเตอร์fนั้นจะทำให้เกิดการโน้มน้าวใจด้วยการป้อนข้อมูลเศษส่วนที่ 1 / f ตราบใดที่เป็นส่วนประกอบสำคัญเป็นวิธีธรรมชาติในการ upsample จึงย้อนกลับบิด (บางครั้งเรียก deconvolution) กับกางเกงของการส่งออกของ ฉ การดำเนินการเช่นนี้ไม่สำคัญที่จะนำมาใช้เพราะมันเพียงแค่ย้อนกลับไปข้างหน้าและย้อนกลับผ่านการบิดyij
fff
ดังนั้นการสุ่มตัวอย่างจะดำเนินการในเครือข่ายสำหรับการเรียนรู้แบบ end-to-end โดย backpropagation จากการสูญเสียพิกเซล
โปรดทราบว่าตัวกรอง deconvolution ในเลเยอร์ดังกล่าวไม่จำเป็นต้องได้รับการแก้ไข (เช่นไปยังการสุ่มตัวอย่าง bilinear) แต่สามารถเรียนรู้ได้ สแต็คของ deconvolution เลเยอร์และฟังก์ชั่นการเปิดใช้งานยังสามารถเรียนรู้การยกตัวอย่างแบบไม่เชิงเส้น
ในการทดลองของเราเราพบว่าการอัปแซมปลิงในเครือข่ายนั้นรวดเร็วและมีประสิทธิภาพสำหรับการเรียนรู้การทำนายที่หนาแน่น สถาปัตยกรรมการแบ่งส่วนที่ดีที่สุดของเราใช้เลเยอร์เหล่านี้เพื่อเรียนรู้ที่จะยกตัวอย่างสำหรับการทำนายที่ละเอียดในหัวข้อ 4.2

ฉันไม่คิดว่าฉันเข้าใจจริงๆว่าการฝึกฝนเลเยอร์ convolutional เป็นอย่างไร

สิ่งที่ฉันคิดว่าฉันได้เข้าใจคือว่าชั้นความสับสนที่มีขนาดเคอร์เนลเรียนรู้ฟิลเตอร์ที่มีขนาดk × k เอาต์พุตของเลเยอร์ convolutional ที่มีขนาดเคอร์เนลk , ฟิลเตอร์s Nและnของstride เป็นมิติการป้อนข้อมูลสลัวkk×kksNnn อย่างไรก็ตามฉันไม่ทราบวิธีการเรียนรู้ของเลเยอร์ convolutional (ฉันเข้าใจว่า MLP ง่าย ๆ เรียนรู้ด้วยการไล่ระดับสีแบบลาดลงถ้าช่วยได้)Input dims2n

ดังนั้นหากความเข้าใจของฉันเกี่ยวกับเลเยอร์ convolutional นั้นถูกต้องฉันก็ไม่รู้เลยว่ามันจะกลับกันได้อย่างไร

ใครช่วยกรุณาฉันเข้าใจชั้น deconvolutional


3
วิดีโอการบรรยายนี้อธิบายถึง deconvolution / upsampling: youtu.be/ByjaPdWXKJ4?t=16m59s
user199309

6
ฉันหวังว่ามันจะมีประโยชน์กับทุกคนฉันได้ทำสมุดบันทึกเพื่อสำรวจว่าการบิดและการเปลี่ยนทรานแซคชันสามารถใช้ใน TensorFlow (0.11) ได้อย่างไร บางทีการมีตัวอย่างและตัวเลขที่ใช้งานได้จริงอาจช่วยให้เข้าใจได้มากขึ้นว่าทำงานอย่างไร
AkiRoss

1
สำหรับฉันหน้านี้ให้คำอธิบายที่ดีกว่านี้ฉันยังอธิบายถึงความแตกต่างระหว่าง deconvolution และทรานซิชั่นแบบทรานสวอยส์
T.Antoni

ไม่ยกตัวอย่างมากกว่าการรวมถอยหลังไปข้างหลังมากกว่าการบิดอย่างช้าๆเนื่องจากไม่มีพารามิเตอร์หรือไม่
Ken Fehling

หมายเหตุ: ชื่อ "ชั้น deconvolutional" เป็นความเข้าใจผิดเพราะชั้นนี้ไม่ได้ดำเนินการdeconvolution
user76284

คำตอบ:


210

ชั้น deconvolutionเป็นชื่อที่โชคร้ายมากและค่อนข้างควรจะเรียกว่าชั้นสับสนขนย้าย

จากการมองเห็นสำหรับการแปลงทรานซิชั่นที่มีก้าวหนึ่งและไม่มีช่องว่างภายในเราเพียงแค่ใส่อินพุตดั้งเดิม (รายการสีฟ้า) ด้วยศูนย์ (รายการสีขาว) (รูปที่ 1)

รูปที่ 1

ในกรณีที่ก้าวย่างที่สองและช่องว่างภายในการบิดที่แปลงจะมีลักษณะเช่นนี้ (รูปที่ 2):

รูปที่ 2

ท่านสามารถหาข้อมูลเพิ่มเติม (ที่ดี) visualisations ของเลขคณิตสับสนที่นี่


16
เพียงเพื่อให้แน่ใจว่าฉันเข้าใจ: "Deconvolution" นั้นค่อนข้างเหมือนกับ Convolion แต่คุณเพิ่มช่องว่างภายในหรือไม่ (รอบภาพ / เมื่อ s> 1 รอบแต่ละพิกเซลด้วย)
Martin Thoma

17
ใช่ชั้น deconvolution ก็ทำเช่นเดียวกัน! นั่นคือเหตุผลที่การแปลงสัณฐานเข้ากันได้ดีกว่าอย่างมากเนื่องจากชื่อและการแยกแยะคำศัพท์ที่ทำให้เข้าใจผิดเป็นจริง
David Dao

11
ทำไมคุณถึงพูดว่า "ไม่มีช่องว่างภายใน" ในรูปที่ 1 ถ้าอินพุตจริงเป็นศูนย์
Stas S

8
โดยวิธีการ: มันถูกเรียกว่า convolutions transposed ตอนนี้ใน TensorFlow: tensorflow.org/versions/r0.10/api_docs/python/ …
มาร์ตินโทมา

9
ขอบคุณสำหรับคำตอบที่เข้าใจง่ายมาก แต่ฉันสับสนว่าทำไมกรณีที่สองคือกรณี 'stride two' มันจะทำงานเหมือนอย่างแรกเมื่อเคอร์เนลเคลื่อนที่
Demonedge

49

ฉันคิดว่าวิธีหนึ่งที่จะได้สัญชาตญาณระดับพื้นฐานจริง ๆ หลังการโน้มน้าวใจคือคุณกำลังเลื่อนตัวกรอง K ซึ่งคุณสามารถคิดได้ว่าเป็น K stencils เหนือภาพอินพุตและสร้างการเปิดใช้งาน K - แต่ละอันแสดงระดับของการจับคู่กับลายฉลุเฉพาะ . การดำเนินการผกผันของสิ่งนั้นก็คือการเปิดใช้งาน K และขยายไปสู่ ​​preimage ของการดำเนินการสังวัตนา คำอธิบายที่ใช้งานง่ายของการดำเนินการผกผันคือโดยประมาณการสร้างภาพใหม่โดยใช้ stencils (ฟิลเตอร์) และการเปิดใช้งาน (ระดับของการแข่งขันสำหรับแต่ละ stencil) และดังนั้นในระดับสัญชาตญาณพื้นฐานที่เราต้องการระเบิดการเปิดใช้งานแต่ละครั้ง และเพิ่มขึ้น

อีกวิธีในการทำความเข้าใจกับ deconv คือการตรวจสอบการใช้งานชั้น deconvolution ใน Caffe ดูรหัสที่เกี่ยวข้องต่อไปนี้:

DeconvolutionLayer<Dtype>::Forward_gpu
ConvolutionLayer<Dtype>::Backward_gpu
CuDNNConvolutionLayer<Dtype>::Backward_gpu
BaseConvolutionLayer<Dtype>::backward_cpu_gemm

คุณจะเห็นว่ามันถูกนำไปใช้ใน Caffe เหมือนกับ backprop สำหรับเลเยอร์ convolutional ไปข้างหน้า (สำหรับฉันมันชัดเจนมากขึ้นหลังจากฉันเปรียบเทียบการใช้ backprop ใน cuDNN Conv layer vs ConvolutionLayer :: Backward_gpu ที่ใช้ GEMM) ดังนั้นหากคุณทำงานถึงวิธีการ backpropagation สำหรับ convolution ปกติคุณจะเข้าใจสิ่งที่เกิดขึ้นในระดับการคำนวณเชิงกล วิธีการคำนวณนี้ทำงานได้ตรงกับสัญชาตญาณที่อธิบายไว้ในย่อหน้าแรกของการประกาศแจ้งนี้

อย่างไรก็ตามฉันไม่ทราบวิธีการเรียนรู้ของเลเยอร์ convolutional (ฉันเข้าใจว่า MLP ง่าย ๆ เรียนรู้ด้วยการไล่ระดับสีแบบลาดลงถ้าช่วยได้)

เพื่อตอบคำถามอื่นภายในคำถามแรกของคุณมีความแตกต่างที่สำคัญสองประการระหว่าง MLP backpropagation (เลเยอร์ที่เชื่อมต่อเต็มที่) และอวนแบบ Convolutional:

1) อิทธิพลของน้ำหนักถูกแปลเป็นภาษาท้องถิ่นดังนั้นก่อนอื่นให้คิดหาวิธีทำ backprop สำหรับตัวกรอง 3x3 ที่มีพื้นที่ 3x3 ขนาดเล็กของภาพอินพุตทำการแมปไปที่จุดเดียวในภาพผลลัพธ์

2) น้ำหนักของตัวกรอง convolutional จะถูกแบ่งปันเพื่อความไม่แปรปรวนเชิงพื้นที่ สิ่งนี้หมายความว่าในทางปฏิบัติคือในการส่งต่อตัวกรอง 3x3 เดียวกันที่มีน้ำหนักเดียวกันจะถูกลากผ่านภาพทั้งหมดที่มีน้ำหนักเท่ากันสำหรับการคำนวณไปข้างหน้าเพื่อให้ได้ผลลัพธ์ภาพ (สำหรับตัวกรองนั้น ๆ ) สิ่งนี้มีความหมายอย่างไรสำหรับ backprop คือการไล่ระดับสี backprop สำหรับแต่ละจุดในอิมเมจต้นฉบับจะถูกรวมไว้ในช่วงทั้งหมดที่เราลากตัวกรองนั้นในระหว่างการส่งต่อไป โปรดทราบว่านอกจากนี้ยังมีการไล่ระดับสีที่แตกต่างกันของการสูญเสีย wrt x, w และ bias เนื่องจาก dLoss / dx จำเป็นต้องได้รับการ backpropagated และ dLoss / dw เป็นวิธีที่เราอัปเดตน้ำหนัก w และอคติเป็นอินพุตที่เป็นอิสระในการคำนวณ DAG (ไม่มีอินพุตก่อนหน้า) ดังนั้นจึงไม่จำเป็นต้องทำการ backpropagation

(my notation here assumes that convolution is y = x*w+b where '*' is the convolution operation)

7
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดสำหรับคำถามนี้
kli_nlpr

8
ฉันยอมรับว่านี่เป็นคำตอบที่ดีที่สุด คำตอบยอดนิยมมีภาพเคลื่อนไหวที่สวย แต่จนกว่าฉันจะอ่านคำตอบนี้พวกเขาดูเหมือน convolutions ปกติกับ padding โดยพลการบางอย่างกับฉัน โอ้ผู้คนต่างหลงใหลกับอาหารตาอย่างไร
Reii Nakano

1
เห็นด้วยคำตอบที่ยอมรับไม่ได้อธิบายอะไรเลย มันดีกว่ามาก
BjornW

ขอบคุณสำหรับคำอธิบายที่ดีของคุณ ขณะนี้ฉันไม่สามารถหาวิธีการทำ backprop ได้อย่างถูกต้อง คุณช่วยบอกฉันทีได้ไหม
บาสเตียน

33

คณิตศาสตร์ทีละขั้นตอนอธิบายว่าทรานซิสชั่นทรานซิสชั่นทำได้ 2x อัปแซมปลิงกับตัวกรอง 3x3 และก้าวย่างที่ 2:

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่าง TensorFlow ที่ง่ายที่สุดในการตรวจสอบคณิตศาสตร์:

import tensorflow as tf
import numpy as np

def test_conv2d_transpose():
    # input batch shape = (1, 2, 2, 1) -> (batch_size, height, width, channels) - 2x2x1 image in batch of 1
    x = tf.constant(np.array([[
        [[1], [2]], 
        [[3], [4]]
    ]]), tf.float32)

    # shape = (3, 3, 1, 1) -> (height, width, input_channels, output_channels) - 3x3x1 filter
    f = tf.constant(np.array([
        [[[1]], [[1]], [[1]]], 
        [[[1]], [[1]], [[1]]], 
        [[[1]], [[1]], [[1]]]
    ]), tf.float32)

    conv = tf.nn.conv2d_transpose(x, f, output_shape=(1, 4, 4, 1), strides=[1, 2, 2, 1], padding='SAME')

    with tf.Session() as session:
        result = session.run(conv)

    assert (np.array([[
        [[1.0], [1.0],  [3.0], [2.0]],
        [[1.0], [1.0],  [3.0], [2.0]],
        [[4.0], [4.0], [10.0], [6.0]],
        [[3.0], [3.0],  [7.0], [4.0]]]]) == result).all()

ฉันคิดว่าการคำนวณของคุณผิดที่นี่ เอาต์พุตระดับกลางควรเป็น 3+ 2 * 2 = 7 จากนั้นสำหรับเคอร์เนล 3x3 เอาต์พุตสุดท้ายควรเป็น 7-3 + 1 = 5x5
Alex

ขออภัย @Alex แต่ฉันไม่เข้าใจว่าเพราะเหตุใดผลลัพธ์ของสื่อกลางคือ 7 คุณช่วยอธิบายได้ไหม?
andriys

2
@andriys ในภาพที่คุณแสดงทำไมผลสุดท้ายถูกครอบตัด
James Bond

28

บันทึกที่มาพร้อมกับระดับ CS231n Stanford CS : Convolutional โครงข่ายประสาทสำหรับ Visual รับรู้โดย Andrej Karpathyทำงานที่ยอดเยี่ยมของการอธิบายเครือข่ายประสาทสับสน

การอ่านบทความนี้ควรให้แนวคิดคร่าวๆเกี่ยวกับ:

  • เครือข่าย Deconvolutional Matthew D. Zeiler, Dilip Krishnan, Graham W. Taylor และ Rob Fergus ภาควิชาวิทยาการคอมพิวเตอร์, Courant Institute, มหาวิทยาลัยนิวยอร์ก

สไลด์เหล่านี้เหมาะสำหรับเครือข่าย Deconvolutional


29
เป็นไปได้หรือไม่ที่จะสรุปเนื้อหาของลิงค์ใดลิงก์หนึ่งในย่อหน้าสั้น ๆ ? ลิงก์อาจมีประโยชน์สำหรับการวิจัยเพิ่มเติม แต่คำตอบของการแลกเปลี่ยนสแต็คควรมีข้อความเพียงพอที่จะตอบคำถามพื้นฐานโดยไม่จำเป็นต้องออกจากไซต์
Neil Slater

ฉันขอโทษ แต่เนื้อหาของหน้าเหล่านี้ใหญ่เกินกว่าที่จะสรุปได้ในย่อหน้าสั้น ๆ
Azrael

12
ไม่จำเป็นต้องมีการสรุปแบบเต็มรูปแบบเพียงแค่พาดหัว - เช่น "เครือข่ายประสาท deconvolutional คล้ายกับ CNN แต่ได้รับการฝึกฝนเพื่อให้สามารถใช้คุณลักษณะในเลเยอร์ที่ซ่อนอยู่เพื่อสร้างเลเยอร์ก่อนหน้านี้ สามารถสร้างขึ้นใหม่ได้จากอินพุต) สิ่งนี้ช่วยให้สามารถผ่านการฝึกอบรมแบบไม่สำรองข้อมูลเพื่อเรียนรู้คุณสมบัติระดับสูงทั่วไปในโดเมนปัญหา - โดยทั่วไปแล้วการประมวลผลภาพ "(หมายเหตุฉันไม่แน่ใจว่าถูกต้องหรือไม่ คำตอบของตัวเอง)
Neil Slater

6
แม้ว่าลิงก์จะดี แต่ข้อมูลสรุปแบบจำลองในคำพูดของคุณจะดีกว่า
SmallChess

11

เพิ่งพบบทความดีๆจากเว็บไซต์ theaon ในหัวข้อนี้ [1]:

ความจำเป็นในการเปลี่ยนความเชื่อโดยทั่วไปเกิดขึ้นจากความปรารถนาที่จะใช้การเปลี่ยนแปลงที่เกิดขึ้นในทิศทางตรงกันข้ามของการบิดปกติ [... ] เพื่อฉายแผนที่คุณสมบัติของโครงการไปยังพื้นที่มิติที่สูงขึ้น [... ] กล่าวคือแผนที่จากพื้นที่ 4 มิติไปเป็นพื้นที่ 16 มิติในขณะที่ยังคงรักษารูปแบบการเชื่อมต่อของการแปลง

การสลับเปลี่ยนความเชื่อมั่น - เรียกอีกอย่างว่าการโน้มน้าวใจแบบเศษส่วน - ทำงานโดยการสลับไปข้างหน้าและย้อนกลับของการแปลง วิธีหนึ่งที่จะทำให้ทราบได้คือเคอร์เนลจะกำหนดสังวัตนา แต่ไม่ว่าจะเป็นการแปลงตรงหรือการแปลงทรานส์ที่ถูกกำหนดโดยวิธีการคำนวณการส่งต่อและการย้อนกลับ

การดำเนินการสังวัตนาแบบ transposed สามารถพิจารณาได้ว่าเป็นการไล่ระดับสีของการโน้มน้าวใจบางส่วนด้วยความเคารพต่อสิ่งที่ป้อนเข้ามาซึ่งโดยทั่วไปแล้วจะนำมาใช้ในการฝึกการสนทนาแบบทรานซิสชั่น

ในที่สุดโปรดทราบว่ามันเป็นไปได้เสมอที่จะใช้การแปลงทรานส์ที่มีข้อตกลงโดยตรง ข้อเสียคือมันมักจะเกี่ยวข้องกับการเพิ่มคอลัมน์และแถวของศูนย์จำนวนมากไปยังอินพุตทำให้การใช้งานมีประสิทธิภาพน้อยลง

ดังนั้นใน simplespeak "transposed convolution" คือการดำเนินการทางคณิตศาสตร์โดยใช้เมทริกซ์ (เช่นเดียวกับ convolution) แต่มีประสิทธิภาพมากกว่าการดำเนินการ convolution แบบปกติในกรณีที่คุณต้องการย้อนกลับจากค่าที่ถูกแปลงกลับไปเป็นค่าเดิม (ทิศทางตรงกันข้าม) นี่คือเหตุผลว่าทำไมจึงเป็นที่นิยมในการนำไปใช้เพื่อโน้มน้าวใจเมื่อคำนวณทิศทางตรงกันข้าม (เช่นเพื่อหลีกเลี่ยงการคูณ 0 ที่ไม่จำเป็นจำนวนมากที่เกิดจากเมทริกซ์กระจัดกระจายซึ่งเป็นผลมาจากการขยายอินพุต)

Image ---> convolution ---> Result

Result ---> transposed convolution ---> "originalish Image"

บางครั้งคุณบันทึกค่าบางอย่างตามเส้นทางที่มีการแปลงและนำข้อมูลนั้นกลับมาใช้ใหม่เมื่อ "ย้อนกลับ":

Result ---> transposed convolution ---> Image

นั่นอาจเป็นเหตุผลว่าทำไมเรียกว่า "deconvolution" อย่างผิด ๆ อย่างไรก็ตามมันมีบางอย่างที่เกี่ยวข้องกับเมทริกซ์ทรานสดิวชันของการโน้มน้าว (C ^ T) ดังนั้นชื่อที่เหมาะสมกว่านี้คือ

ดังนั้นจึงสมเหตุสมผลอย่างมากเมื่อพิจารณาต้นทุนการคำนวณ คุณจะจ่ายเงินมากขึ้นสำหรับ amazon gpus ถ้าคุณไม่ใช้การแปลงแบบทรานสปอน

อ่านและรับชมภาพเคลื่อนไหวได้ที่นี่อย่างระมัดระวัง: http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html#no-zero-padding-unit-strides-transposed

การอ่านที่เกี่ยวข้องอื่น ๆ :

ทรานสโพเรน (หรือมากกว่านั้นคือเฮอร์เมียนหรือคอนจูเกททรานส) ของฟิลเตอร์นั้นเป็นเพียงฟิลเตอร์ที่ตรงกัน [3] นี่คือการค้นพบเมื่อเวลาผ่านกลับเคอร์เนลและการผันค่าทั้งหมด [2]

ฉันยังใหม่กับสิ่งนี้และจะขอบคุณสำหรับความคิดเห็นหรือการแก้ไขใด ๆ

[1] http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html

[2] http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html#transposed-convolution-arithmetic

[3] https://en.wikipedia.org/wiki/Matched_filter


1
หยิบ Nit แต่ลิงก์ควรจะเป็น: deeplearning.net/software/theano_versions/dev/tutorial/…
Herbert

1
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุด !!!
kli_nlpr

10

เราสามารถใช้ PCA สำหรับการเปรียบเทียบ

เมื่อใช้ Conv, Forward pass คือการแยกค่าสัมประสิทธิ์ขององค์ประกอบหลักจากภาพอินพุตและ Backward Pass (ที่อัปเดตอินพุต) คือการใช้ (การไล่ระดับของ) สัมประสิทธิ์เพื่อสร้างภาพอินพุตใหม่เพื่อให้ รูปภาพอินพุตใหม่มีค่าสัมประสิทธิ์ PC ที่ตรงกับค่าสัมประสิทธิ์ที่ต้องการมากขึ้น

เมื่อใช้ deconv, pass pass และ backward pass จะถูกย้อนกลับ Forward pass จะพยายามสร้างภาพใหม่จากค่าสัมประสิทธิ์ PC และ Backward Pass จะอัพเดทค่าสัมประสิทธิ์ PC ที่กำหนด (ภาพไล่ระดับสี) ของภาพ

deconv forward pass นั้นจะคำนวณการไล่ระดับสีตาม Conv ที่ให้ไว้ในโพสต์นี้: http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/

นั่นเป็นเหตุผลว่าทำไมในการใช้งาน deconv ของ caffe (อ้างถึงคำตอบของ Andrei Pokrovsky), deconv forward pass call backward_cpu_gemm () และ backward pass call forward_cpu_gemm ()


6

นอกจากคำตอบของ David Dao: มันเป็นไปได้ที่จะคิดวิธีอื่น ๆ แทนที่จะมุ่งเน้นที่พิกเซลอินพุต (ความละเอียดต่ำ) จะใช้ในการสร้างพิกเซลเอาต์พุตเดียวคุณยังสามารถมุ่งเน้นไปที่พิกเซลอินพุตส่วนบุคคลใดที่สนับสนุนภูมิภาคของพิกเซลเอาต์พุต

สิ่งนี้ทำในสิ่งพิมพ์กลั่นนี้รวมถึงชุดของการสร้างภาพข้อมูลที่ใช้งานง่ายและมีการโต้ตอบ ข้อดีอย่างหนึ่งของการคิดในทิศทางนี้คือการอธิบายสิ่งประดิษฐ์กระดานหมากรุกกลายเป็นเรื่องง่าย


5

Convolutions จากมุมมองของ DSP

ฉันสายไปนิดหน่อย แต่ก็ยังต้องการแบ่งปันมุมมองและความเข้าใจของฉัน พื้นหลังของฉันคือวิชาฟิสิกส์และการประมวลผลสัญญาณดิจิตอล โดยเฉพาะอย่างยิ่งฉันศึกษาเวฟเล็ตและ convolutions เกือบจะอยู่ในกระดูกสันหลังของฉัน;)

วิธีที่ผู้คนในชุมชนการเรียนรู้อย่างลึกซึ้งพูดคุยเกี่ยวกับการโน้มน้าวใจก็ทำให้ฉันสับสนเช่นกัน จากมุมมองของฉันสิ่งที่ดูเหมือนจะขาดหายไปคือการแยกข้อกังวลที่เหมาะสม ฉันจะอธิบายการเรียนรู้ที่ลึกซึ้งโดยใช้เครื่องมือ DSP บางอย่าง

คำปฏิเสธ

คำอธิบายของฉันจะเป็นคลื่นเล็กน้อยและไม่ใช่คณิตศาสตร์อย่างเข้มงวดเพื่อให้ได้ประเด็นหลัก


คำนิยาม

xn={xn}n=={,x1,x0,x1,}

ynxn

(yx)n=k=ynkxk

q=(q0,q1,q2)x=(x0,x1,x2,x3)T

qx=(q1q000q2q1q000q2q1q000q2q1)(x0x1x2x3)

kN

kxn=xnk

kk1

kxn={xn/kn/kZ0otherwise

k=3

3{,x0,x1,x2,x3,x4,x5,x6,}={,x0,x3,x6,}
3{,x0,x1,x2,}={x0,0,0,x1,0,0,x2,0,0,}

k=2

2x=(x0x2)=(10000010)(x0x1x2x3)

และ

2x=(x00x10)=(10000100)(x0x1)

k=kT


การเรียนรู้ที่ลึกซึ้งโดยชิ้นส่วน

qx

  • kk(qx)
  • k(kq)x
  • kq(kx)

q(kx)=q(kTx)=(k(q)T)Tx

(q)q

q(kx)=(q1q000q2q1q000q2q1q000q2q1)(10000100)(x0x1)=(q1q200q0q1q200q0q1q200q0q1)T(10000010)T(x0x1)=((10000010)(q1q200q0q1q200q0q1q200q0q1))T(x0x1)=(k(q)T)Tx

อย่างที่ใครจะเห็นคือการดำเนินการ transposed ดังนั้นชื่อ

การเชื่อมต่อกับเพื่อนบ้านที่ใกล้เคียงที่สุดอัปแซมปลิง

2(11)xq2(11)qxq=(q0q1q2)

(11)q=(q0q0+q1q1+q2q2),

กล่าวคือเราสามารถแทนที่ตัวเสริมซ้ำด้วยปัจจัย 2 และการแปลงด้วยเคอร์เนลขนาด 3 โดยการแปลงทรานซิสชั่นด้วยขนาดเคอร์เนล 4 การสนทนาแบบทรานสปอนเดอร์นี้มี "ความจุในการประมาณค่า" ที่เหมือนกัน


สรุปและหมายเหตุท้ายสุด

ฉันหวังว่าฉันจะสามารถอธิบายความเข้าใจร่วมกันบางอย่างที่พบในการเรียนรู้อย่างลึกซึ้งโดยการแยกพวกเขาออกจากการปฏิบัติงานพื้นฐาน

ฉันไม่ได้ครอบคลุมที่นี่ แต่นี่เป็นเพียงเครื่องมือวัดดาวน์แบบไม่เชิงเส้นและสามารถรักษาได้ในสัญกรณ์นี้เช่นกัน


คำตอบที่ยอดเยี่ยม การใช้มุมมองทางคณิตศาสตร์ / สัญลักษณ์มักจะอธิบายสิ่งต่าง ๆ ฉันถูกต้องในการคิดว่าคำว่า "deconvolution" ในบริบทนี้ขัดแย้งกับคำศัพท์ที่มีอยู่หรือไม่
user76284

มันไม่ได้ขัดแย้งกันจริง ๆ มันแค่ไม่มีเหตุผล Deconvolution เป็นเพียงการแปลงด้วยตัวดำเนินการตัวอย่าง คำว่า deconvolution ดูเหมือนจะเป็นรูปแบบหนึ่งของการดำเนินการผกผัน การพูดถึงสิ่งที่ตรงกันข้ามที่นี่มีเหตุผลในบริบทของการดำเนินการของเมทริกซ์เท่านั้น มันคูณกับเมทริกซ์ผกผันไม่ใช่การดำเนินการผกผันของการแปลง (เช่นการหารกับการคูณ)
André Bergner

zθx=zzθz=x

θz=xz=(θ)+x

ในระยะสั้นที่เรียกว่า "ชั้น deconvolution" ของ OP ไม่จริงทำ deconvolution มันกำลังทำอย่างอื่น (สิ่งที่คุณอธิบายไว้ในคำตอบของคุณ)
user76284

4

ฉันมีปัญหามากมายในการทำความเข้าใจว่าเกิดอะไรขึ้นในกระดาษจนกว่าฉันจะเจอโพสต์บล็อกนี้: http://warmspringwinds.github.io/tensorflow/tf-slim/2016/11/22/upsampling-and-image-segmentation เมื่อใช้-tensorflow และ TF-ผอม /

นี่คือบทสรุปของวิธีที่ฉันเข้าใจสิ่งที่เกิดขึ้นในการสุ่มตัวอย่าง 2x:

ข้อมูลจากกระดาษ

  • การสุ่มตัวอย่างคืออะไร
    • "การสุ่มตัวอย่างด้วยปัจจัย f คือการบิดด้วยการป้อนข้อมูลเศษส่วน 1 / f"
    • → convolutions ที่ strided บางส่วนเป็นที่รู้จักกันว่า transposed convolutions ตามเช่นhttp://deeplearning.net/software/theano/tutorial/conv_arithmetic.html
  • อะไรคือพารามิเตอร์ของการโน้มน้าวใจนั้น?
  • น้ำหนักคงที่หรือสามารถฝึกได้หรือไม่?
    • กระดาษกล่าวว่า "เราเริ่มต้นการสุ่มตัวอย่าง 2 เท่าของการประมาณค่าแบบบิลิแนร์ แต่อนุญาตให้เรียนรู้พารามิเตอร์ [... ]"
    • อย่างไรก็ตามหน้า GitHub ที่สอดคล้องกันระบุว่า "ในการทดลองดั้งเดิมของเราเลเยอร์การแก้ไขถูกเตรียมใช้งานให้เป็นเมล็ด bilinear และเรียนรู้แล้วในการทดลองติดตามและการใช้งานอ้างอิงนี้เมล็ด bilinear ได้รับการแก้ไขแล้ว"
    • →น้ำหนักคงที่

ตัวอย่างง่ายๆ

  1. จินตนาการภาพอินพุตต่อไปนี้:

ใส่ภาพ

  1. การโน้มน้าวใจจีบแบบเศษส่วนทำงานโดยการแทรก factor-1 = 2-1 = 1 ศูนย์ในระหว่างค่าเหล่านี้และจากนั้นสมมติว่าก้าวย่าง = 1 ในภายหลัง ดังนั้นคุณจะได้รับภาพเสริมขนาด 6x6 ต่อไปนี้

ภาพเบาะ

  1. ตัวกรอง bilinear 4x4 มีลักษณะเช่นนี้ ค่าของมันถูกเลือกเพื่อให้น้ำหนักที่ใช้ (= น้ำหนักทั้งหมดที่ไม่ได้คูณด้วยศูนย์ที่แทรกไว้) รวมได้ถึง 1 ค่าที่ไม่ซ้ำกันสามค่าคือ 0.56, 0.19 และ 0.06 ยิ่งไปกว่านั้นจุดศูนย์กลางของตัวกรองเป็นไปตามพิกเซลในแถวที่สามและคอลัมน์ที่สาม

กรอง

  1. การใช้ตัวกรอง 4x4 กับภาพที่มีเบาะรอง (โดยใช้ padding = 'same' และ stride = 1) ให้ภาพที่มีขนาด 6x6 ที่อัปโหลดดังต่อไปนี้:

ภาพที่ยกระดับ

  1. การสุ่มตัวอย่างแบบนี้จะดำเนินการสำหรับแต่ละช่องทาง (ดูบรรทัดที่ 59 ในhttps://github.com/shelhamer/fcn.berkeleyvision.org/blob/master/surgery.py ) ในตอนท้ายการเพิ่มขนาด 2x อัพเป็นการปรับขนาดที่ง่ายมากโดยใช้การประมาณค่าแบบบิลิแนร์และการประชุมเกี่ยวกับวิธีจัดการกับเส้นขอบ ฉันเชื่อว่าการอัปแซมปลิงขนาด 16x หรือ 32x ทำงานในลักษณะเดียวกันฉันเชื่อว่า

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