Hiệu gắn lại bài viết. Sau lúc đăng tải, một số chuyên gia góp ý thực chất thuật toán thù vận dụng vào CNN là cross correlation chứ đọng không hẳn là convolution. đa phần thiết kế viên viết tlỗi viện Deep Learning tất cả chút lầm lẫn hoặc quen thuộc miệng giữa 2 thuật toán này vì chưng chúng khá tương đương nhau. Nếu Kernel matrix đối xứng trên cùng với dưới, trái và bắt buộc thì công dụng Convolution cùng Correlation đồng nhất nhau.
Bạn đang xem: Tích chập là gì
Tsay đắm khảo thêm tại đây nhéDo convolutional neural networks flip the kernel?https://www.youtube.com/watch?v=MQm6ZP1F6mshttps://www.youtube.com/watch?v=C3EEy8adxvc
Convolution là 1 trong những kỹ thuật đặc trưng giải pháp xử lý hình ảnh (digital image processing). Nó xuất hiện vào phần đông những thuật toán làm cho mờ (Gausian Blur), giỏi làm rõ các mặt đường (edge detector). Trong thừa nhận dạng ảnh (deep learning image processing), convolution layer là 1 tầng đổi khác ma trận đầu vào đểnắm rõ và bóc tách ra những đặc tính của hình hình họa nhưng mà vẫn bảo toàn tính tương quan không gian thân đầu ra với nguồn vào.

Convolution hay có cách gọi khác là tích chập cũng rất được sử dụng trong phxay biến hóa Fourrier dẫu vậy vẫn thay đổi trường đoản cú miền thời gian quý phái tần số hoặc ngược trở lại.
Cách 1: Thí nghiệm cách xử lý hình ảnh trực quan lại bên trên setosa.io
Hãy vào website site nàyhttp://setosa.io/ev/image-kernels/để thưởng thức với kernel không giống nhau tác dụng đầu ra đang khác nhau như thế nào. Nếu đọc được phân tích này, các bước tiếp sau bạn sẽ thấy siêu dễ ợt.
Cách 2: Thí nghiệm cùng với ma trận đầy đủ nhỏ
Thứ nhất thử nghiệm cùng với ma trận image đầu vào đủ nhỏ để tính toán thủ công bằng tay và khám nghiệm hiệu quả đã!
Bên trái là ma trận đầu vào, có thể là hình họa. Bên đề nghị là kernel là một trong những ma trận dùng để đổi khác ma trận đầu vào trong 2 vòng lặp lồng nhau convolution.Từ trái qua bắt buộc, từ bỏ bên trên xuống bên dưới dịch rời cửa sổ bao gồm kích thước bằng với kernel trên ma trận đầu vào, thực hiện phép nhân từng phần tử cùng địa chỉ ở ma trận cửa ngõ số với kernel rồi tính tổng ra giá trị scalar điền vào ma trận công dụng. Đây call là dot product



Có vài ba điểm cần lưu ý:
Tích chập đổi khác những điểm hình ảnh nằm kề nhau vào ma trận cửa ngõ sổMa trận kernel tất cả hàng cùng cột là số lẻ để quý hiếm dot product gán được vào ô ở trung tâm, ma trận đầu dôi một sản phẩm, một cộtKhông duy nhất thiết yêu cầu cân nhau, như thông thường kernel là ma trận vuôngKết quả sau tích chập convolution có khả năng sẽ bị hụt đi vài ba mặt hàng và cột. ví dụ như kernel matrix là (3x3), thì hụt 2 mặt hàng, 2 cột, kernel matrix (4, 4) vẫn hụt 3 mặt hàng, 3 cột.Xem thêm: Novice Là Gì - Nghĩa Của Từ Novice Trong Tiếng Việt
Cách 3: Code demo nghiệm
Đây là code ban đầu không buổi tối ưu, cần sử dụng nhiều vòng lặp lồng nhau, đặc biệt là dễ nắm bắt. Định nghĩa convolve_nest_loop vào file convolute_lib.py
def convolve_nest_loop(img, kernel): img_height = img.shape<0> img_width = img.shape<1> kernel_height = kernel.shape<0> kernel_width = kernel.shape<1> H = (kernel_height - 1) // 2 W = (kernel_width - 1) // 2 out = np.zeros((img_height, img_width)) for i in np.arange(H, img_height - H): for j in np.arange(W, img_width - W): sum = 0 for k in np.arange(-H, H + 1): for l in np.arange(-W, W + 1): a = img w = kernel
import numpy as npimport convolute_lib as cnnin_img = np.array(<<1, 0, 0, 1, 0>, <0, 1, 1, 0, 1>, <1, 0, 1, 0, 1>, <1, 0, 0, 1, 1>, <0, 1, 1, 0, 1> >)kernel = np.array(<<1, 0, 0>, <0, 1, 1>, <1, 0, 1>>)out_img = cnn.convolve_nest_loop(in_img, kernel)with np.printoptions(suppress=True): print(out_img)Kết trái ra được là ma trận thuộc kích cỡ bởi ma trận nguồn vào tuy vậy bao phủ viền toàn là số 0, thực tế các phần tử này không được ghi cực hiếm vào vào phxay tích chập.
<<0. 0. 0. 0. 0.> <0. 5. 1. 3. 0.> <0. 2. 3. 3. 0.> <0. 2. 2. 5. 0.> <0. 0. 0. 0. 0.>>
Cách 4: vậy 2 vòng lặp bởi np.tensordot
xúc tích và ngắn gọn code này hoàn toàn có thể cố bằng numpy tensordot. Code ngọn và chạy nhanh hơnsum = 0for k in np.arange(-H, H + 1): for l in np.arange(-W, W + 1): a = img w = kernel
for i in np.arange(H, img_height - H): for j in np.arange(W, img_width - W): out = np.tensordot(img, kernel, axes=((0, 1), (0, 1)))Bước 5: vứt padding zero sinh sống ma trận đầu ra hoặc thêm padding zero ngơi nghỉ ma trận đầu vào
Trong tệp tin convolute_lib.py có một vài hàm :
File thực hành thực tế làhttps://github.com/xemlienminh360.net/CythonOpenCV/blob/master/Convolution/Convolute_Basic.py
Chúng ta chỉ tập trung vàodef convolve_np4(img, kernel): vì chưng nó giữ nguyên kích cỡ ma trận sau biến đổi. Trong các bài xích tiếp theo tôi đang lý giải qui định của pool layer vào Convolution Network, pool layer bắt đầu thực sự thu nhỏ dại lại kích cỡ của ma trận.
def convolve_np4(img, kernel): img_height = img.shape<0> img_width = img.shape<1> kernel_height = kernel.shape<0> kernel_width = kernel.shape<1> H = (kernel_height - 1) // 2 W = (kernel_width - 1) // 2 out = np.zeros((img_height, img_width)) img = cv2.copyMakeBorder(img, H, H, W, W, cv2.BORDER_REPLICATE) for i in np.arange(H, img_height + 1): for j in np.arange(W, img_width + 1): out = np.tensordot(img, kernel, axes=((0, 1), (0, 1))) return outBước 6: kiểm test hàm convolute
Để bình chọn hàm convolute có xây dựng đúng hay không hãy sử dụng kernel là ma trận identity,phần tửchính giữabằng 1, còn lại bằng 0 tất .Kết quả ma trận cổng đầu ra buộc phải tương đương không còn ma trận đầu vào là được.
import numpy as npimport convolute_lib as cnnin_img = np.array(<<1, 0, 0, 1, 0>, <0, 1, 1, 0, 1>, <1, 0, 1, 0, 1>, <1, 0, 0, 1, 1>, <0, 1, 1, 0, 1> >)identity = np.array(( <0, 0, 0>, <0, 1, 0>, <0, 0, 0>))out_img = cnn.convolve_np4(in_img, identity)with np.printoptions(suppress=True): print(out_img)
Kết luận
Convolution, tích chập thực tế cũng đơn giản và dễ dàng rò rỉ, mấy vòng lặp for là cách xử lý ngon lành. Tuy nhiên vào ứng dụng thực tiễn, tăng tốc cách xử lý hàm này new là cthị xã đáng bànTxuất xắc do chỉ gọi những paper bí quyết toán trừu tượng, mình chọn lựa cách lập trình để kiểm hội chứng. Tất nhiên tôi cũng tham khảo từ rất nhiều người sáng tác không giống, trong những lúc lập trình sẵn đúc rút được không ít điều thú vui nlỗi giải pháp xử lý padding zero, về tối ưu tốc độ thực thi, tại sao trong 2 vòng lặp dịch ma trận hành lang cửa số của hàm convolve_np4 lại nên cộng thêm 1 sinh sống quý giá stop...Trong bài sau, mình sử dụng tlỗi viện convolution code sinh hoạt bài bác này nhằm tạo ra một loạt hiệu ứng giải pháp xử lý hình họa siêu cool.