Всегда старайтесь предоставить Минимальный воспроизводимый пример .
Это не должно. Возможно, вы забыли суммирование. Как указано в документах :
В простейшем случае, выходное значение слоя с входным размером (N, C_in, L) и выходным (N, C_out, L_out) ) можно точно описать следующим образом:
где ⋆ - действительный оператор взаимной корреляции, N - размер пакета, C - количество каналов, L - длина сигнальной последовательности.
Обратите внимание, что в вашем примере среднее значение после conv (т.е. 21.8416
) составляет прибл. 161 раз выше среднего (т.е. 161 * 0.1357
), и это не случайно. Обратите внимание, что то же самое происходит в коде ниже:
import torch
torch.manual_seed(0)
# define the fake input data
x = torch.rand(1, 3, 5)
# >>> x
# tensor([[[0.4963, 0.7682, 0.0885, 0.1320, 0.3074],
# [0.6341, 0.4901, 0.8964, 0.4556, 0.6323],
# [0.3489, 0.4017, 0.0223, 0.1689, 0.2939]]])
# define the conv
conv1 = torch.nn.Conv1d(3, 3, kernel_size=5, stride=1, padding=2)
conv1.weight.data = torch.zeros(conv1.weight.data.size())
conv1.weight.data[:, :, 2] = 1.0
conv1.bias.data = torch.zeros(conv1.bias.data.size())
# print mean before
print(x.mean())
# tensor(0.4091)
# print mean after
print(conv1(x).mean())
# tensor(1.2273, grad_fn=<MeanBackward0>)
Видите? После конва среднее значение будет в 3 раза больше исходного.
Как сказал @jodag, если вы хотите личность, вы можете сделать так:
import torch
torch.manual_seed(0)
# define the fake input data
x = torch.rand(1, 3, 5)
# >>> x
# tensor([[[0.4963, 0.7682, 0.0885, 0.1320, 0.3074],
# [0.6341, 0.4901, 0.8964, 0.4556, 0.6323],
# [0.3489, 0.4017, 0.0223, 0.1689, 0.2939]]])
# define the conv
conv1 = torch.nn.Conv1d(3, 3, kernel_size=5, stride=1, padding=2)
torch.nn.init.zeros_(conv1.weight)
torch.nn.init.zeros_(conv1.bias)
# set identity kernel
conv1.weight.data[:, :, 2] = torch.eye(3, 3)
# print mean before
print(x.mean())
# tensor(0.4091)
# print mean after
print(conv1(x).mean())
# tensor(0.4091, grad_fn=<MeanBackward0>)