DNN揭秘深度神经网络:解析多层学习的威力——快速上手用pytorch框架快速搭建DNN

本文介绍了深度神经网络(DNN)的基本原理,包括其结构、层、神经元、权重和激活函数,以及如何使用PyTorch构建和训练一个多隐藏层的模型。通过前向传播和反向传播过程,展示了如何用随机梯度下降优化器进行模型训练。
摘要由CSDN通过智能技术生成

一、引言

深度神经网络(Deep Neural Network,DNN)是一种人工神经网络的形式,它包含多个神经网络层,通常包括输入层、多个隐藏层和输出层。每一层都由神经元组成,这些神经元通过权重连接在一起。

以下是关于 DNN 的一些关键概念:

  1. 层(Layers): DNN 由多个层组成,每一层包含一组神经元。通常包括输入层、隐藏层和输出层。输入层接收原始数据,输出层产生模型的输出。隐藏层用于学习数据的表示。

  2. 神经元(Neurons): 神经元是 DNN 的基本单元,它们接收输入,应用权重,然后通过激活函数产生输出。神经元之间的连接具有权重,这些权重是模型训练时学习的参数。

  3. 权重(Weights): 权重是连接两个神经元之间的强度,它们表示了输入的重要性。在训练过程中,权重被调整以最小化损失函数,从而使模型的预测更接近实际值。

  4. 激活函数(Activation Function): 激活函数决定神经元的输出。常用的激活函数包括ReLU(Rectified Linear Unit)、Sigmoid 和 Tanh。激活函数引入非线性性,使得网络能够学习更复杂的关系。

  5. 前向传播(Forward Propagation): 在前向传播过程中,输入数据通过网络从输入层传递到输出层,形成模型的预测。

  6. 反向传播(Backward Propagation): 反向传播是训练神经网络的关键步骤。通过计算损失函数对模型参数(权重和偏差)的梯度,然后使用梯度下降等优化算法来更新这些参数,以降低预测误差。

深度神经网络在许多领域取得了巨大成功,包括图像识别、自然语言处理、语音识别等。它们的深度结构使其能够学习和表示复杂的特征和模式,从而提高模型性能。

之前的博客有提到如何用numpy搭建一个DNN,这次使用工具pytorch快速搭建,不需要很多知识,快速上手使用,只需要知道输入和输出,我会在最后举一个例子,想要直接使用的同学可以仿照例子使用模型。

二、DNN

1. 导入包

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
  • import torch

    • 说明: 导入PyTorch主库。
    • 作用: 提供了张量(tensor)操作、自动求导等深度学习所需的核心功能。
  • import torch.nn as nn

    • 说明: 导入PyTorch的神经网络模块。
    • 作用: 提供了用于定义和训练神经网络的类和函数,例如Module基类和不同类型的层(如LinearConv2d)。
  • import torch.nn.functional as F

    • 说明: 导入PyTorch中的函数模块,通常用F别名表示。
    • 作用: 包含了一些不具备可学习参数的函数,如激活函数(ReLUSigmoid等)和损失函数(cross_entropy等)。

以下的模块在测试阶段才能用上,如果想要对代码进行测试,建议导入

  • import torch.optim as optim

    • 说明: 导入PyTorch中的优化器模块。
    • 作用: 提供了多种优化算法,如随机梯度下降(SGD)、Adam等,用于更新神经网络的权重以最小化损失。
  • from torch.utils.data import DataLoader, TensorDataset

    • 说明: 导入PyTorch中的数据处理模块。
    • 作用: DataLoader用于加载和批处理数据,TensorDataset用于将数据和标签封装成可迭代的数据集。

2. 初始化多隐藏层神经网络(DNN)

    def __init__(self, input_size, hidden_sizes, output_size):
        """
        初始化多隐藏层的深度神经网络

        参数:
            input_size (int): 输入特征的数量
            hidden_sizes (list): 包含每个隐藏层神经元数量的列表
            output_size (int): 输出的类别数量
        """
        super(MultiLayerDNN, self).__init__()

        # 定义第一个隐藏层
        self.hidden_layers = nn.ModuleList([
            nn.Linear(input_size, hidden_sizes[0])
        ])

        # 定义更多的隐藏层
        for i in range(1, len(hidden_sizes)):
            self.hidden_layers.extend([
                nn.Linear(hidden_sizes[i - 1], hidden_sizes[i]),
                nn.ReLU()  # 可以使用其他激活函数,如nn.Sigmoid(), nn.Tanh()
            ])

        # 定义输出层
        self.output_layer = nn.Linear(hidden_sizes[-1], output_size)

代码注释写的挺详细吧,不用过多解释了吧,有问题可以评论我。

3. 前向传播

def forward(self, x):
    """
    定义前向传播的过程
    参数:
    x (torch.Tensor): 输入数据

    返回:
        torch.Tensor: 模型的输出
    """
    # 遍历隐藏层并应用线性变换和激活函数
    for layer in self.hidden_layers:
        x = layer(x)

    # 应用输出层的线性变换
    x = self.output_layer(x)

    # 在最后一层输出上应用softmax激活函数
    x = F.softmax(x, dim=1)

    return x

4. 整合模型

将整个前向传播网络整合到一个模型中,方便后续使用,我附上整个代码,包括了上面的所有代码:

class MultiLayerDNN(nn.Module):
    def __init__(self, input_size, hidden_sizes, output_size):
        """
        初始化多隐藏层的深度神经网络

        参数:
            input_size (int): 输入特征的数量
            hidden_sizes (list): 包含每个隐藏层神经元数量的列表
            output_size (int): 输出的类别数量
        """
        super(MultiLayerDNN, self).__init__()

        # 定义第一个隐藏层
        self.hidden_layers = nn.ModuleList([
            nn.Linear(input_size, hidden_sizes[0])
        ])

        # 定义更多的隐藏层
        for i in range(1, len(hidden_sizes)):
            self.hidden_layers.extend([
                nn.Linear(hidden_sizes[i - 1], hidden_sizes[i]),
                nn.ReLU()  # 可以使用其他激活函数,如nn.Sigmoid(), nn.Tanh()
            ])

        # 定义输出层
        self.output_layer = nn.Linear(hidden_sizes[-1], output_size)

    def forward(self, x):
        """
        定义前向传播的过程

        参数:
            x (torch.Tensor): 输入数据

        返回:
            torch.Tensor: 模型的输出
        """
        # 遍历隐藏层并应用线性变换和激活函数
        for layer in self.hidden_layers:
            x = layer(x)

        # 应用输出层的线性变换
        x = self.output_layer(x)

        # 在最后一层输出上应用softmax激活函数
        x = F.softmax(x, dim=1)

        return x

5. 定义输入、隐藏层和输出的维度

# 定义输入、隐藏层和输出的维度
input_size = 3
hidden_sizes = [32, 64, 128]
output_size = 5

6. 创建模型实例、损失函数和优化器

# 创建模型实例、损失函数和优化器
model = MultiLayerDNN(input_size, hidden_sizes, output_size)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 打印模型结构
print(model)

这样整个模型就搭建完成了,下面就可以进行训练了

三、训练&测试

1.生成并加载一些示例数据(这里仅作为演示,实际中你应该使用你的数据集)

# 假设你有100个样本,每个样本包含10个特征,共有5个类别
num_samples = 100
input_data = torch.randn(num_samples, input_size)
target_labels = torch.randint(0, output_size, (num_samples,))

# 将数据包装成TensorDataset
dataset = TensorDataset(input_data, target_labels)

# 定义 DataLoader 加载数据
batch_size = 16
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

2. 训练模型

# 训练模型
num_epochs = 100
for epoch in range(num_epochs):
    for inputs, labels in dataloader:
        optimizer.zero_grad()  # 清零梯度

        # 前向传播
        outputs = model(inputs)

        # 计算损失
        loss = criterion(outputs, labels)

        # 反向传播
        loss.backward()

        # 更新权重
        optimizer.step()

    # 打印每个epoch的损失
    print(f'Epoch {epoch + 1}/{num_epochs}, Loss: {loss.item()}')

3.测试模型 

# 测试模型
model.eval()  # 切换到评估模式
with torch.no_grad():
    # 生成一些测试数据
    test_input_data = torch.randn(10, input_size)

    # 进行预测
    predictions = model(test_input_data)

    # 打印预测结果
    print("Predictions:")
    print(predictions)

四、总结

我们深入了解了神经网络的基本结构,包括层次结构、神经元、权重和激活函数。通过前向传播和反向传播的过程,我们了解了模型是如何进行训练并不断优化参数以适应数据的。

在具体实现方面,我们使用了PyTorch,这是一个强大的深度学习框架。通过示例代码,我们展示了如何使用PyTorch构建一个多隐藏层的深度神经网络,并使用随机梯度下降(SGD)优化器来训练模型。

深度神经网络在许多领域展现了巨大的成功,如图像识别、自然语言处理等。它们的多层结构使其能够学习和表示复杂的特征和模式,从而提高模型的性能。

最后,我们探讨了DNN的挑战和未来方向,以及在实际应用中取得的成就。深度学习领域正在不断演进,对于理解和应用深度神经网络,本文希望能够提供一个全面而清晰的指南。无论是初学者还是有经验的从业者,都能够通过学习深度神经网络,更好地应对复杂的机器学习任务。

  • 36
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星宇星静

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值