Здесь - это то, что вы можете найти
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