Trong mạng nơ ron tích chập (CNN), khi kết hợp hình ảnh, thao tác được sử dụng sản phẩm chấm hay tổng của phép nhân phần tử?


10

Ví dụ dưới đây được lấy từ các bài giảng trong deeplearning.ai cho thấy kết quả là tổng của sản phẩm theo từng yếu tố (hoặc "phép nhân phần tử". Các số màu đỏ biểu thị các trọng số trong bộ lọc:

(11)+(10)+(11)+(00)+(11)+(10)+(01)+(00)+(11)=1+0+1+0+1+0+0+0+1= =4

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

TUY NHIÊN, hầu hết các tài nguyên nói rằng đó là sản phẩm chấm được sử dụng:

"Chúng ta có thể diễn đạt lại đầu ra của nơ ron như là thuật ngữ thiên vị. Nói cách khác, chúng ta có thể tính toán đầu ra bằng y = f (x * w) trong đó b là thuật ngữ thiên vị. Nói cách khác, chúng ta có thể tính toán đầu ra bằng cách thực hiện sản phẩm chấm của vectơ đầu vào và trọng số, thêm vào thuật ngữ sai lệch để tạo logit, sau đó áp dụng hàm biến đổi. "

Buduma, Nikhil; Locascio, Nicholas. Nguyên tắc cơ bản của Deep Learning: Thiết kế thuật toán trí tuệ máy thế hệ tiếp theo (trang 8). Truyền thông O'Reilly. Phiên bản Kindle.

"Chúng tôi lấy bộ lọc 5 * 5 * 3 và trượt nó qua hình ảnh hoàn chỉnh và trên đường đi lấy sản phẩm chấm giữa bộ lọc và khối của hình ảnh đầu vào. Đối với mỗi sản phẩm chấm được thực hiện, kết quả là một vô hướng."

https://medium.com/t Technologycrafteasy /

"Mỗi nơ-ron nhận được một số đầu vào, thực hiện một sản phẩm chấm và tùy ý theo sau nó với tính phi tuyến tính."

http://cs231n.github.io/convolutional-networks/

"Kết quả của tích chập hiện tương đương với việc thực hiện một ma trận lớn nhân np.dot (W_row, X_col), để đánh giá sản phẩm chấm giữa mọi bộ lọc và mọi vị trí trường tiếp nhận."

http://cs231n.github.io/convolutional-networks/

Tuy nhiên, khi tôi nghiên cứu cách tính sản phẩm chấm của matrics , có vẻ như sản phẩm chấm không giống như tính tổng của phép nhân từng yếu tố. Hoạt động nào thực sự được sử dụng (nhân từng phần tử hoặc sản phẩm chấm?) Và sự khác biệt chính là gì?


1
Sản phẩm chấm không chính xác. Tôi muốn nói đó là tổng của Hadamard productgiữa vùng được chọn và hạt tích chập.
JP Zhang

nó là một sản phẩm chấm nhưng thay vì sử dụng toàn bộ ma trận tổng các bản vá được di chuyển dọc theo, vì vậy chúng tôi không thể sử dụng chức năng sản phẩm chấm vì chúng tôi sẽ phải lặp qua các ma trận khác nhau di chuyển miếng vá / cửa sổ xung quanh tất cả hình ảnh / ma trận
Mr-Programs

Câu trả lời:


13

Bất kỳ lớp nào trong CNN thường có 3 chiều (chúng tôi sẽ gọi chúng là chiều cao, chiều rộng, chiều sâu). Sự tích chập sẽ tạo ra một lớp mới với chiều cao, chiều rộng và chiều sâu mới (hoặc giống nhau). Tuy nhiên, hoạt động được thực hiện khác nhau về chiều cao / chiều rộng và khác nhau về độ sâu và đây là điều tôi nghĩ gây ra nhầm lẫn.

Trước tiên chúng ta hãy xem cách hoạt động tích chập trên chiều caochiều rộng của ma trận đầu vào. Trường hợp này được thực hiện chính xác như được mô tả trong hình ảnh của bạn và chắc chắn là phép nhân phần tử của hai ma trận .

Về lý thuyết : Các kết cấu
hai chiều (rời rạc) được tính theo công thức dưới đây:

C[m,n]= =ΣbạnΣυMột[m+bạn,n+υ]B[bạn,υ]

Như bạn có thể thấy mỗi phần tử của được tính là tổng của các sản phẩm của một phần tử duy nhất của với một phần tử duy nhất . Điều này có nghĩa rằng mỗi phần tử của được tính từ tổng của các nhân tố khôn ngoan của và .CMộtBCMộtB

Trong thực tế :
Bạn có thể kiểm tra ví dụ trên với bất kỳ số lượng gói nào (Tôi sẽ sử dụng scipy ):

import numpy as np
from scipy.signal import convolve2d

A = np.array([[1,1,1,0,0],[0,1,1,1,0],[0,0,1,1,1],[0,0,1,1,0],[0,1,1,0,0]])
B = np.array([[1,0,1],[0,1,0],[1,0,1]])
C = convolve2d(A, B, 'valid')
print(C)

Mã ở trên sẽ tạo ra:

[[4 3 4]
 [2 4 3]
 [2 3 4]]

Bây giờ, hoạt động tích chập trên độ sâu của đầu vào thực sự có thể được coi là một sản phẩm chấm vì mỗi phần tử có cùng chiều cao / chiều rộng được nhân với cùng một trọng số và chúng được cộng lại với nhau. Điều này thể hiện rõ nhất trong trường hợp các kết cấu 1x1 (thường được sử dụng để thao tác độ sâu của lớp mà không thay đổi kích thước của nó). Tuy nhiên, đây không phải là một phần của tích chập 2D (theo quan điểm toán học) mà là một lớp tích chập nào đó thực hiện trong CNN.

Lưu ý :
1: Điều đó đang được nói Tôi nghĩ rằng hầu hết các nguồn bạn cung cấp có giải thích sai lệch để nói ít nhất và không chính xác. Tôi đã không biết rất nhiều nguồn có hoạt động này (đây là hoạt động thiết yếu nhất trong CNN). Tôi đoán nó có liên quan đến thực tế là các kết quả tổng hợp sản phẩm giữa các vô hướng và sản phẩm giữa hai vô hướng cũng được gọi là một sản phẩm chấm .
2: Tôi nghĩ rằng tham chiếu đầu tiên đề cập đến một lớp được kết nối đầy đủ thay vì một lớp Convolutional. Nếu đó là trường hợp, một lớp FC thực hiện sản phẩm chấm như đã nêu. Tôi không có phần còn lại của bối cảnh để xác nhận điều này.

tl; dr Hình ảnh bạn cung cấp chính xác 100% về cách thao tác được thực hiện, tuy nhiên đây không phải là hình ảnh đầy đủ. Các lớp CNN có 3 chiều, hai trong số đó được xử lý như mô tả. Đề nghị của tôi sẽ là kiểm tra xem các lớp chập xử lý độ sâu của đầu vào như thế nào (trường hợp đơn giản nhất bạn có thể thấy là các kết cấu 1x1).


cảm ơn cho phản ứng. Theo đề xuất của bạn về việc nghiên cứu cách các lớp chập xử lý độ sâu của đầu vào - xem phần Trình diễn kết hợp tại liên kết này: cs231n.github.io/convolutional-networks . Tôi đã tính các số trong bảng tính và có vẻ như số cuối cùng trong khối lượng đầu ra chỉ là tổng của phép nhân phần tử của mỗi bộ lọc và trường tiếp nhận (tính tổng thành một số trên mỗi khối màu), sau đó là số ba con số vừa được cộng lại cùng với sự thiên vị ...
Ryan Chase

5
Có, điều tôi muốn chỉ ra là điều này tương đương với một sản phẩm chấm giữa vectơ pixel dọc theo chiều thứ ba (độ sâu, bộ lọc gọi nó là những gì bạn muốn) và trọng lượng vô hướng của hạt nhân chập.
Djib2011

3

Hoạt động này được gọi là tích chập bao gồm một tổng số phần tử bằng cách nhân phần tử, lần lượt giống như một sản phẩm chấm trên ma trận đa chiều mà ML folks gọi là tenxơ. Nếu bạn viết nó dưới dạng một vòng lặp, nó sẽ trông giống như mã Python giả này:

for i in 0:3:
  for j in 0:3:
    s = 0
    for k in 0:3:
      for l in 0:3:
        s += A[i+k,j+l]*C[k,l]
    Z[i,j] = s

Ở đây A là ma trận đầu vào 5x5 của bạn, C là bộ lọc 3x3 và Z là ma trận đầu ra 3x3.

Sự khác biệt tinh tế với một sản phẩm chấm là thông thường một sản phẩm chấm nằm trên toàn bộ các vectơ, trong khi tích chập bạn thực hiện sản phẩm chấm trên tập con di chuyển (cửa sổ) của ma trận đầu vào, bạn có thể viết nó như sau để thay thế hai phần trong cùng được lồng vào nhau các vòng lặp trong đoạn mã trên:

Z[i,j] = dot(A[i:i+2,j:j+2],C)

0

Tôi tin rằng mấu chốt là khi bộ lọc kết hợp một phần của hình ảnh ("trường tiếp nhận"), mỗi số trong bộ lọc (tức là mỗi trọng lượng) trước tiên được làm phẳng thành định dạng vector . Tương tự, các pixel của hình ảnh cũng được làm phẳng thành định dạng vector . THEN, sản phẩm chấm được tính toán. Đó là điều tương tự chính xác với việc tìm tổng của phép nhân từng phần tử (phần tử-khôn ngoan).

Tất nhiên, các vectơ dẹt này cũng có thể được kết hợp theo định dạng ma trận, như hình ảnh dưới đây cho thấy. Trong trường hợp này, phép nhân ma trận thực có thể được sử dụng, nhưng điều quan trọng cần lưu ý là làm phẳng các pixel hình ảnh từ mỗi tích chập và cả bộ lọc trọng số là tiền thân.

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

tín dụng hình ảnh: TensorFlow và Deep Learning mà không cần bằng tiến sĩ, Phần 1 (Google Cloud Next '17)

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.