Kết hợp từ đầu
Động lực trên kho lưu trữ
Tôi đã cố gắng tìm thuật toán tích chập với sự giãn nở, được thực hiện từ đầu trên một con trăn thuần túy, nhưng không thể tìm thấy gì. Có rất nhiều CNN tự viết trên internet và trên github, v.v. của bất kỳ hình thức nào có thể điều chỉnh trên cả hai tham số trục, chẳng hạn như sải chân, đệm và quan trọng nhất là sự giãn nở. Cái cuối cùng không thể được tìm thấy theo nghĩa đen ở bất cứ đâu! Đây là lý do tại sao kho lưu trữ này và hình ảnh này đã xuất hiện.
Ai cần cái này?
Nếu bạn đã từng muốn hiểu làm thế nào thuật toán có vẻ đơn giản này có thể thực sự được thực hiện trong mã, kho lưu trữ này là dành cho bạn. Hóa ra, không dễ để gắn tất cả các tham số với nhau trong mã để làm cho nó chung chung, rõ ràng và rõ ràng [và tối ưu về mặt tính toán]. Hãy sử dụng nó như bạn muốn.
Feel free to use it as you wish.
Nội dung
- Giải trình
- Ý tưởng trong Nutshell
- Chi tiết về thực hiện [sớm]
- Cách sử dụng
- Ví dụ với ma trận và kernel của bạn
- Ví dụ với hình ảnh và bộ lọc của bạn
- Chạy thử nghiệm
- Trích dẫn
Giải trình
Ý tưởng trong Nutshell
Chi tiết về thực hiện [sớm]
This GIF [source] below perfectly presents the essence of the 2D convolution: green matrix is the Image, yellow is the Kernel and red coral is the Feature map:
Cách sử dụng
- Ví dụ với ma trận và kernel của bạn or input data is some matrix;
- Ví dụ với hình ảnh và bộ lọc của bạn is a small matrix that we multiply with sub-matrices of
an Image;
- Chạy thử nghiệm is the size of the step of the slide. For example, when the stride equals 1, we move on 1 pixel on every step, when 2, then we move on 2 pixels and so on. This picture can help you figure it out;
- Trích dẫn is just the border of the Image that allows us to keep the size of initial Image and Feature map the same. In the GIF above we see that the shape of Image is 5x5 but the Feature map is 3x3. The reason is that when we use Kernel, we can't put its center in the corner, because if we do, there is a lack of pixels to multiply on. So if we want to keep shape, we use padding and add some zero border of the image. This GIF can help you figure it out;
- Trong tích chập 2D, chúng tôi di chuyển một số ma trận nhỏ được gọi là kernel qua hình ảnh 2D [một số ma trận] và nhân phần yếu tố của nó lên trên mỗi ma trận phụ, sau đó tổng hợp các phần tử của ma trận phụ thu được thành một pixel của bản đồ tính năng được gọi là bản đồ. Chúng tôi di chuyển nó từ bên trái sang phải và từ trên xuống dưới. Vào cuối chập, chúng ta thường bao phủ toàn bộ bề mặt hình ảnh, nhưng điều đó không được đảm bảo với các tham số phức tạp hơn. GIF này [nguồn] dưới đây trình bày hoàn hảo bản chất của tích chập 2D: Ma trận màu xanh lá cây là hình ảnh, màu vàng là hạt nhân và san hô đỏ là bản đồ tính năng: is just the gap between kernel cells. So, the regular dilation is 1 and each cell is not distanced from its neighbor, but when we set the value as 2, there are no cells in the 1-cell neighborhood — now they are distanced from each other. This picture can help you figure it out.
- Hãy làm rõ nó và đưa ra một định nghĩa cho mọi thuật ngữ được sử dụng: or output data is the matrix obtained by all the calculations discussed earlier.
Dữ liệu hình ảnh hoặc đầu vào là một số ma trận;
Cách sử dụng
Ví dụ với ma trận và kernel của bạn
Ví dụ với hình ảnh và bộ lọc của bạn
matrix = np.array[[[1, 4, 4, 2, 1, 0, 0, 1, 0, 0, 3, 3, 3, 4], [0, 2, 0, 2, 0, 3, 4, 4, 2, 1, 1, 3, 0, 4], [1, 1, 0, 0, 3, 4, 2, 4, 4, 2, 3, 0, 0, 4], [4, 0, 1, 2, 0, 2, 0, 3, 3, 3, 0, 4, 1, 0], [3, 0, 0, 3, 3, 3, 2, 0, 2, 1, 1, 0, 4, 2], [2, 4, 3, 1, 1, 0, 2, 1, 3, 4, 4, 0, 2, 3], [2, 4, 3, 3, 2, 1, 4, 0, 3, 4, 1, 2, 0, 0], [2, 1, 0, 1, 1, 2, 2, 3, 0, 0, 1, 2, 4, 2], [3, 3, 1, 1, 1, 1, 4, 4, 2, 3, 2, 2, 2, 3]]]
Chạy thử nghiệm
kernel = np.array[[[0, 1, 3, 3, 2], [0, 1, 3, 1, 3], [1, 1, 2, 0, 2], [2, 2, 3, 2, 0], [1, 3, 1, 2, 0]]]
Trích dẫn
from convolution import conv2d feature_map = conv2d[matrix, kernel, stride=[2, 1], dilation=[1, 2], padding=[0, 0]]
Trong tích chập 2D, chúng tôi di chuyển một số ma trận nhỏ được gọi là kernel qua hình ảnh 2D [một số ma trận] và nhân phần yếu tố của nó lên trên mỗi ma trận phụ, sau đó tổng hợp các phần tử của ma trận phụ thu được thành một pixel của bản đồ tính năng được gọi là bản đồ. Chúng tôi di chuyển nó từ bên trái sang phải và từ trên xuống dưới. Vào cuối chập, chúng ta thường bao phủ toàn bộ bề mặt hình ảnh, nhưng điều đó không được đảm bảo với các tham số phức tạp hơn. GIF này [nguồn] dưới đây trình bày hoàn hảo bản chất của tích chập 2D: Ma trận màu xanh lá cây là hình ảnh, màu vàng là hạt nhân và san hô đỏ là bản đồ tính năng:
Hãy làm rõ nó và đưa ra một định nghĩa cho mọi thuật ngữ được sử dụng:
Dữ liệu hình ảnh hoặc đầu vào là một số ma trận;
import imageio import matplotlib.pyplot as plt import numpy as np gaussian_blur = np.array[[ [1, 2, 1], [2, 4, 2], [1, 2, 1] ]] / 16 image = imageio.imread['files/pic.jpg'] plt.imshow[image]
Kernel là một ma trận nhỏ mà chúng ta nhân với các ma trận phụ của hình ảnh;
I'm going to make this picture blurry:
filtered_image = apply_filter_to_image[image, gaussian_blur] plt.imshow[filtered_image]
Stride là kích thước của bước của slide. Ví dụ: khi sải chân bằng 1, chúng ta di chuyển trên 1 pixel trên mỗi bước, khi 2, thì chúng ta di chuyển trên 2 pixel, v.v. Hình ảnh này có thể giúp bạn tìm ra nó;
Đệm chỉ là đường viền của hình ảnh cho phép chúng ta giữ kích thước của hình ảnh ban đầu và bản đồ tính năng giống nhau. Trong GIF ở trên, chúng ta thấy rằng hình ảnh của hình ảnh là 5x5 nhưng bản đồ tính năng là 3x3. Lý do là khi chúng ta sử dụng kernel, chúng ta không thể đặt trung tâm của nó vào góc, bởi vì nếu chúng ta làm, thì thiếu pixel để nhân lên. Vì vậy, nếu chúng tôi muốn giữ hình dạng, chúng tôi sử dụng đệm và thêm một số đường viền bằng không của hình ảnh. GIF này có thể giúp bạn tìm ra nó;
Chạy thử nghiệm
python -m unittest tests.py
Trích dẫn
Trong tích chập 2D, chúng tôi di chuyển một số ma trận nhỏ được gọi là kernel qua hình ảnh 2D [một số ma trận] và nhân phần yếu tố của nó lên trên mỗi ma trận phụ, sau đó tổng hợp các phần tử của ma trận phụ thu được thành một pixel của bản đồ tính năng được gọi là bản đồ. Chúng tôi di chuyển nó từ bên trái sang phải và từ trên xuống dưới. Vào cuối chập, chúng ta thường bao phủ toàn bộ bề mặt hình ảnh, nhưng điều đó không được đảm bảo với các tham số phức tạp hơn. GIF này [nguồn] dưới đây trình bày hoàn hảo bản chất của tích chập 2D: Ma trận màu xanh lá cây là hình ảnh, màu vàng là hạt nhân và san hô đỏ là bản đồ tính năng:
@misc{Convolution from scratch,
author = {Detkov, Nikita},
title = {Implementation of the generalized 2D convolution with dilation from scratch in Python and NumPy},
year = {2020},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{//github.com/detkov/Convolution-From-Scratch}},
}
Hãy làm rõ nó và đưa ra một định nghĩa cho mọi thuật ngữ được sử dụng: