การขยายพันธุ์กลับในซีเอ็นเอ็น


16

ฉันมีซีเอ็นเอ็นต่อไปนี้:

Layour เครือข่าย

  1. ฉันเริ่มต้นด้วยภาพอินพุตขนาด 5x5
  2. จากนั้นฉันใช้การแปลงโดยใช้เคอร์เนล 2x2 และ stride = 1 ซึ่งสร้างแผนที่คุณลักษณะขนาด 4x4
  3. จากนั้นฉันใช้ 2x2 max-pooling ร่วมกับ stride = 2 ซึ่งจะลดขนาดของแผนที่ขนาด 2x2
  4. จากนั้นฉันก็ใช้ sigmoid โลจิสติก
  5. จากนั้นหนึ่งเลเยอร์ที่เชื่อมต่ออย่างเต็มที่กับ 2 เซลล์ประสาท
  6. และชั้นเอาท์พุท

เพื่อความเรียบง่ายสมมติว่าฉันได้ทำพาสพาสไปแล้วและคำนวณδH1 = 0.25และ δH2 = -0.15

ดังนั้นหลังจากผ่านไปข้างหน้าอย่างสมบูรณ์และทำย้อนหลังผ่านบางส่วนเครือข่ายของฉันมีลักษณะเช่นนี้:

เครือข่ายหลังจากส่งต่อ

จากนั้นฉันคำนวณ delta สำหรับเลเยอร์ที่ไม่ใช่เชิงเส้น (sigmoid โลจิสติก):

δ11=(0.250.61+0.150.02)0.58(10.58)=0.0364182δ12=(0.250.82+0.150.50)0.57(10.57)=0.068628δ21=(0.250.96+0.150.23)0.65(10.65)=0.04675125δ22=(0.251.00+0.150.17)0.55(10.55)=0.06818625

จากนั้นฉันเผยแพร่เดลตาไปที่เลเยอร์ 4x4 และตั้งค่าทั้งหมดที่กรองออกโดยการรวมกำไรสูงสุดเป็น 0 และแผนที่ไล่ระดับสีจะมีลักษณะดังนี้:

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

ฉันจะอัปเดตน้ำหนักเคอร์เนลจากที่นั่นได้อย่างไร และถ้าเครือข่ายของฉันมีเลเยอร์ Convolutional อีกชั้นหนึ่งก่อนหน้า 5x5 ฉันควรใช้ค่าใดในการอัปเดตน้ำหนักเคอร์เนล และโดยรวมแล้วการคำนวณของฉันถูกต้องหรือไม่


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

แหล่งข้อมูลที่ดีที่สุดคือหนังสือเรียนรู้อย่างลึกซึ้ง - เป็นที่ยอมรับว่าไม่ใช่เรื่องง่ายที่จะอ่าน :) การบิดครั้งแรกนั้นเหมือนกับการแบ่งภาพเป็นหย่อม ๆ แล้วใช้เครือข่ายประสาทปกติโดยที่แต่ละพิกเซลเชื่อมต่อกับจำนวน "ฟิลเตอร์" ที่คุณใช้น้ำหนัก
Ricardo Cruz

1
คำถามของคุณในสาระสำคัญว่าน้ำหนักเคอร์เนลจะถูกปรับโดยใช้ backpropagation อย่างไร
JahKnows

@JahKnows .. และวิธีการคำนวณการไล่ระดับสีสำหรับเลเยอร์ convolutional ให้เป็นตัวอย่างในคำถาม
koryakinp

มีฟังก์ชั่นการเปิดใช้งานที่เชื่อมโยงกับเลเยอร์ convolutional ของคุณหรือไม่?
JahKnows

คำตอบ:


10

การชักชวนนั้นใช้หลักการแบ่งปันน้ำหนักซึ่งจะทำให้คณิตศาสตร์ซับซ้อนขึ้นอย่างมาก แต่ลองพยายามผ่านวัชพืช ฉันกำลังอธิบายส่วนใหญ่ของฉันจากแหล่งนี้


ส่งต่อ

ในขณะที่คุณสังเกตผ่านไปข้างหน้าของชั้น convolutional สามารถแสดงเป็น

xi,jl=mnwm,nloi+m,j+nl1+bi,jl

k1k2k1=k2=2x0,0=0.25mn

แพร่กระจายย้อนกลับ

สมมติว่าคุณกำลังใช้ค่าเฉลี่ยข้อผิดพลาดกำลังสอง (MSE) ที่กำหนดเป็น

E=12p(tpyp)2

เราต้องการตรวจสอบ

Ewm,nlmnw0,01=0.13HK

(Hk1+1)(Wk2+1)

44w0,01=0.13x0,01=0.25

Ewm,nl=i=0Hk1j=0Wk2Exi,jlxi,jlwm,nl

สิ่งนี้ทำซ้ำข้ามพื้นที่เอาต์พุตทั้งหมดกำหนดข้อผิดพลาดที่เอาต์พุตกำลังสนับสนุนและจากนั้นกำหนดปัจจัยการสนับสนุนของน้ำหนักเคอร์เนลที่เกี่ยวข้องกับเอาต์พุตนั้น

ให้เราเรียกการสนับสนุนข้อผิดพลาดจากพื้นที่ส่งออกเดลต้าเพื่อความง่ายและติดตามข้อผิดพลาด backpropagated

Exi,jl=δi,jl

การมีส่วนร่วมจากน้ำหนัก

การสนทนานี้ถูกกำหนดให้เป็น

xi,jl=mnwm,nloi+m,j+nl1+bi,jl

ดังนั้น,

xi,jlwm,nl=wm,nl(mnwm,nloi+m,j+nl1+bi,jl)

m=mn=n

xi,jlwm,nl=oi+m,j+nl1

จากนั้นกลับมาในเทอมข้อผิดพลาดของเรา

Ewm,nl=i=0Hk1j=0Wk2δi,jloi+m,j+nl1

โคตรลาดลง

w(t+1)=w(t)ηEwm,nl

ลองคำนวณบางส่วน

import numpy as np
from scipy import signal
o = np.array([(0.51, 0.9, 0.88, 0.84, 0.05), 
              (0.4, 0.62, 0.22, 0.59, 0.1), 
              (0.11, 0.2, 0.74, 0.33, 0.14), 
              (0.47, 0.01, 0.85, 0.7, 0.09),
              (0.76, 0.19, 0.72, 0.17, 0.57)])
d = np.array([(0, 0, 0.0686, 0), 
              (0, 0.0364, 0, 0), 
              (0, 0.0467, 0, 0), 
              (0, 0, 0, -0.0681)])

gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')

อาร์เรย์ ([[0.044606, 0.094061], [0.011262, 0.068288]])

Ew


กรุณาแจ้งให้เราทราบหากมีข้อผิดพลาดในการได้รับมา


อัปเดต: รหัสที่ถูกต้อง


Ewm,nl

1
gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')
Sun Bee

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