当前位置: 首页 > article >正文

浅谈DNN(深度神经网络)算法原理

        深度神经网络(Deep Neural Network, DNN)是一种基于人工神经网络的机器学习模型,它由多个隐藏层组成,能够自动从大量数据中学习复杂的模式和特征。DNN 的基本结构包括输入层、多个隐藏层和输出层。

1.神经元模型

神经元是 DNN 的基本计算单元。对于一个输入向量 ,神经元的输出  可以通过以下公式计算:

其中, 是输入  对应的权重, 是偏置, 是激活函数。激活函数的作用是引入非线性因素,使得 DNN 能够学习到复杂的非线性关系。

2.前向传播

        前向传播是指输入数据从输入层经过多个隐藏层,最终传递到输出层的过程。在每一层中,神经元根据上述公式计算输出,并将输出作为下一层的输入。假设第  层有  个神经元,第  层有  个神经元,那么第  层第  个神经元的输入  和输出  可以表示为:

其中, 是第  层第  个神经元到第  层第  个神经元的权重, 是第  层第  个神经元的偏置。

3. 损失函数

        损失函数用于衡量模型的预测输出与真实标签之间的差异。常见的损失函数包括均方误差(Mean Squared Error, MSE)、交叉熵损失(Cross Entropy Loss)等。以均方误差为例,对于一个样本 ,模型的预测输出为 ,则损失函数  可以表示为:

4. 反向传播

反向传播是一种用于计算损失函数关于模型参数(权重和偏置)的梯度的算法。通过链式法则,从输出层开始,逐层计算梯度,并根据梯度更新模型参数。参数更新的公式通常采用梯度下降法:

其中, 是学习率,控制参数更新的步长。

接下来,我们来用 Python 和 PyTorch 库实现简单 DNN 的示例,用于解决手写数字识别问题(MNIST 数据集)。

import torch

import torch.nn as nn

import torch.optim as optim

from torchvision import datasets, transforms

from torch.utils.data import DataLoader

# 定义超参数

batch_size = 64

learning_rate = 0.001

epochs = 5

# 数据预处理

transform = transforms.Compose([

transforms.ToTensor(),

transforms.Normalize((0.1307,), (0.3081,))

])

# 加载MNIST数据集

train_dataset = datasets.MNIST(root='./data', train=True,

download=True, transform=transform)

test_dataset = datasets.MNIST(root='./data', train=False,

download=True, transform=transform)

train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)

test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

# 定义DNN模型

class DNN(nn.Module):

def __init__(self):

super(DNN, self).__init__()

self.fc1 = nn.Linear(28 * 28, 128)

self.fc2 = nn.Linear(128, 64)

self.fc3 = nn.Linear(64, 10)

self.relu = nn.ReLU()

def forward(self, x):

x = x.view(-1, 28 * 28)

x = self.relu(self.fc1(x))

x = self.relu(self.fc2(x))

x = self.fc3(x)

return x

model = DNN()

# 定义损失函数和优化器

criterion = nn.CrossEntropyLoss()

optimizer = optim.Adam(model.parameters(), lr=learning_rate)

# 训练模型

for epoch in range(epochs):

model.train()

for batch_idx, (data, target) in enumerate(train_loader):

optimizer.zero_grad()

output = model(data)

loss = criterion(output, target)

loss.backward()

optimizer.step()

if batch_idx % 100 == 0:

print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} '

f'({100. * batch_idx / len(train_loader):.0f}%)]\tLoss: {loss.item():.6f}')

# 测试模型

model.eval()

test_loss = 0

correct = 0

with torch.no_grad():

for data, target in test_loader:

output = model(data)

test_loss += criterion(output, target).item()

pred = output.argmax(dim=1, keepdim=True)

correct += pred.eq(target.view_as(pred)).sum().item()

test_loss /= len(test_loader.dataset)

print(f'\nTest set: Average loss: {test_loss:.4f}, Accuracy: {correct}/{len(test_loader.dataset)} '

f'({100. * correct / len(test_loader.dataset):.0f}%)\n')

代码解释

  1. 数据预处理:使用 transforms 对 MNIST 数据集进行预处理,包括将图像转换为张量和归一化。

  2. 模型定义:定义一个包含三个全连接层的 DNN 模型,使用 ReLU 作为激活函数。
  3. 损失函数和优化器:使用交叉熵损失函数和 Adam 优化器。
  4. 训练模型:通过前向传播计算损失,然后使用反向传播更新模型参数。
  5. 测试模型:在测试集上评估模型的性能,计算平均损失和准确率。


http://www.kler.cn/a/552407.html

相关文章:

  • Spring MVC Streaming and SSE Request Processing SSE可以实现chatgpt一次请求分批次响应的效果
  • 基于Ubuntu系统的docker环境对MySQL8.0.36主从部署
  • Swagger 转 Word 技术方案
  • 【核心算法篇三】《DeepSeek强化学习:Atari游戏训练框架解析》
  • 如何利用爬虫抓取多个页面的商品销量数据
  • ubuntu网络及软件包管理
  • 算法每日一练 (3)
  • 使用 @Results 注解来手动指定字段映射
  • 24蓝桥省赛B-数字接龙
  • 【旋转框目标检测】基于YOLO11/v8深度学习的遥感视角船只智能检测系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
  • Android Studio 提示 !Failed to initialize editor
  • 力扣LeetCode: 1299 将每个元素替换为右侧最大元素
  • MySQL 窗口函数:功能、使用场景与性能优化
  • 【Arxiv 大模型最新进展】PEAR: 零额外推理开销,提升RAG性能!(★AI最前线★)
  • 【05】密码学与隐私保护
  • vue3项目实践心得-多次渲染同一svg + 理解v-if、transition、dom加载之间的顺序
  • 详解AbstractQueuedSynchronizer(AQS)源码
  • ubantu安装skywalking10.0.0
  • 人工智能 - 脑机融合:人类脑组织操控机器人,具身智能时代的革命性突破
  • Java编程语言:从基础到高级应用的全面探索