【总结】深度学习的神经网络层(比如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 是池化层,fc1fc2 是全连接层,dropout 是 Dropout 层。
  2. 前向传播

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

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

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

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

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

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

相关推荐
逻辑君几秒前
Research in Brain-inspired Computing [1]-果蝇大脑被上传
人工智能·机器学习
jay神4 分钟前
基于YOLOv8的传送带异物检测系统
人工智能·python·深度学习·yolo·可视化·计算机毕业设计
强风7946 分钟前
OpenCV基础入门
人工智能·opencv·计算机视觉
小超同学你好6 分钟前
Langgragh 19. Skills 4. SkillToolset 式设计 —— 工具化按需加载的 Skills(含代码示例)
人工智能·语言模型·langchain
人工智能培训7 分钟前
如何衔接知识图谱与图神经网络
人工智能·神经网络·知识图谱
火星资讯10 分钟前
Zenlayer Fabric Port 新加坡首发:城域免费,全球畅连
人工智能·科技
新缸中之脑10 分钟前
20个Nano Banana 2创意工作流
人工智能
智驱力人工智能12 分钟前
馆藏文物预防性保护依赖的图像分析技术 文物损害检测 文物破损检测 文物损害识别误报率优化方案 文物安全巡查AI系统案例 智慧文保AI监测
人工智能·算法·安全·yolo·边缘计算
tobias.b14 分钟前
机器学习 超清晰通俗讲解 + 核心算法全解(深度+易懂版)
人工智能·算法·机器学习