【总结】深度学习的神经网络层(比如Linear层等)介绍

深度学习中的神经网络层介绍

深度学习中的神经网络由多种不同类型的层组成,每种层都有其独特的功能和用途。以下是一些常见的神经网络层的介绍和示例代码,并附带详细的注释。

1. Linear 层(全连接层)

Linear 层是最基本的神经网络层之一,也称为全连接层。它将输入与每个输出神经元完全连接。每个连接都有一个权重和一个偏置。

示例代码

python 复制代码
import torch
import torch.nn as nn

# 定义一个简单的全连接网络,包含两个Linear层
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(28*28, 128)  # 定义第一个全连接层,输入大小为28*28,输出大小为128
        self.fc2 = nn.Linear(128, 10)     # 定义第二个全连接层,输入大小为128,输出大小为10(10个类别)

    def forward(self, x):
        x = self.fc1(x)  # 将输入x通过第一个全连接层
        x = torch.relu(x)  # 应用ReLU激活函数
        x = self.fc2(x)  # 将x通过第二个全连接层
        return x  # 返回最终输出

# 创建模型实例并打印
model = SimpleNN()
print(model)
2. ReLU 层(激活函数层)

ReLU 层是一种常用的激活函数层,表示为 Rectified Linear Unit。它将所有负值置为零,而正值保持不变。

示例代码

python 复制代码
# ReLU层示例代码
x = torch.tensor([-1.0, 0.0, 1.0, 2.0])  # 定义一个张量
relu = nn.ReLU()  # 创建ReLU激活函数实例
output = relu(x)  # 应用ReLU激活函数
print(output)  # 输出结果
3. Conv2d 层(卷积层)

Conv2d 层是卷积神经网络中的核心层。它在输入图像上应用卷积操作,以提取局部特征。

示例代码

python 复制代码
# Conv2d层示例代码
conv_layer = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)  # 定义一个卷积层,输入通道1,输出通道6,卷积核大小5x5
input_image = torch.randn(1, 1, 28, 28)  # 创建一个随机输入张量,形状为1x1x28x28(批次大小1,单通道,28x28的图像)
output = conv_layer(input_image)  # 将输入图像通过卷积层
print(output.shape)  # 输出卷积层输出的形状
4. MaxPool2d 层(池化层)

MaxPool2d 层用于下采样输入的空间维度。它通过取每个池化窗口中的最大值来减少数据的维度。

示例代码

python 复制代码
# MaxPool2d层示例代码
pool_layer = nn.MaxPool2d(kernel_size=2, stride=2)  # 定义一个池化层,池化核大小为2x2,步幅为2
input_image = torch.randn(1, 1, 28, 28)  # 创建一个随机输入张量,形状为1x1x28x28
output = pool_layer(input_image)  # 将输入图像通过池化层
print(output.shape)  # 输出池化层输出的形状
5. Dropout 层(正则化层)

Dropout 层是一种正则化技术,用于防止过拟合。在训练过程中,它以一定的概率随机丢弃一些神经元。

示例代码

python 复制代码
# Dropout层示例代码
dropout_layer = nn.Dropout(p=0.5)  # 定义一个Dropout层,丢弃概率为0.5
input_tensor = torch.randn(5, 5)  # 创建一个随机输入张量
output = dropout_layer(input_tensor)  # 将输入张量通过Dropout层
print(output)  # 输出结果

综合示例:构建一个包含多种层的神经网络

以下是一个包含多个层的综合示例,展示如何构建和训练一个简单的神经网络。

python 复制代码
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms

# 定义一个包含卷积层、池化层、全连接层和Dropout层的神经网络
class ComplexNN(nn.Module):
    def __init__(self):
        super(ComplexNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)  # 卷积层,输入通道1,输出通道32,卷积核大小3x3
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)  # 池化层,池化核大小2x2
        self.fc1 = nn.Linear(32 * 14 * 14, 128)  # 全连接层,输入大小32*14*14,输出大小128
        self.fc2 = nn.Linear(128, 10)  # 全连接层,输入大小128,输出大小10(10个类别)
        self.dropout = nn.Dropout(p=0.5)  # Dropout层,丢弃概率为0.5

    def forward(self, x):
        x = self.conv1(x)  # 将输入x通过第一个卷积层
        x = torch.relu(x)  # 应用ReLU激活函数
        x = self.pool(x)  # 应用池化层
        x = x.view(-1, 32 * 14 * 14)  # 将张量展平
        x = self.dropout(x)  # 应用Dropout层
        x = self.fc1(x)  # 将x通过第一个全连接层
        x = torch.relu(x)  # 应用ReLU激活函数
        x = self.fc2(x)  # 将x通过第二个全连接层
        return x  # 返回最终输出

# 创建模型实例
model = ComplexNN()

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 加载MNIST数据集
transform = transforms.Compose([transforms.ToTensor()])
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)

# 训练模型
num_epochs = 5
for epoch in range(num_epochs):
    for images, labels in train_loader:
        optimizer.zero_grad()  # 清空梯度
        outputs = model(images)  # 前向传播
        loss = criterion(outputs, labels)  # 计算损失
        loss.backward()  # 反向传播
        optimizer.step()  # 更新参数

    print(f'Epoch {epoch+1}/{num_epochs}, Loss: {loss.item()}')

# 打印模型结构
print(model)

代码解释

  1. 定义模型:

    • ComplexNN 类包含卷积层、池化层、全连接层和 Dropout 层。
    • conv1 是卷积层,pool 是池化层,fc1 和 fc2 是全连接层,dropout 是 Dropout 层。
  2. 前向传播:

    • 在 forward 方法中,依次通过卷积、ReLU 激活、池化、展平、Dropout、全连接层、ReLU 激活和最后一个全连接层。
  3. 创建模型实例:

    • 创建 ComplexNN 模型实例。
  4. 定义损失函数和优化器:

    • 使用交叉熵损失函数和 Adam 优化器。
  5. 加载数据集:

    • 加载 MNIST 数据集并创建数据加载器。
  6. 训练模型:

    • 训练模型 5 个轮次,每个轮次中,进行前向传播、计算损失、反向传播和参数更新。

通过这个综合示例,展示了如何构建一个包含多种神经网络层的模型,并对其进行训练。每行代码都有详细的注释,帮助理解每个步骤的作用。

相关推荐
weixin_750330231 小时前
AI获客工具选型:从技术架构看中小企业效率提升方案
大数据·人工智能·架构·ai获客
mpp0072 小时前
36氪《2026 中国 AI Agent 行业发展报告》:当 Agent 进入「交付」主战场
大数据·人工智能
吃饱了得干活4 小时前
Agent 的决策与规划:ReAct、Plan-and-Execute、Reflexion 与 Tree of Thoughts
人工智能·llm·agent
阿明64 小时前
小白入门机器学习基础【AI】
人工智能·机器学习
java资料站4 小时前
十一、评估测试
开发语言·人工智能·python
东方佑4 小时前
从《事件发生与智能》的框架看中国古代命理学
人工智能·深度学习·语言模型·自然语言处理·架构
天远API4 小时前
零信任架构实战:基于天远运营商三要素简版V即时版查询构建自动化司乘安全绑定网关
人工智能·安全·架构·自动化
Henry-SAP5 小时前
SAP PP核心引擎计划策略业务解析
人工智能·云原生·sap·erp
DP DPharness5 小时前
拆开 dsh-knowledge 的检索链路,看 RRF 融合与锚点续读
人工智能·dpharness
I'm a winner5 小时前
《AI 赋能嵌入式开发:从 0 到全栈工程师》模块1|第4课时
人工智能