Đối số kéo căng


115

Tôi đang cố gắng để hiểu các đối số bước trong tf.nn.avg_pool, tf.nn.max_pool, tf.nn.conv2d.

Các tài liệu liên tục nói

strides: Một danh sách các int có độ dài> = 4. Sải chân của cửa sổ trượt cho mỗi kích thước của tenxơ đầu vào.

Câu hỏi của tôi là:

  1. Mỗi số nguyên trên 4 đại diện cho cái gì?
  2. Tại sao họ phải có sải chân [0] = strides [3] = 1 cho convnets?
  3. Trong ví dụ này chúng ta thấy tf.reshape(_X,shape=[-1, 28, 28, 1]). Tại sao -1?

Đáng buồn thay, các ví dụ trong các tài liệu để định hình lại bằng cách sử dụng -1 không dịch quá tốt cho kịch bản này.

Câu trả lời:


224

Các ops gộp và tích chập trượt một "cửa sổ" trên tenxơ đầu vào. Sử dụng tf.nn.conv2dlàm ví dụ: Nếu tenxơ đầu vào có 4 kích thước: [batch, height, width, channels]thì tích chập hoạt động trên cửa sổ 2D trên các height, widthkích thước.

stridesxác định mức độ thay đổi của cửa sổ trong mỗi kích thước. Việc sử dụng thông thường đặt bước đầu tiên (đợt) và lần cuối (độ sâu) thành 1.

Chúng ta hãy sử dụng một ví dụ rất cụ thể: Chạy tích chập 2 chiều trên hình ảnh đầu vào thang độ 32x32. Tôi nói thang độ xám vì sau đó hình ảnh đầu vào có độ sâu = 1, giúp giữ cho nó đơn giản. Hãy để hình ảnh đó trông như thế này:

00 01 02 03 04 ...
10 11 12 13 14 ...
20 21 22 23 24 ...
30 31 32 33 34 ...
...

Chúng ta hãy chạy một cửa sổ tích chập 2x2 qua một ví dụ duy nhất (kích thước lô = 1). Chúng tôi sẽ cung cấp cho tích chập độ sâu kênh đầu ra là 8.

Các đầu vào để tích chập có shape=[1, 32, 32, 1].

Nếu bạn chỉ định strides=[1,1,1,1]với padding=SAME, thì đầu ra của bộ lọc sẽ là [1, 32, 32, 8].

Bộ lọc trước tiên sẽ tạo đầu ra cho:

F(00 01
  10 11)

Và sau đó cho:

F(01 02
  11 12)

và như thế. Sau đó, nó sẽ di chuyển đến hàng thứ hai, tính toán:

F(10, 11
  20, 21)

sau đó

F(11, 12
  21, 22)

Nếu bạn chỉ định một sải chân của [1, 2, 2, 1] thì nó sẽ không làm các cửa sổ chồng chéo. Nó sẽ tính toán:

F(00, 01
  10, 11)

và sau đó

F(02, 03
  12, 13)

Các bước hoạt động tương tự cho các nhà khai thác gộp.

Câu 2: Tại sao sải bước [1, x, y, 1] cho convnets

1 đầu tiên là lô: Bạn thường không muốn bỏ qua các ví dụ trong lô của mình hoặc bạn không nên đưa chúng vào vị trí đầu tiên. :)

1 cuối cùng là độ sâu của tích chập: Bạn thường không muốn bỏ qua các đầu vào, vì lý do tương tự.

Toán tử conv2d tổng quát hơn, do đó bạn có thể tạo các kết cấu trượt cửa sổ dọc theo các kích thước khác, nhưng đó không phải là cách sử dụng thông thường trong convnets. Việc sử dụng điển hình là sử dụng chúng theo không gian.

Tại sao định hình lại thành -1 -1 là một trình giữ chỗ cho biết "điều chỉnh khi cần thiết để phù hợp với kích thước cần thiết cho thang đo đầy đủ". Đó là một cách làm cho mã độc lập với kích thước lô đầu vào, để bạn có thể thay đổi đường ống của mình và không phải điều chỉnh kích thước lô ở mọi nơi trong mã.


5
@derek bởi vì (từ văn bản) "Chúng tôi sẽ cung cấp cho tích chập độ sâu kênh đầu ra là 8.". Đó là thứ bạn có thể chọn khi thiết lập tích chập và người trả lời đã chọn 8.
etarion

17

Các đầu vào là 4 chiều và có dạng: [batch_size, image_rows, image_cols, number_of_colors]

Bước tiến, nói chung, xác định sự chồng chéo giữa các hoạt động áp dụng. Trong trường hợp của conv2d, nó chỉ định khoảng cách giữa các ứng dụng liên tiếp của các bộ lọc tích chập. Giá trị 1 trong một thứ nguyên cụ thể có nghĩa là chúng tôi áp dụng toán tử ở mỗi hàng / col, giá trị của 2 có nghĩa là mỗi giây, v.v.

Re 1) Các giá trị quan trọng đối với các kết cấu là thứ 2 và thứ 3 và chúng thể hiện sự chồng lấp trong ứng dụng của các bộ lọc tích chập dọc theo các hàng và cột. Giá trị của [1, 2, 2, 1] nói rằng chúng tôi muốn áp dụng các bộ lọc trên mỗi hàng và cột thứ hai.

Re 2) Tôi không biết các giới hạn kỹ thuật (có thể là yêu cầu CuDNN) nhưng thông thường mọi người sử dụng các bước dọc theo kích thước hàng hoặc cột. Nó không nhất thiết phải có ý nghĩa để làm điều đó trên kích thước lô. Không chắc chắn về chiều cuối cùng.

Re 3) Đặt -1 cho một trong các chiều có nghĩa là "đặt giá trị cho thứ nguyên đầu tiên để tổng số phần tử trong thang đo không thay đổi". Trong trường hợp của chúng tôi, -1 sẽ bằng với batch_size.


11

Hãy bắt đầu với những gì sải chân trong trường hợp 1 mờ.

Giả sử bạn input = [1, 0, 2, 3, 0, 1, 1]kernel = [2, 1, 3]kết quả của phép chập là [8, 11, 7, 9, 4], được tính bằng cách trượt hạt nhân của bạn qua đầu vào, thực hiện phép nhân phần tử và tổng hợp mọi thứ. Như thế này :

  • 8 = 1 * 2 + 0 * 1 + 2 * 3
  • 11 = 0 * 2 + 2 * 1 + 3 * 3
  • 7 = 2 * 2 + 3 * 1 + 0 * 3
  • 9 = 3 * 2 + 0 * 1 + 1 * 3
  • 4 = 0 * 2 + 1 * 1 + 1 * 3

Ở đây chúng tôi trượt theo một yếu tố, nhưng không có gì ngăn cản bạn bằng cách sử dụng bất kỳ số nào khác. Con số này là bước tiến của bạn. Bạn có thể nghĩ về nó như lấy mẫu kết quả của phép tích chập 1 bước chỉ bằng cách lấy mọi kết quả thứ s.

Biết kích thước đầu vào i , hạt nhân có kích thước k , sải chân s và padding p bạn có thể dễ dàng tính toán kích thước đầu ra của chập như:

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

Đây | | điều hành có nghĩa là hoạt động trần. Đối với một lớp gộp s = 1.


Trường hợp N-mờ.

Biết toán học cho trường hợp 1 mờ, trường hợp n-dim rất dễ dàng một khi bạn thấy rằng mỗi độ mờ là độc lập. Vì vậy, bạn chỉ cần trượt từng chiều riêng biệt. Đây là một ví dụ cho 2-d . Lưu ý rằng bạn không cần phải có cùng một bước tiến ở tất cả các kích thước. Vì vậy, đối với đầu vào / nhân N-dim, bạn nên cung cấp N bước.


Vì vậy, bây giờ thật dễ dàng để trả lời tất cả các câu hỏi của bạn:

  1. Mỗi số nguyên trên 4 đại diện cho cái gì? . conv2d , pool cho bạn biết rằng danh sách này thể hiện các bước tiến giữa mỗi chiều. Lưu ý rằng độ dài của danh sách sải chân giống như thứ hạng của tenxơ kernel.
  2. Tại sao họ phải có sải chân [0] = sải 3 = 1 cho convnets? . Kích thước đầu tiên là kích thước lô, cuối cùng là các kênh. Không có điểm bỏ qua cả lô và kênh. Vì vậy, bạn tạo chúng 1. Đối với chiều rộng / chiều cao, bạn có thể bỏ qua một cái gì đó và đó là lý do tại sao chúng có thể không phải là 1.
  3. tf.reshape (_X, hình dạng = [- 1, 28, 28, 1]). Tại sao -1? tf.reshape bảo hiểm cho bạn:

    Nếu một thành phần của hình dạng là giá trị đặc biệt -1, kích thước của kích thước đó được tính toán để tổng kích thước không đổi. Cụ thể, hình dạng [-1] làm phẳng thành 1-D. Nhiều nhất một thành phần của hình dạng có thể là -1.


2

@dga đã thực hiện một công việc tuyệt vời giải thích và tôi không thể biết ơn nó hữu ích như thế nào. Theo cách tương tự, tôi sẽ muốn chia sẻ những phát hiện của tôi về cách stridehoạt động của tích chập 3D.

Theo tài liệu của TensorFlow trên conv3d, hình dạng của đầu vào phải theo thứ tự sau:

[batch, in_depth, in_height, in_width, in_channels]

Hãy giải thích các biến từ cực bên phải sang trái bằng một ví dụ. Giả sử hình dạng đầu vào là input_shape = [1000,16,112,112,3]

input_shape[4] is the number of colour channels (RGB or whichever format it is extracted in)
input_shape[3] is the width of the image
input_shape[2] is the height of the image
input_shape[1] is the number of frames that have been lumped into 1 complete data
input_shape[0] is the number of lumped frames of images we have.

Dưới đây là một tài liệu tóm tắt về cách sải chân được sử dụng.

sải chân: Một danh sách các số nguyên có độ dài> = 5. Độ căng 1-D có độ dài 5. Bước của cửa sổ trượt cho mỗi chiều của đầu vào. Phải cóstrides[0] = strides[4] = 1

Như đã chỉ ra trong nhiều tác phẩm, sải chân chỉ đơn giản có nghĩa là cách cửa sổ hoặc hạt nhân nhảy ra khỏi phần tử gần nhất, có thể là khung dữ liệu hoặc pixel (điều này được diễn giải theo cách này).

Từ tài liệu trên, một bước tiến trong 3D sẽ giống như bước này = (1, X , Y , Z , 1).

Các tài liệu nhấn mạnh rằng strides[0] = strides[4] = 1.

strides[0]=1 means that we do not want to skip any data in the batch 
strides[4]=1 means that we do not want to skip in the channel 

sải chân [X] có nghĩa là chúng ta nên thực hiện bao nhiêu lần bỏ qua trong các khung gộp. Vì vậy, ví dụ, nếu chúng ta có 16 khung, X = 1 có nghĩa là sử dụng mọi khung. X = 2 có nghĩa là sử dụng mọi khung hình thứ hai và nó tiếp tục

sải bước [y] và sải chân [z] tuân theo lời giải thích của @dga vì vậy tôi sẽ không làm lại phần đó.

Tuy nhiên, trong máy ảnh, bạn chỉ cần xác định một tuple / danh sách gồm 3 số nguyên, chỉ định các bước của tích chập dọc theo mỗi chiều không gian, trong đó kích thước không gian là sải chân [x], sải chân [y] và sải chân [z]. sải chân [0] và sải chân [4] đã được mặc định là 1.

Tôi hy vọng ai đó tìm thấy điều này hữu ích!

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.