Относительно заполнения,
Keras => 'valid' - нет заполнения;'same' - ввод дополняется так, что форма вывода совпадает с формой ввода
Pytorch => вы явно указываете заполнение
Допустимое заполнение
>>> model = keras.Sequential()
>>> model.add(keras.layers.Conv2D(filters=10, kernel_size=3, padding='valid', input_shape=(28,28,3)))
>>> model.layers[0].output_shape
(None, 26, 26, 10)
>>> x = torch.randn((1,3,28,28))
>>> conv = torch.nn.Conv2d(in_channels=3, out_channels=10, kernel_size=3)
>>> conv(x).shape
torch.Size([1, 10, 26, 26])
Одинаковое заполнение
>>> model = keras.Sequential()
>>> model.add(keras.layers.Conv2D(filters=10, kernel_size=3, padding='same', input_shape=(28,28,3)))
>>> model.layers[0].output_shape
(None, 28, 28, 10)
>>> x = torch.randn((1,3,28,28))
>>> conv = torch.nn.Conv2d(in_channels=3, out_channels=10, kernel_size=3, padding=1)
>>> conv(x).shape
torch.Size([1, 10, 28, 28])
W - Ширина ввода, F - Размер фильтра (или ядра), P - заполнение, S - Шаг, Wout - Ширина вывода
Wout = ((W-F + 2P) / S) + 1
Аналогично для высоты.С помощью этой формулы вы можете вычислить количество отступов, необходимое для сохранения ширины или высоты ввода в выходных данных.
http://cs231n.github.io/convolutional-networks/
Относительно in_channels, out_chanels и фильтров, * 1029Фильтры *
такие же, как out_channels.В Keras, in_channels автоматически выводится из формы предыдущего слоя или input_shape (в случае первого слоя).