【总结】深度学习的神经网络层(比如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 个轮次,每个轮次中,进行前向传播、计算损失、反向传播和参数更新。

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

相关推荐
背心2块钱包邮21 小时前
第7节——积分技巧(Integration Techniques)-代换积分法
人工智能·python·深度学习·matplotlib
无心水21 小时前
【分布式利器:大厂技术】4、字节跳动高性能架构:Kitex+Hertz+BytePS,实时流与AI的极致优化
人工智能·分布式·架构·kitex·分布式利器·字节跳动分布式·byteps
阿正的梦工坊21 小时前
DreamGym:通过经验合成实现代理学习的可扩展化
人工智能·算法·大模型·llm
PixelMind21 小时前
【超分辨率专题】FlashVSR:单步Diffusion的再次提速,实时视频超分不是梦!
深度学习·音视频·超分辨率·vsr
湘-枫叶情缘21 小时前
人脑生物芯片作为“数字修炼世界”终极载体的技术前景、伦理挑战与实现路径
人工智能
噜~噜~噜~21 小时前
偏导数和全导数的个人理解
深度学习·偏导数·梯度·全导数
Aaron158821 小时前
侦察、测向、识别、干扰一体化平台系统技术实现
人工智能·fpga开发·硬件架构·边缘计算·信息与通信·射频工程·基带工程
维维180-3121-14551 天前
作物模型的未来:DSSAT与机器学习、遥感及多尺度模拟的融合
人工智能·生态学·农业遥感·作物模型·地理学·农学
lx7416026981 天前
change-detection关于llm方向的任务与优化
深度学习
阿杰学AI1 天前
AI核心知识38——大语言模型之Alignment(简洁且通俗易懂版)
人工智能·安全·ai·语言模型·aigc·ai对齐·alignment