#深度学习基础:神经网络基础与PyTorch - 实践

news/2025/11/7 18:04:17/文章来源:https://www.cnblogs.com/slgkaifa/p/19200542

#深度学习基础:神经网络基础与PyTorch - 实践

深度学习基础:神经网络基础与PyTorch

1. 神经网络基础概念

1.1 什么是神经网络

人工神经网络(Artificial Neural Network,ANN)是一种模仿生物神经网络结构和功能的计算模型。它由多个互相连接的人工神经元构成,可以用于处理和学习复杂的数据模式,尤其适合解决非线性问题。

生物神经元的工作原理:

  • 树突接收输入信号
  • 细胞核处理信号
  • 轴突输出信号

人工神经元的构建:

# 神经元的基本计算过程
z = w·x + b  # 内部状态值(加权求和)
a = f(z)     # 激活值(通过激活函数)

1.2 神经网络结构

神经网络由三个基本部分组成:

  1. 输入层(Input Layer):接收原始数据
  2. 隐藏层(Hidden Layers):处理数据,提取特征
  3. 输出层(Output Layer):产生最终预测结果

神经网络特点:

  • 同一层的神经元之间没有连接
  • 第N层的每个神经元和第N-1层的所有神经元相连(全连接)
  • 每个连接都有一个权重值(w系数和b系数)
  • 输入层的特征数必须与对接神经元的输入参数数量相同

1.3 前向传播过程

前向传播是数据从输入到输出经过一层一层神经元产生预测值的过程:

# 前向传播示例
def forward_pass(x, weights, biases):
# 第一层
z1 = torch.matmul(x, weights[0]) + biases[0]
a1 = torch.relu(z1)
# 第二层
z2 = torch.matmul(a1, weights[1]) + biases[1]
a2 = torch.relu(z2)
# 输出层
z3 = torch.matmul(a2, weights[2]) + biases[2]
output = torch.softmax(z3, dim=-1)
return output

2. 激活函数详解

2.1 为什么需要激活函数

没有激活函数的神经网络等价于线性模型,无法处理复杂的非线性问题。激活函数为网络引入非线性因素,使得网络可以逼近任意函数。

2.2 常见激活函数

2.2.1 Sigmoid函数

公式: σ(x) = 1/(1 + e^(-x))

特点:

PyTorch实现:

import torch
import matplotlib.pyplot as plt
def plot_sigmoid():
fig, axes = plt.subplots(1, 2)
# 函数图像
x = torch.linspace(-20, 20, 1000)
y = torch.sigmoid(x)
axes[0].plot(x, y)
axes[0].grid()
axes[0].set_title('Sigmoid 函数图像')
# 导数图像
x = torch.linspace(-20, 20, 1000, requires_grad=True)
torch.sigmoid(x).sum().backward()
axes[1].plot(x.detach(), x.grad)
axes[1].grid()
axes[1].set_title('Sigmoid 导数图像')
plt.show()
2.2.2 Tanh函数

公式: tanh(x) = (e^x - e(-x))/(ex + e^(-x))

特点:

  • 输出范围:(-1, 1)
  • 以0为中心,收敛速度比Sigmoid快
  • 导数范围:(0, 1)
  • 仍然存在梯度消失问题

PyTorch实现:

def plot_tanh():
fig, axes = plt.subplots(1, 2)
# 函数图像
x = torch.linspace(-20, 20, 1000)
y = torch.tanh(x)
axes[0].plot(x, y)
axes[0].grid()
axes[0].set_title('Tanh 函数图像')
# 导数图像
x = torch.linspace(-20, 20, 1000, requires_grad=True)
torch.tanh(x).sum().backward()
axes[1].plot(x.detach(), x.grad)
axes[1].grid()
axes[1].set_title('Tanh 导数图像')
plt.show()
2.2.3 ReLU函数

公式: ReLU(x) = max(0, x)

特点:

  • 计算简单,训练效率高
  • 缓解梯度消失问题
  • 可能产生"神经元死亡"现象
  • 目前最常用的激活函数

PyTorch实现:

def plot_relu():
fig, axes = plt.subplots(1, 2)
# 函数图像
x = torch.linspace(-20, 20, 1000)
y = torch.relu(x)
axes[0].plot(x, y)
axes[0].grid()
axes[0].set_title('ReLU 函数图像')
# 导数图像
x = torch.linspace(-20, 20, 1000, requires_grad=True)
torch.relu(x).sum().backward()
axes[1].plot(x.detach(), x.grad)
axes[1].grid()
axes[1].set_title('ReLU 导数图像')
plt.show()
2.2.4 Softmax函数

公式: softmax(x_i) = e^(x_i) / Σ(e^(x_j))

特点:

  • 用于多分类问题
  • 输出概率分布(和为1)
  • 将logits转换为概率

PyTorch实现:

def demo_softmax():
scores = torch.tensor([0.2, 0.02, 0.15, 0.15, 1.3, 0.5, 0.06, 1.1, 0.05, 3.75])
probabilities = torch.softmax(scores, dim=0)
print("Softmax输出:", probabilities)
print("概率和:", probabilities.sum())  # 应该等于1

2.3 激活函数选择指南

隐藏层:

  • 优先选择ReLU
  • 如果ReLU效果不好,尝试Leaky ReLU
  • 少使用sigmoid,可以尝试tanh

输出层:

  • 二分类:sigmoid
  • 多分类:softmax
  • 回归:identity(恒等函数)

3. 参数初始化

3.1 为什么需要参数初始化

不正确的权重初始化会导致梯度消失或爆炸问题,影响训练效果。

3.2 常见初始化方法

3.2.1 传统初始化方法
import torch.nn as nn
def traditional_init():
linear = nn.Linear(5, 3)
# 1. 均匀分布初始化
nn.init.uniform_(linear.weight)
# 2. 正态分布初始化
nn.init.normal_(linear.weight, mean=0, std=1)
# 3. 全0初始化
nn.init.zeros_(linear.weight)
# 4. 全1初始化
nn.init.ones_(linear.weight)
# 5. 固定值初始化
nn.init.constant_(linear.weight, 5)
print(linear.weight.data)
3.2.2 Kaiming初始化(He初始化)

专为ReLU激活函数设计:

def kaiming_init():
linear = nn.Linear(5, 3)
# Kaiming正态分布初始化
nn.init.kaiming_normal_(linear.weight)
# Kaiming均匀分布初始化
nn.init.kaiming_uniform_(linear.weight)
print(linear.weight.data)

公式:

  • 正态分布:std = sqrt(2 / fan_in)
  • 均匀分布:limit = sqrt(6 / fan_in)
3.2.3 Xavier初始化(Glorot初始化)

根据输入和输出维度自动选择权重范围:

def xavier_init():
linear = nn.Linear(5, 3)
# Xavier正态分布初始化
nn.init.xavier_normal_(linear.weight)
# Xavier均匀分布初始化
nn.init.xavier_uniform_(linear.weight)
print(linear.weight.data)

公式:

  • 正态分布:std = sqrt(2 / (fan_in + fan_out))
  • 均匀分布:limit = sqrt(6 / (fan_in + fan_out))

3.3 初始化方法选择

  • 偏置一般初始化为0
  • 权重优先选择Kaiming或Xavier初始化
  • ReLU激活函数推荐使用Kaiming初始化
  • 其他激活函数推荐使用Xavier初始化

4. PyTorch神经网络构建实战

4.1 自定义神经网络类

import torch
import torch.nn as nn
from torchsummary import summary
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
# 第一层隐藏层
self.linear1 = nn.Linear(3, 3)
nn.init.xavier_normal_(self.linear1.weight)
nn.init.ones_(self.linear1.bias)
# 第二层隐藏层
self.linear2 = nn.Linear(3, 2)
nn.init.kaiming_normal_(self.linear2.weight, nonlinearity='relu')
nn.init.ones_(self.linear2.bias)
# 输出层
self.out = nn.Linear(2, 2)
def forward(self, x):
# 第一层 + 激活函数
x = self.linear1(x)
x = torch.sigmoid(x)
# 第二层 + 激活函数
x = self.linear2(x)
x = torch.relu(x)
# 输出层 + 激活函数
x = self.out(x)
x = torch.softmax(x, dim=-1)
return x

4.2 模型训练和测试

def train_model():
# 创建模型实例
model = MyModel()
# 准备数据
input_data = torch.randn(5, 3)
print("输入数据形状:", input_data.shape)
# 前向传播
output = model(input_data)
print("输出数据形状:", output.shape)
print("输出数据:", output)
# 查看模型参数
print("\n模型参数:")
for name, param in model.named_parameters():
print(f"{name}: {param.shape}")
# 计算模型参数量
summary(model, input_size=(3,), batch_size=5)
if __name__ == '__main__':
train_model()

4.3 线性回归实战案例

import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import make_regression
from torch.utils.data import TensorDataset, DataLoader
import matplotlib.pyplot as plt
def create_dataset():
"""构建回归数据集"""
x, y, coef = make_regression(
n_samples=100,
n_features=1,
bias=2,
noise=10,
coef=True,
random_state=22
)
# 转换为张量
tensor_x = torch.tensor(x, dtype=torch.float)
tensor_y = torch.tensor(y, dtype=torch.float)
return tensor_x, tensor_y, coef
def train_linear_regression():
"""训练线性回归模型"""
# 获取数据
x, y, coef = create_dataset()
# 创建数据加载器
dataset = TensorDataset(x, y)
dataloader = DataLoader(dataset, batch_size=4, shuffle=True)
# 构建模型
model = nn.Linear(1, 1)
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练参数
epochs = 100
total_loss = 0
epoch_losses = []
# 训练循环
for epoch in range(epochs):
epoch_loss = 0
for batch_x, batch_y in dataloader:
batch_y = batch_y.reshape(-1, 1)
# 前向传播
y_pred = model(batch_x)
loss = criterion(y_pred, batch_y)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
epoch_loss += loss.item()
epoch_losses.append(epoch_loss / len(dataloader))
if (epoch + 1) % 20 == 0:
print(f"Epoch {epoch+1}, Loss: {epoch_losses[-1]:.4f}")
# 绘制结果
plt.figure(figsize=(12, 4))
# 损失曲线
plt.subplot(1, 2, 1)
plt.plot(epoch_losses)
plt.title('Training Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.grid(True)
# 拟合结果
plt.subplot(1, 2, 2)
plt.scatter(x, y, alpha=0.6, label='Data')
plt.plot(x, x * coef + 2, 'r-', label='True Line')
plt.plot(x, x * model.weight.detach() + model.bias.detach(),
'g--', label='Predicted Line')
plt.title('Linear Regression Result')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
print(f"真实参数: w={coef[0]:.4f}, b=2.0000")
print(f"预测参数: w={model.weight.item():.4f}, b={model.bias.item():.4f}")
if __name__ == '__main__':
train_linear_regression()

5. 数据形状变化分析

5.1 形状变化示例

def analyze_shape_changes():
model = MyModel()
input_data = torch.randn(5, 3)
print("输入数据形状:", input_data.shape)  # torch.Size([5, 3])
# 第一层
x = model.linear1(input_data)
print("第一层输出形状:", x.shape)  # torch.Size([5, 3])
# 激活函数不改变形状
x = torch.sigmoid(x)
print("激活后形状:", x.shape)  # torch.Size([5, 3])
# 第二层
x = model.linear2(x)
print("第二层输出形状:", x.shape)  # torch.Size([5, 2])
# 输出层
x = model.out(x)
print("最终输出形状:", x.shape)  # torch.Size([5, 2])

5.2 参数计算

对于全连接层,参数计算公式为:
参数量 = 输入特征数 × 输出特征数 + 输出特征数

def calculate_parameters():
model = MyModel()
total_params = 0
for name, param in model.named_parameters():
param_count = param.numel()
total_params += param_count
print(f"{name}: {param.shape} -> {param_count} 参数")
print(f"总参数量: {total_params}")

6. 广播机制(扩展知识)

6.1 广播规则

广播机制允许不同形状的张量进行运算:

  1. 如果两个数组的维度数不相同,小维度数组的形状将在左边补1
  2. 如果shape的维度不匹配,但有维度是1,可以扩展维度是1的维度匹配另一个数组
  3. 如果shape的维度不匹配,且没有任何维度是1,则匹配失败

6.2 广播示例

import numpy as np
def broadcast_examples():
# 示例1:标量与数组
a = np.array([0, 1, 2])
b = 2
print("a + b:", a + b)  # [2, 3, 4]
# 示例2:不同形状的数组
a = np.array([[1, 2, 3], [4, 5, 6]])  # (2, 3)
b = np.array([1, 1, 1])  # (3,)
print("a + b:\n", a + b)
# 示例3:不满足广播条件
a = np.array([1, 2, 3, 4])  # (4,)
b = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]])  # (4, 3)
try:
print("a + b:", a + b)
except ValueError as e:
print("广播失败:", e)
if __name__ == '__main__':
broadcast_examples()

7. 总结

通过今天的学习,我们掌握了:

  1. 神经网络基础概念:理解了人工神经元的构建和前向传播过程
  2. 激活函数:掌握了Sigmoid、Tanh、ReLU、Softmax等常用激活函数的特点和使用场景
  3. 参数初始化:学会了Kaiming和Xavier等现代初始化方法
  4. PyTorch实战:能够使用PyTorch构建和训练神经网络模型
  5. 线性回归案例:通过完整的案例理解了神经网络的训练流程

关键要点回顾

希望这篇文章能帮助大家更好地理解神经网络的基础知识,为后续的深度学习学习打下坚实的基础!

日期:2025年10月9日

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/959083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

忘了哪个地方忘了哪次考试创新题调整法

简明题干:在这样第一象限的这个三角形内 ( 含边界 ) 内有 \(n\) 个点,其中第 \(i\) 个点记为 \((x_i,y_i)\),现将这 \(n\) 个点划分成两个集合 \(A,B\),记 \(A\) 集合中的点的横坐标之和为 \(X(A)\),\(B\) 集合中…

2025 年最新推荐充电桩源头厂家排行榜:高新技术认证企业领衔,权威测评优选品质之选电动车充电桩/家用充电桩/超级充电桩公司推荐

引言 随着新能源汽车保有量持续攀升,充电桩作为关键配套基础设施,市场需求呈爆发式增长,行业却面临产品质量参差不齐、技术水平差异大等问题。近期,行业权威协会开展充电桩源头厂家专项测评,从资质认证、技术实力…

external_url 高可用相同 主从复制 不同。

external_url 是 Harbor 的外部访问地址。主从配置相同 external_url:如果是高可用集群:这是正确且必需的配置。所有实例共享后端状态(数据库、Redis、存储),并通过负载均衡器对外。如果是主从复制:这是错误的配…

P3830 [SHOI2012] 随机树

P3830 [SHOI2012] 随机树 题目 题目描述 一棵含 \(n\) 个叶结点的二叉树可以通过如下方式生成。初始时只有根结点。首先,将根结点展开(本题中的“展开”是指给一个叶结点添上左、右两个子结点): 然后,等概率地随机…

NORDIC蓝牙6.0新品NRF54L15多协议超低功耗高性能BLE芯片

NORDIC蓝牙6.0新品NRF54L15多协议超低功耗高性能BLE芯片NRF54L15,NRF54L10,NRF54L05 是NORDIC推出的高性能,多协议,低功耗BLE6.0芯片 产品简介 增强的多协议支持 nRF54L 系列支持低功耗蓝牙、蓝牙 Mesh、Thread、M…

国产SUB-1G芯片DP4363F支持119-1050mhz超低功耗

国产SUB-1G芯片DP4363F支持119-1050mhz超低功耗DP4363是一款高性能、低电流的收发器,覆盖了从119MHZ到1050MHz的频段。它是系列完整发射器、接收器和收发器产品中的组成部分,适用于各种广泛的应用场景。该设备具有卓…

elasticsearch-head-chrome插件

https://files.cnblogs.com/files/stubborn-dude/elasticsearch-head-chrome插件.zip?t=1762508308&download=true

NOIP 模拟赛 3 比赛总结

分数:\(100 + 60 + 0 + 10 = 170\) T4 最终结果没取模,挂了 60 分!永康喵喵又翻车了! T1 一道不太水的水题。 这道题要求满足 \(1 \le i < j < k < l \le n\) 且 \(a_i \oplus a_j \oplus a_k \oplus a_l…

2025年云南GEO优化公司权威推荐榜单:seo优化/网站seo优化/百家号源头公司精选

在生成式AI技术重塑搜索生态的背景下,GEO已成为企业抢占智能流量入口的核心战略。据行业数据显示,2025年中国GEO市场规模已突破200亿元,年复合增长率高达67%,超过78%的企业将其纳入核心增长战略。云南作为西南地区…

易基因:中国海洋大学隋正红团队揭示m6A修饰调控植物生长和光合作用的表观转录机制|项目文章

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 近日,中国海洋大学海洋生物遗传学与育种教育部重点实验室朱智梅博士为第一作者,隋正红教授为通讯作者在《Harmful Algae》期刊发表题为“Effects o…

ORACLE游标序列化

ORACLE游标序列化 ORACLE中可以直接调用接口,需要把数据构造成xml格式,方便请求参数构造.比如在使用select utl_http.request(http://www.baidu.com) from dual可以访问百度页面 1. 使用DBMS_XMLGEN序列化 declarectx …

iqoo手机关掉视频彩铃

打开中国联通APP 搜索视频彩铃找到 我的彩铃功能,并且关闭视频彩铃功能不久之后,会收到关闭成功的短信通知。本文来自博客园,作者:imzhi,转载请注明原文链接:https://www.cnblogs.com/imzhi/p/19200523

2025低烟无卤/UL3302/UL3767/UL4413辐照线厂家推荐明秀电子,品质卓越!

2025低烟无卤/UL3302/UL3767/UL4413辐照线厂家推荐明秀电子,品质卓越! 随着全球安全环保标准的不断提升,低烟无卤线缆市场正迎来爆发式增长。据统计数据显示,2024年全球低烟无卤线缆市场规模已突破300亿美元,预计…

企业品牌管理:它是什么以及如何掌握它

公司最有价值的资产并非总是其产品或服务,往往是其品牌。强大的企业品牌能够塑造消费者认知、培养忠诚度并推动长期业务成功。它超越了简单的标识和标语,影响着从客户到投资者等所有利益相关者对公司的整体看法。有效…

Http压缩编码导致数据乱码

在一次项目上线时,发现部分接口请求失败,但是无返回数据是会成功的问题。 开始排查 一开始以为是通信加解密导致的问题,但是部分接口可以,部分接口报错,又排除了这个选项。 于是考虑是网关问题,还是服务端代码问…

未来出行智慧车联网与智慧交通方案 NRF9151

​随着5G、物联网(IoT)、人工智能(AI)和大数据技术的快速发展,车联网(IoV)与智慧交通已成为智慧城市建设的重要组成部分。通过智能芯片与先进通信技术的应用,车联网与智慧交通正在深刻改变人们的出行方式,推动…

32

所学时间:9时间 博客量:1 代码量:1oo 所学知识:人机交互实验,机器学习

PHY6252低成本BLE5.2智能灯控智能家居蓝牙透传芯片模块

PHY6252低成本BLE5.2智能灯控智能家居蓝牙透传芯片模块简介 PHY6252是一款支持BLE 5.2功能的系统级芯片(SoC),集成了低功耗的高性能多模射频收发机,搭载32位高性能低功耗处理器,提供64K retention SRAM、可选512/…

绩效考核永远算不清?用好这5张表就够了!

在很多公司里,绩效考核一直是个麻烦事。指标分不清、 权重算不准、 分数对不上口径, 主管每月打分靠感觉,HR 对各部门反复追数据,到月底总有一堆人说“我怎么比上个月低了”,整个过程既费时又不透明。 但实际上,…

Qwen-Audio:一种新的大规模音频-语言模型 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …