线性层讲解

介绍

线性层(Linear Layer),在神经网络中通常被称为全连接层或密集层,时神经网络中最基本的层之一,它的作用是对输入数据进行线性变换,主要包含矩阵乘法和加上偏置。

数学表示

线性层的计算公式为:

output = input \times weight^{T} + bias

  • input是输入数据矩阵,通常表示X,维度为(N,din),其中N是批量大小,din是输入特征的维度。
  • weight是权重矩阵,通常表示为W,维度为(dout,din)。
  • bias是偏置向量,通常表示为b,维度为(dout)。
  • output是输出数据矩阵,维度为(N,dout)。

线性层的作用

线性层的主要作用是通过线性变换将输入数据映射到一个新的空间,改变数据的维度,便于后续层进一步处理。

PyTorch中的线性层

在PyTorch中,线性层由'torch.nn.Linear'类表示。

示例

简单的线性层

import torch
import torch.nn as nn

# 定义一个线性层,将输入维度 4 映射到输出维度 2
linear_layer = nn.Linear(4, 2)

# 创建一个输入张量,形状为 (1, 4)
input_tensor = torch.tensor([[1.0, 2.0, 3.0, 4.0]])

# 通过线性层进行前向传播
output_tensor = linear_layer(input_tensor)

print("输入张量:")
print(input_tensor)
print("输出张量:")
print(output_tensor)

在这个例子中:

  • 我们定义了一个线性层 linear_layer,输入维度为 4,输出维度为 2。
  • 我们创建了一个形状为 (1, 4) 的输入张量 input_tensor
  • 通过线性层进行前向传播,得到形状为 (1, 2) 的输出张量 output_tensor

带偏置的线性层

import torch
import torch.nn as nn

# 定义一个线性层,将输入维度 3 映射到输出维度 2,包含偏置项
linear_layer = nn.Linear(3, 2)

# 查看线性层的权重和偏置
print("权重矩阵:")
print(linear_layer.weight)
print("偏置向量:")
print(linear_layer.bias)

# 创建一个输入张量,形状为 (1, 3)
input_tensor = torch.tensor([[1.0, 2.0, 3.0]])

# 通过线性层进行前向传播
output_tensor = linear_layer(input_tensor)

print("输入张量:")
print(input_tensor)
print("输出张量:")
print(output_tensor)

在这个例子中:

  • 我们定义了一个线性层 linear_layer,输入维度为 3,输出维度为 2,并包含偏置项。
  • 我们可以查看线性层的权重矩阵和偏置向量。
  • 我们创建了一个形状为 (1, 3) 的输入张量 input_tensor
  • 通过线性层进行前向传播,得到形状为 (1, 2) 的输出张量 output_tensor

多批次输入

 

import torch
import torch.nn as nn

# 定义一个线性层,将输入维度 5 映射到输出维度 3
linear_layer = nn.Linear(5, 3)

# 创建一个输入张量,形状为 (2, 5),表示有两个样本,每个样本有 5 个特征
input_tensor = torch.tensor([[1.0, 2.0, 3.0, 4.0, 5.0], [6.0, 7.0, 8.0, 9.0, 10.0]])

# 通过线性层进行前向传播
output_tensor = linear_layer(input_tensor)

print("输入张量:")
print(input_tensor)
print("输出张量:")
print(output_tensor)

 

在这个例子中:

  • 我们定义了一个线性层 linear_layer,输入维度为 5,输出维度为 3。
  • 我们创建了一个形状为 (2, 5) 的输入张量 input_tensor,表示有两个样本,每个样本有 5 个特征。
  • 通过线性层进行前向传播,得到形状为 (2, 3) 的输出张量 output_tensor

总结

线性层是神经网络中最基本的构建模块之一,通过线性变换将输入数据映射到新的空间。通过调整输入和输出的维度,线性层可以在不同的特征空间之间进行变换,使模型能够更好地捕捉和表示数据中的复杂模式。通过 PyTorch 中的 nn.Linear 类,我们可以轻松地定义和使用线性层进行各种操作。

### 线性层与ReLU激活函数的关系 #### 线性层的作用 线性层(也称为全连接层)执行的是加权求和的操作,即对于输入数据 \( \mathbf{x} \),通过权重矩阵 \( W \) 和偏置项 \( b \) 进行变换得到输出: \[ y = W\mathbf{x} + b \] 这种转换本质上是一个线性的映射,在多维空间中表现为超平面。 #### ReLU激活函数的作用 ReLU (Rectified Linear Unit) 是一种非线性激活函数,其定义为: \[ f(x)=\max(0, x) \][^1] 当应用于神经网络中的节点时,ReLU 将负数部分设为零而保持正数不变。这有助于引入模型所需的非线性特性,使得网络能够学习更复杂的模式并解决线性不可分问题[^3]。 #### 组合使用方式 在线性层后面紧跟一个ReLU激活函数是一种常见的做法。具体来说就是先计算线性组合的结果再应用ReLU来决定最终传递给下一层的信息量。这样做不仅保留了原始特征还增加了系统的表达能力。 ```python import torch.nn as nn class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.fc1 = nn.Linear(in_features=784, out_features=256) self.relu = nn.ReLU() def forward(self, x): x = self.fc1(x) output = self.relu(x) return output ``` 此代码片段展示了如何构建一个简单的包含单一线性层以及后续ReLU激活功能的小型神经网络模块。 #### 主要区别 - **线性层**负责处理输入数据之间的关系并通过参数调整实现特定的任务目标;它本身不具备任何非线性属性。 - **ReLU激活函数**则用于打破纯线性假设带来的局限性,允许模型捕捉到更加复杂的数据分布规律。两者共同作用于提升整个架构的表现力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值