Tích chập là gì

  -  

Giờ chúng ta đã hiểu cách các tầng tích chập hoạt động trên lý thuyết,hãy xem chúng hoạt động trong thực tế như thế nào. Dựa vào ý tưởng mạngnơ-ron tích chập là kiến trúc hiệu quả để khám phá cấu trúc của dữ liệuảnh, chúng tôi vẫn sẽ sử dụng loại dữ liệu này khi lấy ví dụ.

Bạn đang xem: Tích chập là gì


6.2.1. Toán tử Tương quan Chéo¶

Như ta đã biết, tầng tích chập là cái tên có phần không chính xác, vìphép toán mà chúng biểu diễn là phép tương quan chéo (crosscorrelation). Trong một tầng tích chập, một mảng đầu vào và một mảnghạt nhân tương quan được kết hợp để tạo ra mảng đầu ra bằng phép toántương quan chéo. Hãy tạm thời bỏ qua chiều kênh và xem phép toán nàyhoạt động như thế nào với dữ liệu và biểu diễn ẩn hai chiều. TrongFig. 6.2.1, đầu vào là một mảng hai chiều với chiều dài3 và chiều rộng 3. Ta kí hiệu kích thước của mảng là \(3 \times 3\)hoặc (\(3\), \(3\)). Chiều dài và chiều rộng của hạt nhân đều là2. Chú ý rằng trong cộng đồng nghiên cứu học sâu, mảng này còn có thểđược gọi là hạt nhân tích chập, bộ lọc hay đơn thuần là trọng sốcủa tầng. Kích thước của cửa sổ hạt nhân là chiều dài và chiều rộng củahạt nhân (ở đây là \(2 \times 2\)).


*

Fig. 6.2.1 Phép tương quan chéo hai chiều. Các phần được tô màu là phần tử đầutiên của đầu ra cùng với các phần tử của mảng đầu vào và mảng hạtnhân được sử dụng trong phép toán:\(0\times0+1\times1+3\times2+4\times3=19\).¶


Trong phép tương quan chéo hai chiều, ta bắt đầu với cửa sổ tích chậpđặt tại vị trí góc trên bên trái của mảng đầu vào và di chuyển cửa sổnày từ trái sang phải và từ trên xuống dưới. Khi cửa sổ tích chập đượcđẩy tới một vị trí nhất định, mảng con đầu vào nằm trong cửa sổ đó vàmảng hạt nhân được nhân theo từng phần tử, rồi sau đó ta lấy tổng cácphần tử trong mảng kết quả để có được một giá trị số vô hướng duy nhất.Giá trị này được ghi vào mảng đầu ra tại vị trí tương ứng. Ở đây, mảngđầu ra có chiều dài 2 và chiều rộng 2, với bốn phần tử được tính bằngphép tương quan chéo hai chiều:


(6.2.1)¶\<\begin{split}0\times0+1\times1+3\times2+4\times3=19,\\1\times0+2\times1+4\times2+5\times3=25,\\3\times0+4\times1+6\times2+7\times3=37,\\4\times0+5\times1+7\times2+8\times3=43.\end{split}\>

Lưu ý rằng theo mỗi trục, kích thước đầu ra nhỏ hơn một chút so vớiđầu vào. Bởi vì hạt nhân có chiều dài và chiều rộng lớn hơn một, ta chỉcó thể tính độ tương quan chéo cho những vị trí mà ở đó hạt nhân nằmhoàn toàn bên trong ảnh, kích thước đầu ra được tính bằng cách lấy đầuvào \(H \times W\) trừ kích thước của bộ lọc tích chập\(h \times w\) bằng \((H-h+1) \times (W-w+1)\). Điều này xảy ravì ta cần đủ không gian để ‘dịch chuyển’ hạt nhân tích chập qua tấm hình(sau này ta sẽ xem làm thế nào để có thể giữ nguyên kích thước bằng cáchđệm các số không vào xung quanh biên của hình ảnh sao cho có đủ khônggian để dịch chuyển hạt nhân). Kế tiếp, ta lập trình quá trình ở trêntrong hàm corr2d. Hàm này nhận mảng đầu vào X với mảng hạt nhânK và trả về mảng đầu ra Y.


from mxnet import autograd, np, npxfrom mxnet.gluon import nnnpx.set_np()# Saved in the vietvuevent.vn package for later usedef corr2d(X, K): """Compute 2D cross-correlation.""" h, w = K.shape Y = np.zeros((X.shape<0> - h + 1, X.shape<1> - w + 1)) for i in range(Y.shape<0>): for j in range(Y.shape<1>): Y = (X * K).sum() return Y
Ta có thể xây dựng mảng đầu vào X và mảng hạt nhân K như hìnhtrên để kiểm tra lại kết quả của cách lập trình phép toán tương quanchéo hai chiều vừa rồi.


6.2.2. Tầng Tích chập¶

Tầng tích chập thực hiện phép toán tương quan chéo giữa đầu vào và hạtnhân, sau đó cộng thêm một hệ số điều chỉnh để có được đầu ra. Hai thamsố của tầng tích chập là hạt nhân và hệ số điều chỉnh. Khi huấn luyện môhình chứa các tầng tích chập, ta thường khởi tạo hạt nhân ngẫu nhiên,giống như cách ta làm với tầng kết nối đầy đủ.

Bây giờ ta đã sẵn sàng lập trình một tầng tích chập hai chiều dựa vàohàm corr2d ta vừa định nghĩa ở trên. Trong hàm khởi tạo__init__, ta khai báo hai tham số của mô hình weight vàbias. Hàm tính lượt truyền xuôi forward gọi hàm corr2d vàcộng thêm hệ số điều chỉnh. Cũng giống cách gọi phép tương quan chéo\(h \times w\), ta cũng gọi các tầng tích chập là phép tích chập\(h \times w\).


class Conv2D(nn.Block): def __init__(self, kernel_size, **kwargs): super(Conv2D, self).__init__(**kwargs) self.weight = self.params.get('weight', shape=kernel_size) self.bias = self.params.get('bias', shape=(1,)) def forward(self, x): return corr2d(x, self.weight.data()) + self.bias.data()

6.2.3. Phát hiện Biên của Vật thể trong Ảnh¶

Hãy quan sát một ứng dụng đơn giản của tầng tích chập: phát hiện đườngbiên của một vật thể trong một bức ảnh bằng cách xác định vị trí cácđiểm ảnh thay đổi. Đầu tiên, ta dựng một ‘bức ảnh’ có kích thước là\(6\times 8\) điểm ảnh. Bốn cột ở giữa có màu đen (giá trị 0) và cáccột còn lại có màu trắng (giá trị 1).


array(<<1., 1., 0., 0., 0., 0., 1., 1.>, <1., 1., 0., 0., 0., 0., 1., 1.>, <1., 1., 0., 0., 0., 0., 1., 1.>, <1., 1., 0., 0., 0., 0., 1., 1.>, <1., 1., 0., 0., 0., 0., 1., 1.>, <1., 1., 0., 0., 0., 0., 1., 1.>>)
Sau đó, ta tạo một hạt nhân K có chiều cao bằng \(1\) và chiềurộng bằng \(2\). Khi thực hiện phép tương quan chéo với đầu vào, nếuhai phần tử cạnh nhau theo chiều ngang có giá trị giống nhau thì đầu rasẽ bằng 0, còn lại đầu ra sẽ khác không.


Ta đã sẵn sàng thực hiện phép tương quan chéo với các đối số X (đầuvào) và K (hạt nhân). Bạn có thể thấy rằng các vị trí biên trắng đổithành đen có giá trị 1, còn các vị trí biên đen đổi thành trắng có giátrị -1. Các vị trí còn lại của đầu ra có giá trị 0.

Xem thêm: "Be Up To My Ears Là Gì - Các Thành Ngữ Tiếng Anh Về 'Tai'


array(<< 0., 1., 0., 0., 0., -1., 0.>, < 0., 1., 0., 0., 0., -1., 0.>, < 0., 1., 0., 0., 0., -1., 0.>, < 0., 1., 0., 0., 0., -1., 0.>, < 0., 1., 0., 0., 0., -1., 0.>, < 0., 1., 0., 0., 0., -1., 0.>>)
Bây giờ hãy áp dụng hạt nhân này cho chuyển vị của ma trận điểm ảnh. Nhưkỳ vọng, giá trị tương quan chéo bằng không. Hạt nhân K chỉ có thểphát hiện biên dọc.


array(<<0., 0., 0., 0., 0.>, <0., 0., 0., 0., 0.>, <0., 0., 0., 0., 0.>, <0., 0., 0., 0., 0.>, <0., 0., 0., 0., 0.>, <0., 0., 0., 0., 0.>, <0., 0., 0., 0., 0.>, <0., 0., 0., 0., 0.>>)

6.2.4. Học một Bộ lọc¶

Việc thiết kế bộ phát hiện biên bằng sai phân hữu hạn <1, -1> thìkhá gọn gàng nếu ta biết chính xác đây là những gì cần làm. Tuy nhiên,khi xét tới các bộ lọc lớn hơn và các tầng tích chập liên tiếp, việc chỉđịnh chính xác mỗi bộ lọc cần làm gì một cách thủ công là bất khả thi.

Bây giờ ta hãy xem liệu có thể học một bộ lọc có khả năng tạo ra YtừX chỉ từ các cặp (đầu vào, đầu ra) hay không. Đầu tiên chúng taxây dựng một tầng tích chập và khởi tạo một mảng ngẫu nhiên làm bộ lọc.Tiếp theo, trong mỗi lần lặp, ta sẽ sử dụng bình phương sai số để sosánh Y và đầu ra của tầng tích chập, sau đó tính toán gradient đểcập nhật trọng số. Để đơn giản, trong tầng tích chập này, ta sẽ bỏ quahệ số điều chỉnh.

Trước đây ta đã tự xây dựng lớp Conv2D. Tuy nhiên, do ta sử dụng cácphép gán một phần tử, Gluon sẽ gặp một số khó khăn khi tính gradient.Thay vào đó, ta sử dụng lớp Conv2D có sẵn của Gluon như sau.


# Construct a convolutional layer with 1 output channel# (channels will be introduced in the following section)# and a kernel array shape of (1, 2)conv2d = nn.Conv2D(1, kernel_size=(1, 2))conv2d.initialize()# The two-dimensional convolutional layer uses four-dimensional input and# output in the format of (example, channel, height, width), where the batch# size (number of examples in the batch) and the number of channels are both 1X = X.reshape(1, 1, 6, 8)Y = Y.reshape(1, 1, 6, 7)for i in range(10): with autograd.record(): Y_hat = conv2d(X) l = (Y_hat - Y) ** 2 l.backward() # For the sake of simplicity, we ignore the bias here conv2d.weight.data()<:> -= 3e-2 * conv2d.weight.grad() if (i + 1) % 2 == 0: print('batch %d, loss %.3f' % (i + 1, l.sum()))
Có thể thấy sai số đã giảm xuống còn khá nhỏ sau 10 lần lặp. Bây giờ hãyxem mảng bộ lọc đã học được.


conv2d.weight.data().reshape(1, 2)
array(<< 0.9895 , -0.9873705>>)
Thật vậy, mảng bộ lọc học được rất gần với mảng bộ lọc K mà ta tựđịnh nghĩa trước đó.


6.2.5. Tương quan Chéo và Tích chập¶

Hãy nhớ lại kiến thức của phần trước về mối liên hệ giữa phép tương quanchéo và tích chập. Trong hình trên, ta dễ dàng nhận thấy điều này. Đơngiản chỉ cần lật bộ lọc từ góc dưới cùng bên trái lên góc trên cùng bênphải. Trong trường hợp này, chỉ số trong phép lấy tổng được đảo ngược,nhưng ta vẫn thu được kết quả tương tự. Để thống nhất với các thuật ngữtiêu chuẩn trong tài liệu học sâu, ta sẽ tiếp tục đề cập đến phép tươngquan chéo như là phép tích chập, mặc dù đúng ra chúng hơi khác nhau mộtchút.

Xem thêm: Briefly Là Gì ? Nghĩa Của Từ Briefly


6.2.6. Tóm tắt¶

Về cốt lõi, phần tính toán của tầng tích chập hai chiều là phép tươngquan chéo hai chiều. Ở dạng đơn giản nhất, phép tương quan chéo thaotác trên dữ liệu đầu vào hai chiều và bộ lọc, sau đó cộng thêm hệ sốđiều chỉnh.Chúng ta có thể thiết kế bộ lọc để phát hiện các biên trong ảnh.Chúng ta có thể học các tham số của bộ lọc từ dữ liệu.

6.2.7. Bài tập¶

Xây dựng hình ảnh X với các cạnh chéo.Điều gì xảy ra nếu bạn áp dụng bộ lọc K lên nó?Điều gì xảy ra nếu bạn chuyển vị X?Điều gì xảy ra nếu bạn chuyển vị K?Khi thử tự động tìm gradient cho lớp Conv2D mà ta đã tạo, bạnthấy loại thông báo lỗi nào?Làm thế nào để bạn biểu diễn một phép tính tương quan chéo như là mộtphép nhân ma trận bằng cách thay đổi các mảng đầu vào và mảng bộ lọc?Hãy thiết kế thủ công một số bộ lọc sau.Bộ lọc để tính đạo hàm bậc hai có dạng như thế nào?Bộ lọc của toán tử Laplace là gì?Bộ lọc của phép tích phân là gì?Kích thước tối thiểu của bộ lọc để có được đạo hàm bậc \(d\)là bao nhiêu?

6.2.9. Những người thực hiện¶

Bản dịch trong trang này được thực hiện bởi:

Đoàn Võ Duy ThanhNguyễn Văn CườngLê Khắc Hồng PhúcPhạm Hồng VinhLý Phi LongPhạm Minh ĐứcTrần Yến Thy