https://pytorch.org/docs/stable/generated/torch.nn.Linear.html?highlight=linear#torch.nn.Linear
功能
源码
[torch/nn/modules/linear.py]class Linear(Module):r"""Applies a linear transformation to the incoming data: :math:`y = xA^T + b`Args:in_features: size of each input sampleout_features: size of each output samplebias: If set to False, the layer will not learn an additive bias.Default: TrueExamples::>>> m = nn.Linear(20, 30)>>> input = torch.randn(128, 20)>>> output = m(input)>>> print(output.size())torch.Size([128, 30])"""# https://discuss.pytorch.org/t/why-do-we-use-constants-or-final/70331__constants__ = ['in_features', 'out_features']in_features: intout_features: intweight: Tensordef __init__(self, in_features: int, out_features: int, bias: bool = True) -> None:super(Linear, self).__init__()self.in_features = in_featuresself.out_features = out_featuresself.weight = Parameter(torch.Tensor(out_features, in_features))if bias:self.bias = Parameter(torch.Tensor(out_features))else:self.register_parameter('bias', None)self.reset_parameters()def reset_parameters(self) -> None:# 初始化 Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classificationinit.kaiming_uniform_(self.weight, a=math.sqrt(5))if self.bias is not None:fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight)bound = 1 / math.sqrt(fan_in)init.uniform_(self.bias, -bound, bound)def forward(self, input: Tensor) -> Tensor:return F.linear(input, self.weight, self.bias)def extra_repr(self) -> str:return 'in_features={}, out_features={}, bias={}'.format(self.in_features, self.out_features, self.bias is not None)
