tuyên truyền trở lại trong CNN


14

Tôi có CNN sau:

mạng lưới

  1. Tôi bắt đầu với một hình ảnh đầu vào có kích thước 5x5
  2. Sau đó, tôi áp dụng tích chập bằng cách sử dụng kernel 2x2 và stride = 1, tạo ra bản đồ tính năng có kích thước 4 x 4.
  3. Sau đó, tôi áp dụng nhóm tối đa 2x2 với stride = 2, điều này làm giảm bản đồ tính năng xuống kích thước 2x2.
  4. Sau đó, tôi áp dụng sigmoid logistic.
  5. Sau đó, một lớp kết nối đầy đủ với 2 tế bào thần kinh.
  6. Và một lớp đầu ra.

Để đơn giản, giả sử tôi đã hoàn thành việc chuyển tiếp và tính H1 = 0,25H2 = -0,15

Vì vậy, sau khi vượt qua hoàn thành và một phần hoàn thành vượt qua, mạng của tôi trông như thế này:

mạng sau khi vượt qua

Sau đó, tôi tính toán deltas cho lớp phi tuyến tính (logistic sigmoid):

δ11= =(0,25*0,61+-0,15*0,02)*0,58*(1-0,58)= =0,0364182δ12= =(0,25*0,82+-0,15*-0,50)*0,57*(1-0,57)= =0,068628δ21= =(0,25*0,96+-0,15*0,23)*0,65*(1-0,65)= =0,04675125δ22= =(0,25*-1,00+-0,15*0,17)*0,55*(1-0,55)= =-0,06818625

Sau đó, tôi tuyên truyền deltas đến lớp 4x4 và đặt tất cả các giá trị được lọc ra bằng cách gộp tối đa thành 0 và ánh xạ gradient giống như sau:

nhập mô tả hình ảnh ở đây

Làm cách nào để cập nhật trọng lượng kernel từ đó? Và nếu mạng của tôi có một lớp chập khác trước 5x5, tôi nên sử dụng giá trị nào để cập nhật trọng số kernel? Và tổng thể, tính toán của tôi có đúng không?


Hãy làm rõ những gì làm bạn bối rối. Bạn đã biết cách thực hiện đạo hàm của cực đại (mọi thứ đều bằng 0 trừ trường hợp giá trị là tối đa). Vì vậy, hãy quên tổng hợp tối đa. Là vấn đề của bạn trong tích chập? Mỗi bản vá chập sẽ có các dẫn xuất riêng, đó là một quá trình tính toán chậm.
Ricardo Cruz

Nguồn tốt nhất là cuốn sách học sâu - phải thừa nhận là không dễ đọc :). Phép chập đầu tiên giống như chia hình ảnh thành các miếng vá và sau đó áp dụng mạng thần kinh bình thường, trong đó mỗi pixel được kết nối với số lượng "bộ lọc" bạn có sử dụng trọng số.
Ricardo Cruz

1
Là câu hỏi của bạn về bản chất làm thế nào trọng lượng hạt nhân được điều chỉnh bằng cách sử dụng backpropagation?
JahKnows

@JahKnows ..và cách tính độ dốc cho lớp chập, lấy ví dụ trong câu hỏi.
koryakinp

Có một chức năng kích hoạt liên quan đến các lớp chập của bạn?
JahKnows

Câu trả lời:


8

Một tổ hợp sử dụng một nguyên tắc chia sẻ trọng lượng sẽ làm phức tạp đáng kể toán học nhưng chúng ta hãy cố gắng vượt qua cỏ dại. Tôi đang rút ra hầu hết lời giải thích của tôi từ nguồn này .


Chuyển tiếp qua

Khi bạn quan sát đường chuyền phía trước của lớp chập có thể được biểu thị bằng

xTôi,jtôi= =ΣmΣnwm,ntôioTôi+m,j+ntôi-1+bTôi,jtôi

trong trường hợp của chúng tôi k1k2 là kích thước của hạt nhân, trong trường hợp của chúng tôi k1= =k2= =2 . Vì vậy, điều này nói cho đầu ra x0,0= =0,25 như bạn đã tìm thấy. mn lặp trên các kích thước của kernel.

Lan truyền ngược

Giả sử bạn đang sử dụng lỗi bình phương trung bình (MSE) được xác định là

E= =12Σp(tp-yp)2,

chúng tôi muốn xác định

Ewm',n'tôim'n'w0,01= =-0,13HK

(H-k1+1)(W-k2+1)

44w0,01= =-0,13x0,01= =0,25

Ewm',n'tôi= =ΣTôi= =0H-k1Σj= =0W-k2ExTôi,jtôixTôi,jtôiwm',n'tôi

Điều này lặp đi lặp lại trên toàn bộ không gian đầu ra, xác định lỗi mà đầu ra đang đóng góp và sau đó xác định hệ số đóng góp của trọng lượng hạt nhân đối với đầu ra đó.

Chúng ta hãy gọi sự đóng góp cho lỗi từ delta không gian đầu ra để đơn giản và để theo dõi lỗi backpropagated,

ExTôi,jtôi= =δTôi,jtôi

Sự đóng góp từ các trọng số

Sự tích chập được định nghĩa là

xTôi,jtôi= =ΣmΣnwm,ntôioTôi+m,j+ntôi-1+bTôi,jtôi

do đó,

xTôi,jtôiwm',n'tôi= =wm',n'tôi(ΣmΣnwm,ntôioTôi+m,j+ntôi-1+bTôi,jtôi)

m= =m'n= =n'

xTôi,jtôiwm',n'tôi= =oTôi+m',j+n'tôi-1

Sau đó trở lại trong thời hạn lỗi của chúng tôi

Ewm',n'tôi= =ΣTôi= =0H-k1Σj= =0W-k2δTôi,jtôioTôi+m',j+n'tôi-1

Độ dốc dốc ngẫu nhiên

w(t+1)= =w(t)-ηEwm',n'tôi

Hãy tính toán một vài trong số chúng

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')

mảng ([0,044606, 0,094061], [0,011262, 0,068288]])

Ew


Xin vui lòng cho tôi biết nếu có lỗi trong đạo hàm.


Cập nhật: Sửa mã


Ewm',n'tôi

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

Tôi muốn đề nghị xem lại câu trả lời này. Cụ thể, mã được cung cấp trong python có thể được kiểm tra
Duloren
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.