Быстрый ответ: Вы получаете дополнительный массив параметров для каждого слоя, содержащий вектор смещения, связанный со слоем.
Подробный ответ : Я постараюсь направить вы в процессе изучения ваших вопросов.
Кажется, неплохо было бы посмотреть, каковы наши 10 параметров:
for param in net.parameters():
print(type(param), param.size())
<class 'torch.nn.parameter.Parameter'> torch.Size([6, 3, 5, 5])
<class 'torch.nn.parameter.Parameter'> torch.Size([6])
<class 'torch.nn.parameter.Parameter'> torch.Size([16, 6, 5, 5])
<class 'torch.nn.parameter.Parameter'> torch.Size([16])
<class 'torch.nn.parameter.Parameter'> torch.Size([120, 400])
<class 'torch.nn.parameter.Parameter'> torch.Size([120])
<class 'torch.nn.parameter.Parameter'> torch.Size([84, 120])
<class 'torch.nn.parameter.Parameter'> torch.Size([84])
<class 'torch.nn.parameter.Parameter'> torch.Size([10, 84])
<class 'torch.nn.parameter.Parameter'> torch.Size([10])
Мы можем распознать наши 5 слоев и дополнительную строку для каждого слой. Например, если мы посмотрим на определенный слой c, например, первый сверточный слой, мы получим:
for param in net.conv1.parameters():
print(type(param), param.size())
<class 'torch.nn.parameter.Parameter'> torch.Size([6, 3, 5, 5])
<class 'torch.nn.parameter.Parameter'> torch.Size([6])
Итак, теперь, когда мы знаем, что у нас есть два массива параметров для каждого слоя, вопрос почему. Первый массив 6*3*5*5
соответствует вашим 6 ядрам размером 5 * 5 с 3 каналами, второй соответствует смещению, связанному с каждым из ваших ядер. С математической точки зрения, чтобы вычислить значение на следующем слое, связанном с данным ядром, вы выполняете свертку между областью под нужным пикселем и ядром и добавляете действительное число. Это число называется смещением, и эмпирически доказано, что использование смещения дает лучшие результаты.
Теперь вы также можете создать слой без смещения, и тогда вы получите только один массив параметров:
layer = nn.Conv2d(3,6,5, bias= False)
for param in layer.parameters():
print(type(param), param.size())
<class 'torch.nn.parameter.Parameter'> torch.Size([6, 3, 5, 5])