что означает значение параметров, участвующих в torch.nn.conv2d - PullRequest
0 голосов
/ 20 июня 2019

В Fastai передовые глубокие знания для кодеров курс лекции 7. Есть строка

 self.conv1 = nn.Conv2d(3,10,kernel_size = 5,stride=1,padding=2)

Имеет ли значение 10 число фильтров или количество активаций, которые даст фильтр? Поправь меня, если я ошибаюсь?

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Проверка документов https://pytorch.org/docs/stable/nn.html#torch.nn.Conv2d у вас есть 3 in_channels и 10 out_channels, поэтому эти 10 out_channels являются фильтрами @ thefifthjack005, также известными как функции.

0 голосов
/ 20 июня 2019

Здесь - это то, что вы можете найти

torch.

Параметры

  • in_channels (int) - Количество каналов во входном изображении
  • out_channels (int) - Количество каналов, созданных сверткой
  • kernel_size (int или tuple) - размер свернутого ядра
  • stepde (int или tuple, необязательно) - шаг свертки. По умолчанию: 1)
  • Заполнение (int или кортеж, опционально) - добавление нуля к обеим сторонам ввода (по умолчанию: 0)
  • padding_mode (строка, необязательно) - нули
  • расширение (int или tuple, необязательно) - интервал между элементами ядра. По умолчанию: 1)
  • groups (int, необязательный) - Количество заблокированных соединений от входных до выходных каналов. По умолчанию: 1)
  • смещение (bool, опционально) - если True, добавляет усматриваемый уклон к выводу. (По умолчанию: True)

И этот URL содержит полезную визуализацию процесса.

Таким образом, in_channels в начале равно 3 для изображений с 3 каналами (цветные изображения). Для черно-белых изображений это должно быть 1. На некоторых спутниковых снимках должно быть 4.

out_channels - это то, что создаст свертка, так что это количество фильтров.

Давайте создадим пример, чтобы «доказать» это.

import torch
import torch.nn as nn
c = nn.Conv2d(1,3, stride = 1, kernel_size=(4,5))
print(c.weight.shape)
print(c.weight)

Out

torch.Size([3, 1, 4, 5])
Parameter containing:
tensor([[[[ 0.1571,  0.0723,  0.0900,  0.1573,  0.0537],
          [-0.1213,  0.0579,  0.0009, -0.1750,  0.1616],
          [-0.0427,  0.1968,  0.1861, -0.1787, -0.2035],
          [-0.0796,  0.1741, -0.2231,  0.2020, -0.1762]]],


        [[[ 0.1811,  0.0660,  0.1653,  0.0605,  0.0417],
          [ 0.1885, -0.0440, -0.1638,  0.1429, -0.0606],
          [-0.1395, -0.1202,  0.0498,  0.0432, -0.1132],
          [-0.2073,  0.1480, -0.1296, -0.1661, -0.0633]]],


        [[[ 0.0435, -0.2017,  0.0676, -0.0711, -0.1972],
          [ 0.0968, -0.1157,  0.1012,  0.0863, -0.1844],
          [-0.2080, -0.1355, -0.1842, -0.0017, -0.2123],
          [-0.1495, -0.2196,  0.1811,  0.1672, -0.1817]]]], requires_grad=True)

Если мы изменим количество out_channels,

c = nn.Conv2d(1,5, stride = 1, kernel_size=(4,5))
print(c.weight.shape) # torch.Size([5, 1, 4, 5])

Мы получим 5 фильтров каждый фильтр 4х5, так как это размер нашего ядра. Если мы установим 2 канала (некоторые изображения могут иметь только 2 канала)

c = nn.Conv2d(2,5, stride = 1, kernel_size=(4,5))
print(c.weight.shape) # torch.Size([5, 2, 4, 5])

наш фильтр будет иметь 2 канала.

Я думаю, что у них есть термины из этой книги , и поскольку там они не называли это фильтрами, они не использовали этот термин.

Итак, вы правы; Фильтры - это то, что изучает уровень слежения, а количество фильтров - это количество выходных каналов. Они устанавливаются случайным образом при запуске.

Количество активаций рассчитывается на основе bs и размера изображения:

bs=16
x = torch.randn(bs, 3, 28, 28)
c = nn.Conv2d(3,10,kernel_size=5,stride=1,padding=2)
out = c(x)
print(out.nelement()) #125440 number of activations
...