Các lớp giải mã là gì?


188

Gần đây tôi đã đọc Mạng đầy đủ kết hợp cho phân đoạn ngữ nghĩa của Jonathan Long, Evan Shelhamer, Trevor Darrell. Tôi không hiểu "các lớp giải mã" làm gì / chúng hoạt động như thế nào.

Phần có liên quan là

3.3. Upsampling là tích chập ngược

Một cách khác để kết nối đầu ra thô với các pixel dày đặc là nội suy. Ví dụ, phép nội suy song tuyến tính đơn giản tính toán từng đầu ra từ bốn đầu vào gần nhất bằng một bản đồ tuyến tính chỉ phụ thuộc vào vị trí tương đối của các ô đầu vào và đầu ra. Theo một nghĩa nào đó, upampling với yếu tố f là tích chập với bước tiến đầu vào phân đoạn là 1 / f. Vì vậy, miễn là f là tích phân, do đó, một cách tự nhiên để lấy mẫu là tích chập ngược (đôi khi được gọi là giải mã) với bước tiến đầu ra là f . Một hoạt động như vậy là không đáng kể để thực hiện, vì nó chỉ đơn giản là đảo ngược các bước tiến và lùi của tích chập.yij
fff
Do đó, việc lấy mẫu được thực hiện trong mạng để học từ đầu đến cuối bằng cách truyền ngược từ mất pixel.
Lưu ý rằng bộ lọc giải mã trong một lớp như vậy không cần phải được sửa chữa (ví dụ, để lấy mẫu song tuyến), nhưng có thể học được. Một chồng các lớp giải mã và các hàm kích hoạt thậm chí có thể học được cách lấy mẫu phi tuyến.
Trong các thử nghiệm của chúng tôi, chúng tôi thấy rằng việc lấy mẫu trong mạng là nhanh và hiệu quả để học dự đoán dày đặc. Kiến trúc phân đoạn tốt nhất của chúng tôi sử dụng các lớp này để tìm hiểu mẫu cho dự đoán được tinh chỉnh trong Phần 4.2.

Tôi không nghĩ rằng tôi thực sự hiểu làm thế nào các lớp chập được đào tạo.

Điều tôi nghĩ rằng tôi đã hiểu là các lớp chập với kích thước hạt nhân tìm hiểu các bộ lọc có kích thước k × k . Đầu ra của một lớp chập có kích thước hạt nhân k , các bộ lọc s Nn có kích thước Đầu vào mờkk×kksNn. Tuy nhiên, tôi không biết cách học của các lớp chập hoạt động. (Tôi hiểu cách MLP đơn giản học với độ dốc giảm dần, nếu điều đó có ích).Input dims2n

Vì vậy, nếu sự hiểu biết của tôi về các lớp chập là chính xác, tôi không biết làm thế nào điều này có thể đảo ngược.

Bất cứ ai có thể xin vui lòng giúp tôi để hiểu các lớp giải mã?


3
Bài giảng video này giải thích về việc giải mã / tăng tốc: youtu.be/ByjaPdWXKJ4?t=16m59s
user199309

6
Hy vọng nó có thể hữu ích với bất kỳ ai, tôi đã tạo ra một cuốn sổ tay để khám phá cách tích chập và tích chập chuyển đổi có thể được sử dụng trong TensorFlow (0.11). Có lẽ có một số ví dụ và số liệu thực tế có thể giúp thêm một chút để hiểu cách chúng hoạt động.
AkiRoss

1
Đối với tôi, trang này đã cho tôi một lời giải thích tốt hơn, nó cũng giải thích sự khác biệt giữa giải mã và tích chập chuyển vị: directiondatascience.com/
T.Antoni

Không phải là upampling giống như gộp ngược hơn là tích chập ngược, vì nó không có tham số?
Ken Fehling

Lưu ý: Tên "lớp giải mã" là sai lệch vì lớp này không thực hiện giải mã .
user76284

Câu trả lời:


210

Lớp giải mã là một cái tên rất đáng tiếc và nên được gọi là lớp chập chuyển vị .

Trực quan, đối với một tích chập chuyển tiếp với sải chân một và không có phần đệm, chúng ta chỉ cần đệm đầu vào ban đầu (các mục màu xanh) bằng các số 0 (các mục trắng) (Hình 1).

Hình 1

Trong trường hợp sải hai và đệm, tích chập chuyển đổi sẽ trông như thế này (Hình 2):

Hình 2

Bạn có thể tìm thấy nhiều hình ảnh (tuyệt vời) của mỹ phẩm chập chững ở đây .


16
Chỉ để chắc chắn rằng tôi hiểu nó: "Giải mã" gần giống như tích chập, nhưng bạn thêm một số phần đệm? (Xung quanh hình ảnh / khi s> 1 cũng xung quanh mỗi pixel)?
Martin Thoma

17
Vâng, một lớp giải mã thực hiện cũng tích chập! Đó là lý do tại sao tích chập chuyển đổi phù hợp tốt hơn nhiều như tên và thuật ngữ giải mã thực sự gây hiểu nhầm.
David Dao

11
Tại sao bạn nói "không có đệm" trong Hình 1, nếu thực sự đầu vào là không đệm?
Stas S

8
Nhân tiện: Nó được gọi là tích chập chuyển đổi ngay bây giờ trong TensorFlow: tenorflow.org/versions/r0.10/api_docs/python/ trộm
Martin Thoma

9
Cảm ơn vì câu trả lời rất trực quan này, nhưng tôi bối rối về lý do tại sao cái thứ hai là trường hợp 'sải hai', nó hoạt động chính xác như câu thứ nhất khi kernel di chuyển.
Chứng minh

49

Tôi nghĩ rằng một cách để có được một trực giác cấp độ cơ bản thực sự đằng sau sự tích chập là bạn đang trượt các bộ lọc K, mà bạn có thể nghĩ là K tô, qua hình ảnh đầu vào và tạo ra các kích hoạt K - mỗi cái đại diện cho một mức độ khớp với một stprint cụ thể . Hoạt động nghịch đảo của điều đó sẽ là thực hiện kích hoạt K và mở rộng chúng thành tiền đề của hoạt động tích chập. Do đó, lời giải thích trực quan của thao tác nghịch đảo là, đại khái, việc tái tạo hình ảnh đã cho các khuôn tô (bộ lọc) và kích hoạt (mức độ khớp của từng khuôn tô) và do đó ở cấp độ trực quan cơ bản, chúng tôi muốn làm nổ tung mỗi lần kích hoạt bằng mặt nạ của khuôn tô và thêm chúng lên.

Một cách khác để tiếp cận sự hiểu biết về deconv là kiểm tra việc thực hiện lớp giải mã trong Caffe, xem các đoạn mã liên quan sau:

DeconvolutionLayer<Dtype>::Forward_gpu
ConvolutionLayer<Dtype>::Backward_gpu
CuDNNConvolutionLayer<Dtype>::Backward_gpu
BaseConvolutionLayer<Dtype>::backward_cpu_gemm

Bạn có thể thấy rằng nó được triển khai trong Caffe chính xác như backprop cho lớp tích chập chuyển tiếp thông thường (với tôi rõ ràng hơn sau khi tôi so sánh việc triển khai backprop trong lớp đối lưu cuDNN so với ConvolutionLayer :: Backward_gpu được triển khai bằng GEMM). Vì vậy, nếu bạn làm việc thông qua cách truyền ngược được thực hiện để tích chập thường xuyên, bạn sẽ hiểu điều gì xảy ra ở mức độ tính toán cơ học. Cách tính toán này hoạt động phù hợp với trực giác được mô tả trong đoạn đầu tiên của trò chơi này.

Tuy nhiên, tôi không biết cách học của các lớp chập hoạt động. (Tôi hiểu cách MLP đơn giản học với độ dốc giảm dần, nếu điều đó có ích).

Để trả lời câu hỏi khác của bạn bên trong câu hỏi đầu tiên của bạn, có hai điểm khác biệt chính giữa quá trình truyền ngược MLP (lớp được kết nối đầy đủ) và lưới chập:

1) ảnh hưởng của các trọng số được bản địa hóa, do đó, trước tiên hãy tìm hiểu cách thực hiện backprop cho, bộ lọc 3x3 được kết hợp với diện tích 3x3 nhỏ của hình ảnh đầu vào, ánh xạ tới một điểm duy nhất trong hình ảnh kết quả.

2) trọng số của các bộ lọc tích chập được chia sẻ cho bất biến không gian. Điều này có nghĩa trong thực tế là trong chuyển tiếp vượt qua cùng một bộ lọc 3x3 có cùng trọng số được kéo qua toàn bộ hình ảnh có cùng trọng số để tính toán chuyển tiếp để tạo ra hình ảnh đầu ra (cho bộ lọc cụ thể đó). Điều này có nghĩa gì đối với backprop là độ dốc backprop cho mỗi điểm trong ảnh nguồn được tính tổng trên toàn bộ phạm vi mà chúng ta đã kéo bộ lọc đó trong suốt quá trình chuyển tiếp. Lưu ý rằng cũng có các độ dốc khác nhau của wrt x, w và bias vì dLoss / dx cần được sao lưu và dLoss / dw là cách chúng tôi cập nhật các trọng số. w và bias là các đầu vào độc lập trong DAG tính toán (không có đầu vào trước), do đó không cần phải thực hiện backpropagation trên những cái đó.

(my notation here assumes that convolution is y = x*w+b where '*' is the convolution operation)

7
Tôi nghĩ rằng đây là câu trả lời tốt nhất cho câu hỏi này.
kli_nlpr

8
Tôi đồng ý rằng đây là câu trả lời tốt nhất. Câu trả lời hàng đầu có hình ảnh động khá đẹp, nhưng cho đến khi tôi đọc câu trả lời này, chúng trông giống như những kết luận thông thường với một số phần đệm tùy ý đối với tôi. Ôi mọi người bị lắc lư bởi kẹo mắt.
Reii Nakano

1
Đồng ý, câu trả lời được chấp nhận không giải thích bất cứ điều gì. Điều này tốt hơn nhiều.
BjornW 27/03/18

Cảm ơn lời giải thích tuyệt vời của bạn. Hiện tại tôi không thể tìm ra cách thực hiện backprop đúng cách. Bạn có thể cho tôi một gợi ý về điều đó xin vui lòng?
Bastian

33

Từng bước toán học giải thích cách tích chập chuyển vị làm tăng gấp đôi với bộ lọc 3x3 và sải chân 2:

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

Đoạn mã TensorFlow đơn giản nhất để xác thực toán học:

import tensorflow as tf
import numpy as np

def test_conv2d_transpose():
    # input batch shape = (1, 2, 2, 1) -> (batch_size, height, width, channels) - 2x2x1 image in batch of 1
    x = tf.constant(np.array([[
        [[1], [2]], 
        [[3], [4]]
    ]]), tf.float32)

    # shape = (3, 3, 1, 1) -> (height, width, input_channels, output_channels) - 3x3x1 filter
    f = tf.constant(np.array([
        [[[1]], [[1]], [[1]]], 
        [[[1]], [[1]], [[1]]], 
        [[[1]], [[1]], [[1]]]
    ]), tf.float32)

    conv = tf.nn.conv2d_transpose(x, f, output_shape=(1, 4, 4, 1), strides=[1, 2, 2, 1], padding='SAME')

    with tf.Session() as session:
        result = session.run(conv)

    assert (np.array([[
        [[1.0], [1.0],  [3.0], [2.0]],
        [[1.0], [1.0],  [3.0], [2.0]],
        [[4.0], [4.0], [10.0], [6.0]],
        [[3.0], [3.0],  [7.0], [4.0]]]]) == result).all()

Tôi nghĩ rằng tính toán của bạn là sai ở đây. Đầu ra trung gian phải là 3+ 2 * 2 = 7, sau đó, đối với nhân 3x3, đầu ra cuối cùng phải là 7-3 + 1 = 5x5
Alex

Xin lỗi, @Alex, nhưng tôi không hiểu tại sao đầu ra trung gian là 7. Bạn có thể giải thích rõ hơn không?
andriys

2
@andriys Trong hình ảnh mà bạn đã hiển thị, tại sao kết quả cuối cùng bị cắt?
James Bond

28

Các ghi chú đi kèm với lớp CS CS CS3131n của Stanford : Mạng lưới thần kinh chuyển đổi để nhận biết bằng hình ảnh, bởi Andrej Karpathy , đã làm một công việc tuyệt vời để giải thích các mạng lưới thần kinh tích chập.

Đọc bài viết này sẽ cho bạn một ý tưởng sơ bộ về:

  • Mạng lưới giải mã Matthew D. Zeiler, Dilip Krishnan, Graham W. Taylor và Rob Fergus Khoa Khoa học máy tính, Viện Courant, Đại học New York

Những slide này rất phù hợp với Deconvolutional Networks.


29
Có thể tóm tắt nội dung của bất kỳ một trong những liên kết đó, trong một đoạn ngắn? Các liên kết có thể hữu ích cho nghiên cứu thêm, nhưng lý tưởng nhất là một câu trả lời trao đổi ngăn xếp nên có đủ văn bản để giải quyết câu hỏi cơ bản mà không cần phải rời khỏi trang web.
Neil Slater

Tôi xin lỗi nhưng nội dung của các trang này quá lớn để được tóm tắt trong một đoạn ngắn.
Azrael

12
Không cần phải tóm tắt đầy đủ, chỉ cần một tiêu đề - ví dụ: "Mạng thần kinh giải mã tương tự như CNN, nhưng được đào tạo để các tính năng trong bất kỳ lớp ẩn nào có thể được sử dụng để tái tạo lớp trước đó (và bằng cách lặp lại qua các lớp, cuối cùng là đầu vào có thể được xây dựng lại từ đầu ra). Điều này cho phép nó được đào tạo không giám sát để tìm hiểu các tính năng cấp cao chung trong một miền có vấn đề - thường là xử lý hình ảnh "(lưu ý tôi thậm chí không chắc là có đúng không, do đó không viết câu trả lời riêng).
Neil Slater

6
Mặc dù các liên kết là tốt, nhưng một bản tóm tắt ngắn gọn về mô hình bằng từ ngữ của bạn sẽ tốt hơn.
SmallChess

11

Chỉ cần tìm thấy một bài viết tuyệt vời từ trang web của theaon về chủ đề này [1]:

Nhu cầu về các cấu trúc chuyển tiếp thường xuất phát từ mong muốn sử dụng một phép biến đổi đi theo hướng ngược lại của một phép chập thông thường, [...] để chiếu các bản đồ đặc trưng lên một không gian có chiều cao hơn. [...] tức là ánh xạ từ không gian 4 chiều sang không gian 16 chiều, trong khi vẫn giữ mô hình kết nối của tích chập.

Các cấu trúc chuyển vị - còn được gọi là các cấu trúc phân đoạn được phân đoạn - hoạt động bằng cách hoán đổi các đường chuyền tiến và lùi của một phép chập. Một cách để nói là lưu ý rằng hạt nhân xác định tích chập, nhưng đó là tích chập trực tiếp hay tích chập chuyển tiếp được xác định bằng cách tính toán các chuyển tiếp và lùi.

Hoạt động tích chập chuyển đổi có thể được coi là độ dốc của một số tích chập liên quan đến đầu vào của nó, thường là cách thức thực hiện chuyển đổi được thực hiện trong thực tế.

Cuối cùng lưu ý rằng luôn luôn có thể thực hiện tích chập chuyển tiếp với tích chập trực tiếp. Nhược điểm là nó thường liên quan đến việc thêm nhiều cột và hàng số không vào đầu vào, dẫn đến việc triển khai kém hiệu quả hơn nhiều.

Vì vậy, trong simplespeak, "tích chập chuyển đổi" là phép toán bằng cách sử dụng ma trận (giống như tích chập) nhưng hiệu quả hơn so với phép tích chập thông thường trong trường hợp khi bạn muốn quay lại từ các giá trị được tích chập về gốc (ngược chiều). Đây là lý do tại sao nó được ưu tiên trong triển khai để tích chập khi tính toán theo hướng ngược lại (nghĩa là để tránh nhiều phép nhân 0 không cần thiết gây ra bởi ma trận thưa thớt dẫn đến việc đệm đầu vào).

Image ---> convolution ---> Result

Result ---> transposed convolution ---> "originalish Image"

Đôi khi bạn lưu một số giá trị dọc theo đường dẫn chập và sử dụng lại thông tin đó khi "quay lại":

Result ---> transposed convolution ---> Image

Đó có lẽ là lý do tại sao nó được gọi sai là "giải mã". Tuy nhiên, nó có liên quan đến ma trận chuyển vị của tích chập (C ^ T), do đó tên thích hợp hơn là "tích chập chuyển vị".

Vì vậy, nó rất có ý nghĩa khi xem xét chi phí điện toán. Bạn sẽ trả nhiều tiền hơn cho amazon gpus nếu bạn không sử dụng phép chập chuyển.

Đọc và xem các hình ảnh động ở đây một cách cẩn thận: http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithatures.html#no-zero-padding-unit-strides-transposed

Một số cách đọc liên quan khác:

Chuyển vị (hay nói chung hơn là chuyển vị Hermiti hoặc liên hợp) của bộ lọc chỉ đơn giản là bộ lọc phù hợp [3]. Điều này được tìm thấy bằng cách đảo ngược thời gian của hạt nhân và lấy liên hợp của tất cả các giá trị [2].

Tôi cũng chưa quen với điều này và sẽ biết ơn mọi phản hồi hoặc chỉnh sửa.

[1] http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithatures.html

[2] http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithatures.html#transposed-convolution-arithatures

[3] https://en.wikipedia.org/wiki/Matched_filter



1
Tôi nghĩ rằng đây là câu trả lời tốt nhất !!!
kli_nlpr

10

Chúng ta có thể sử dụng PCA cho sự tương tự.

Khi sử dụng đối lưu, chuyển tiếp là để trích xuất các hệ số của các thành phần nguyên tắc từ hình ảnh đầu vào và thông qua ngược (cập nhật đầu vào) là sử dụng (độ dốc của) các hệ số để tái tạo một hình ảnh đầu vào mới, sao cho hình ảnh đầu vào mới có hệ số PC phù hợp hơn với hệ số mong muốn.

Khi sử dụng deconv, đường chuyền phía trước và đường chuyền ngược được đảo ngược. Đường chuyền phía trước cố gắng tái tạo lại hình ảnh từ các hệ số PC và đường chuyền ngược cập nhật các hệ số PC đã cho (độ dốc của) hình ảnh.

Chuyển tiếp deconv thực hiện chính xác tính toán độ dốc được đưa ra trong bài đăng này: http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/

Đó là lý do tại sao trong việc triển khai caffe của caffein (tham khảo câu trả lời của Andrei Pokrovsky), đường chuyền chuyển tiếp deconv gọi backward_cpu_gemm () và đường chuyền ngược lại gọi về phía trước_cpu_gemm ().


6

Ngoài câu trả lời của David Dao: Cũng có thể nghĩ theo cách khác. Thay vì tập trung vào các pixel đầu vào (độ phân giải thấp) được sử dụng để tạo một pixel đầu ra duy nhất, bạn cũng có thể tập trung vào các pixel đầu vào riêng lẻ đóng góp vào vùng pixel đầu ra nào.

Điều này được thực hiện trong ấn phẩm chưng cất này , bao gồm một loạt các hình ảnh trực quan và tương tác rất trực quan. Một lợi thế của suy nghĩ theo hướng này là việc giải thích các đồ tạo tác bàn cờ trở nên dễ dàng.


5

Kết luận từ góc độ DSP

Tôi hơi muộn với điều này nhưng vẫn muốn chia sẻ quan điểm và hiểu biết của mình. Nền tảng của tôi là vật lý lý thuyết và xử lý tín hiệu số. Cụ thể, tôi đã nghiên cứu các sóng nhỏ và các cấu trúc gần như nằm trong xương sống của tôi;)

Cách mọi người trong cộng đồng học tập sâu nói về những kết án cũng khiến tôi bối rối. Từ quan điểm của tôi, những gì dường như còn thiếu là một sự tách biệt đúng đắn của mối quan tâm. Tôi sẽ giải thích các kết luận học tập sâu bằng cách sử dụng một số công cụ DSP.

Khước từ

Giải thích của tôi sẽ là một chút lượn sóng và không nghiêm ngặt về mặt toán học để có được những điểm chính.


Định nghĩa

xn={xn}n=={,x1,x0,x1,}

ynxn

(yx)n=k=ynkxk

q=(q0,q1,q2)x=(x0,x1,x2,x3)T

qx=(q1q000q2q1q000q2q1q000q2q1)(x0x1x2x3)

kN

kxn=xnk

kk1

kxn={xn/kn/kZ0otherwise

k=3

3{,x0,x1,x2,x3,x4,x5,x6,}={,x0,x3,x6,}
3{,x0,x1,x2,}={x0,0,0,x1,0,0,x2,0,0,}

k=2

2x=(x0x2)=(10000010)(x0x1x2x3)

2x=(x00x10)=(10000100)(x0x1)

k=kT


Kết luận học tập sâu theo từng phần

qx

  • kk(qx)
  • k(kq)x
  • kq(kx)

q(kx)=q(kTx)=(k(q)T)Tx

(q)q

q(kx)=(q1q000q2q1q000q2q1q000q2q1)(10000100)(x0x1)=(q1q200q0q1q200q0q1q200q0q1)T(10000010)T(x0x1)=((10000010)(q1q200q0q1q200q0q1q200q0q1))T(x0x1)=(k(q)T)Tx

Như người ta có thể thấy là hoạt động chuyển đổi, do đó, tên.

Kết nối với lấy mẫu hàng xóm gần nhất

2(11)xq2(11)qxq=(q0q1q2)

(11)q=(q0q0+q1q1+q2q2),

tức là chúng ta có thể thay thế một bộ tăng tốc lặp lại bằng yếu tố 2 và tích chập bằng một hạt nhân có kích thước 3 bằng một phép chập chuyển đổi với kích thước hạt nhân 4. Phép tích phân chuyển đổi này có cùng "khả năng nội suy" nhưng có thể học được các phép nội suy phù hợp hơn.


Kết luận và nhận xét cuối cùng

Tôi hy vọng tôi có thể làm rõ một số kết luận phổ biến được tìm thấy trong việc học sâu một chút bằng cách tách chúng ra trong các hoạt động cơ bản.

Tôi đã không bao gồm pooling ở đây. Nhưng đây chỉ là một downsampler phi tuyến và cũng có thể được xử lý trong ký hiệu này.


Câu trả lời tuyệt vời. Nhìn một quan điểm toán học / biểu tượng thường làm rõ mọi thứ. Tôi có đúng không khi nghĩ rằng thuật ngữ "giải mã" trong bối cảnh này đụng độ với thuật ngữ hiện có ?
user76284

Nó không thực sự xung đột, nó chỉ vô nghĩa. Giải mã chỉ là một tổ hợp với toán tử upample. Thuật ngữ deconvolution nghe có vẻ như là một dạng hoạt động nghịch đảo. Nói về một nghịch đảo ở đây chỉ có ý nghĩa trong bối cảnh hoạt động ma trận. Nó nhân với ma trận nghịch đảo chứ không phải hoạt động nghịch đảo của tích chập (như phép chia so với phép nhân).
André Bergner

zθx=zzθz=x

θz=xz=(θ)+x

Nói tóm lại, lớp được gọi là lớp giải mã của người dùng của OP không thực sự đang thực hiện quá trình giải mã. Nó đang làm một cái gì đó khác (những gì bạn mô tả trong câu trả lời của bạn).
user76284

4

Tôi đã gặp rất nhiều khó khăn để hiểu chính xác những gì đã xảy ra trong bài báo cho đến khi tôi xem qua bài đăng trên blog này: http://warmspringwinds.github.io/tensorflow/tf-slim/2016/11/22/upsampling-and-image-sibutionation -với-tenorflow-và-tf-slim /

Dưới đây là một bản tóm tắt về cách tôi hiểu những gì đang xảy ra trong một mô hình tăng gấp đôi:

Thông tin từ giấy

  • Upampling là gì?
  • Các thông số của tích chập đó là gì?
  • Là trọng lượng cố định hoặc đào tạo?
    • Bài viết nêu rõ "chúng tôi khởi tạo phép lấy mẫu gấp đôi thành phép nội suy song tuyến tính, nhưng cho phép các tham số được học [...]".
    • Tuy nhiên, trang github tương ứng nêu rõ "Trong các thí nghiệm ban đầu của chúng tôi, các lớp nội suy đã được khởi tạo thành các hạt nhân song tuyến và sau đó học được. Trong các thí nghiệm tiếp theo và thực hiện tham chiếu này, các hạt nhân song tuyến đã được cố định"
    • → trọng lượng cố định

Ví dụ đơn giản

  1. hãy tưởng tượng hình ảnh đầu vào sau đây:

Hình ảnh đầu vào

  1. Các cấu trúc phân đoạn được thực hiện bằng cách chèn các số 0-2-1 = 1 0 vào giữa các giá trị này và sau đó giả sử stride = 1 sau này. Do đó, bạn nhận được hình ảnh đệm 6x6 sau đây

hình ảnh đệm

  1. Bộ lọc bilinear 4x4 trông như thế này. Các giá trị của nó được chọn sao cho các trọng số đã sử dụng (= tất cả các trọng số không được nhân với số 0 được chèn) tổng cộng lên tới 1. Ba giá trị duy nhất của nó là 0,56, 0,19 và 0,06. Hơn nữa, trung tâm của bộ lọc là theo quy ước pixel ở hàng thứ ba và cột thứ ba.

bộ lọc

  1. Áp dụng bộ lọc 4x4 trên hình ảnh được đệm (sử dụng padding = 'same' và stride = 1) mang lại hình ảnh được ghép lại 6x6 sau đây:

Hình ảnh nâng cao

  1. Kiểu nâng cấp này được thực hiện cho từng kênh riêng lẻ (xem dòng 59 trong https://github.com/shelhamer/fcn.ber siêuvision.org / blog / master / seryery.py ). Cuối cùng, việc lấy mẫu gấp đôi thực sự là thay đổi kích thước rất đơn giản bằng cách sử dụng phép nội suy song tuyến và các quy ước về cách xử lý các đường viền. Tôi tin rằng việc tăng tốc độ 16x hoặc 32x theo cùng một cách.

Licensed under cc by-sa 3.0 with attribution required.