# PyTorch中Linear层的原理 | PyTorch系列（十六）

## Linear 层是如何实现的

### 一、使用矩阵进行变换

```in_features = torch.tensor([1,2,3,4], dtype=torch.float32)

weight_matrix = torch.tensor([
[1,2,3,4],
[2,3,4,5],
[3,4,5,6]
], dtype=torch.float32)

> weight_matrix.matmul(in_features)
tensor([30., 40., 50.])```

### 二、使用PyTorch线性层进行转换

`fc = nn.Linear(in_features=4, out_features=3, bias=False)`

```# torch/nn/modules/linear.py (version 1.0.1)

def __init__(self, in_features, out_features, bias=True):
super(Linear, self).__init__()
self.in_features = in_features
self.out_features = out_features
self.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()```

```> fc(in_features)

callable Python objects. ：https://en.wikipedia.org/wiki/Callable_object

`fc.weight = nn.Parameter(weight_matrix)`

PyTorch模块的权值需要是参数。这就是为什么我们把权矩阵张量放在一个参数类实例中。现在让我们看看这一层如何使用新的权重矩阵转换输入。我们希望看到与前面示例相同的结果。

```> fc(in_features)

```fc = nn.Linear(in_features=4, out_features=3, bias=False)
fc.weight = nn.Parameter(weight_matrix)
> fc(in_features)

y=Ax+b.

y=mx+b.

## 可调用的层和神经网络

```> fc(in_features)

```# torch/nn/modules/module.py (version 1.0.1)

def __call__(self, *input, **kwargs):
for hook in self._forward_pre_hooks.values():
hook(self, input)
if torch._C._get_tracing_state():
result = self._slow_forward(*input, **kwargs)
else:
result = self.forward(*input, **kwargs)
for hook in self._forward_hooks.values():
hook_result = hook(self, input, result)
if hook_result is not None:
raise RuntimeError(
"forward hooks should never return any values, but '{}'"
"didn't return None".format(hook))
if len(self._backward_hooks) > 0:
var = result
while not isinstance(var, torch.Tensor):
if isinstance(var, dict):
var = next((v for v in var.values() if isinstance(v, torch.Tensor)))
else:
var = var[0]
for hook in self._backward_hooks.values():
wrapper = functools.partial(hook, self)
functools.update_wrapper(wrapper, hook)
return result```

PyTorch在__ call __()方法中运行的额外代码就是我们从不直接调用forward()方法的原因。如果我们这样做，额外的PyTorch代码将不会被执行。因此，每当我们想要调用forward()方法时，我们都会调用对象实例。这既适用于层，也适用于网络，因为它们都是PyTorch神经网络模块。

https://deeplizard.com/learn/video/rcc86nXKwkw

0 条评论

• ### CNN层参数详解 | PyTorch系列（十四）

在上一篇文章中，我们通过扩展PyTorch神经网络模块类并定义一些层作为类属性来开始构建CNN。通过在构造函数中指定它们，我们定义了两个卷积层和三个线性层。

• ### 你的涂鸦活了，CMU中国本科生让画成真丨有代码有Demo

给它取个名，再轻轻一点——拥有姓名的独角兽，就从纸面进入一个三维世界，开始不知疲倦的翻越，一座座山丘……

• ### 万字长文！攻克目标检测难点秘籍一，模型加速之轻量化网络

目标检测是计算机视觉中一个重要问题，在行人跟踪、车牌识别、无人驾驶等领域都具有重要的研究价值。近年来，随着深度学习对图像分类准确度的大幅度提高，基于深度学习的目...

• ### 如何写出一个好的机器学习工具库

但使用工具只能让人入门，我们有没有可能自己写一个优秀的机器学习工具库，为开源做贡献，同时积累经验呢？

• ### SAS-临床试验中编码频数表的自动输出

今天要写的是关于SAS在临床试验中自动输出频数表的程序。在临床试验中，我们会对不良事件与合并用药进行医学编码，编码后，我们会对编码进行分级频数汇总。汇总表长的什...

• ### 一个低级错误引发Netty编码解码中文异常

最近在调研Netty的使用，在编写编码解码模块的时候遇到了一个中文字符串编码和解码异常的情况，后来发现是笔者犯了个低级错误。这里做一个小小的回顾。

• ### Python：编写条件分支代码的技巧

编写条件分支代码是编码过程中不可或缺的一部分。 如果用道路来做比喻，现实世界中的代码从来都不是一条笔直的高速公路，而更像是由无数个岔路口组成的某个市区地图。我们...

• ### 2016年大数据和分析市场的21个趋势预测

导读：随着社交媒体、移动化和云计算的发展，数据分析及相关的技术已经作为一款具有颠覆性的技术在这个数字时代占有了一席之地了。在过去的2015年中，我们已经看到对...

• ### Jmeter系列（17）- 定时器Timers 的入门介绍

https://www.cnblogs.com/poloyy/category/1746599.html