从零开始深度学习:全连接层、损失函数与梯度下降的详尽指南

引言

在深度学习的领域,全连接层、损失函数与梯度下降是三块重要的基石。如果你正在踏上深度学习的旅程,理解它们是迈向成功的第一步。这篇文章将从概念到代码、从基础到进阶,详细剖析这三个主题,帮助你从小白成长为能够解决实际问题的开发者。

第一部分:全连接层——神经网络的基础单元

1.1 什么是全连接层?

全连接层(Fully Connected Layer,简称FC层)是神经网络中最基本的组件之一。它的核心任务是将输入特征映射到输出空间,并在这个过程中学习特征之间的复杂关系。

公式定义:
全连接层的数学表达式如下:

y = f ( W x + b ) y = f(Wx + b) y=f(Wx+b)

(x):输入向量,表示当前层的输入特征。

(W):权重矩阵,表示每个输入特征对输出特征的影响权重。

(b):偏置向量,为网络提供更大的表达能力。

(f):激活函数,为模型引入非线性。

全连接层的核心是通过权重矩阵和偏置向量的线性变换学习输入和输出之间的映射关系。最终,通过激活函数完成非线性变换,使得网络能够处理复杂的任务。

1.2 为什么需要全连接层?

全连接层的主要作用是:

特征融合:将不同的特征组合起来,捕捉全局信息。

非线性表达:通过激活函数,使网络能够学习复杂的非线性映射关系。

分类和回归任务:在任务的最后几层,全连接层常用于将特征映射为目标类别或回归值。

在图像分类任务中,全连接层负责将卷积层提取的特征映射到最终的分类结果。例如:

输入:卷积层输出的特征(如512维向量)。

输出:分类结果(如10类)。

1.3 全连接层的实现与代码示例

以下是一个简单的全连接网络,用于对MNIST手写数字进行分类:

import torch
import torch.nn as nn

定义全连接神经网络

class FullyConnectedNet(nn.Module):
    def __init__(self):
        super(FullyConnectedNet, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 128)  # 输入层到隐藏层
        self.fc2 = nn.Linear(128, 64)      # 隐藏层到另一个隐藏层
        self.fc3 = nn.Linear(64, 10)       # 隐藏层到输出层def forward(self, x):
        x = x.view(x.size(0), -1)          # 将二维输入展平
        x = torch.relu(self.fc1(x))       # 激活函数ReLU
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)                   # 输出分类
        return x

测试网络

model = FullyConnectedNet()
sample_input = torch.randn(1, 28, 28)  # 模拟一个MNIST样本
output = model(sample_input)
print(output)

代码解读:

nn.Linear 创建全连接层,定义输入和输出的维度。

torch.relu 使用 ReLU 激活函数引入非线性。

x.view 展平输入张量,为全连接层提供一维向量形式的数据。

1.4 全连接层的局限性

尽管全连接层功能强大,但也有一定局限性:

参数量大:全连接层需要存储和计算大量的权重和偏置,容易导致过拟合。

空间感缺失:无法有效利用输入数据的空间信息(如图像的像素结构),这也是卷积层的用武之地。

计算复杂度高:大规模网络可能导致训练和推理的计算开销过大。

第二部分:损失函数——模型的学习目标

2.1 什么是损失函数?

损失函数是衡量模型预测值与真实值之间差距的数学函数。深度学习的目标是通过优化算法(如梯度下降),不断调整模型参数,以最小化损失函数的值。

损失函数的两种主要类型:
回归问题:预测连续值,常用的损失函数包括均方误差(MSE)和平均绝对误差(MAE)。

分类问题:预测离散值,常用的损失函数是交叉熵损失。

2.2 常见损失函数

  1. 均方误差(MSE)
    M S E = 1 n ∑ i = 1 n ( y ^ i − y i ) 2 MSE = \frac{1}{n} \sum_{i=1}^n (\hat{y}_i - y_i)^2 MSE=n1i=1n(y^iyi)2

适用于回归问题,计算预测值与真实值的平方差。

  1. 交叉熵损失(Cross Entropy Loss)
    用于分类问题,衡量预测分布与真实分布之间的差异:

L = − ∑ i = 1 n y i log ⁡ ( y ^ i ) L = -\sum_{i=1}^n y_i \log(\hat{y}_i) L=i=1nyilog(y^i)

  1. 二元交叉熵损失(Binary Cross Entropy)
    适用于二分类问题,公式为:

B C E = − 1 n ∑ i = 1 n [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] BCE = -\frac{1}{n} \sum_{i=1}^n \left[y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)\right] BCE=n1i=1n[yilog(y^i)+(1yi)log(1y^i)]

2.3 损失函数的代码实现

以下代码展示了如何使用 PyTorch 计算交叉熵损失:

import torch
import torch.nn as nn

模拟模型输出和真实标签

output = torch.tensor([[0.1, 0.8, 0.1], [0.7, 0.2, 0.1]])  # 模型预测
target = torch.tensor([1, 0])  # 真实标签

定义交叉熵损失

criterion = nn.CrossEntropyLoss()
loss = criterion(output, target)
print(f"Loss: {loss.item()}")

说明:

模型的输出是未经过 softmax 的原始分数(logits),nn.CrossEntropyLoss 会自动应用 softmax。

2.4 如何选择合适的损失函数?
回归问题:MSE 是默认选择,但 MAE 在对异常值敏感的场景中表现更好。

分类问题:交叉熵是首选,尤其是多分类任务。

概率分布建模:使用 Kullback-Leibler 散度(KL 散度)来衡量分布之间的差异。

第三部分:梯度下降——优化的利器

3.1 梯度下降的原理

梯度下降是一种迭代优化算法,通过最小化损失函数来寻找最优参数。它的核心思想是:沿着损失函数的负梯度方向调整参数,直到损失值最小。

参数更新公式:
θ = θ − α ∇ θ J ( θ ) \theta = \theta - \alpha \nabla_\theta J(\theta) θ=θαθJ(θ)

(\theta):模型参数。

(\alpha):学习率,控制步长大小。

(\nabla_\theta J(\theta)):损失函数对参数的梯度。

3.2 梯度下降的三种变体

批量梯度下降(Batch Gradient Descent):

对整个数据集计算梯度。

优点:稳定。

缺点:计算开销大,尤其在大数据集上。

随机梯度下降(SGD, Stochastic Gradient Descent):

每次使用一个样本计算梯度。

优点:更新速度快。

缺点:收敛不稳定。

小批量梯度下降(Mini-batch Gradient Descent):

每次使用一小部分样本计算梯度。

优点:折中方案,常用于实际深度学习任务。

3.3 梯度下降的代码实现

以下是一个结合 PyTorch 优化器的完整训练过程:

import torch.optim as optim

定义模型、损失函数和优化器

model = FullyConnectedNet()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

模拟训练过程

for epoch in range(5):
    optimizer.zero_grad()  # 清除上一轮的梯度
    output = model(sample_input)  # 前向传播
    target = torch.tensor([3])  # 假设真实标签
    loss = criterion(output, target)  # 计算损失
    loss.backward()  # 反向传播
    optimizer.step()  # 更新参数
    print(f"Epoch {epoch+1}, Loss: {loss.item()}")

优化策略与进阶技巧
动态学习率
在训练过程中,动态调整学习率有助于模型更快地收敛。例如:

from torch.optim.lr_scheduler import StepLR
​
scheduler = StepLR(optimizer, step_size=2, gamma=0.1)
for epoch in range(5):
    train()  # 假设有训练逻辑
    scheduler.step()

动量优化
动量方法通过加速梯度下降并减少波动,提高收敛速度:

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

Adam优化器
Adam 是一种自适应学习率的优化算法,结合了动量和 RMSProp 的优点,适合大多数任务:

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

总结

全连接层、损失函数与梯度下降是深度学习的基石。通过本文的详细解析,你不仅理解了它们的理论,还掌握了代码实现和优化技巧。在深度学习的道路上,这三块知识将帮助你构建强大的模型,解决实际问题。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

【C++】vector 类模拟实现:探索动态数组的奥秘

🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 如果你对string,vector还存在疑惑,欢迎阅读我之前的作品 : 之前文章🔥&#x1f52…

【ubuntu18.04】vm虚拟机复制粘贴键不能用-最后无奈换版本

我是ubuntu16版本的 之前费老大劲安装的vmware tools结果不能用 我又卸载掉,安装了open-vm-tools 首先删除VMware tools sudo vmware-uninstall-tools.pl sudo rm -rf /usr/lib/vmware-tools sudo apt-get autoremove open-vm-tools --purge再下载open-vm-tools s…

使用原生 OpenTelemetry 解锁各种可能性:优先考虑可靠性,而不是专有限制

作者:来自 Elastic Bahubali Shetti•Miguel Luna Elastic 现在支持使用 OTel Operator 在 Kubernetes 上部署和管理 Elastic Distributions of OpenTelemetry (EDOT)。SRE 现在可以访问开箱即用的配置和仪表板,这些配置和仪表板旨在通过 Elastic Observ…

【freertos】FreeRTOS信号量的介绍及使用

FreeRTOS信号量 一、概述二、PV原语三、函数接口1.创建一个计数信号量2.删除一个信号量3.信号量释放4.在中断释放信号量5.获取一个信号量,可以是二值信号量、计数信号量、互斥量。6.在中断获取一个信号量,可以是二值信号量、计数信号量7.创建一个二值信号…

【生物服务器】数据分析//论文润色/组学技术服务 、表观组分析、互作组分析、遗传转化实验、生物医学

DNA亲和纯化测序(DAP-seq)和组蛋白甲基化修饰是表观遗传学研究中两个重要的技术手段,它们在揭示基因表达调控机制和染色质结构动态变化中发挥着关键作用。然而,在实践过程中,这两种技术也存在一些痛点和挑战。 DNA亲和…

丹摩征文活动| 摩智云端深度解析:Faster R-CNN模型的训练与测试实战指南

目录 丹摩简介 文章前言Faster R-CNN的简介Faster RCNN的训练与测试提前准备1.1 mobaxterm(远程连接服务器)1.2 本文的源码下载 目标检测模型 Faster-Rcnn2.1云服务器平台 数据上传内置JupyterLab的使用本地连接使用DAMODEL实例获取实例的SSH访问信息通过…

二叉搜索树介绍

⼆叉搜索树 二叉搜索树的概念二叉搜索树的性能分析查找性能插入性能删除性能 二叉搜索树的插入二叉搜索树的查找二叉搜索树的删除⼆叉搜索树的实现代码测试代码 二叉搜索树key和key/value使⽤场景key搜索场景key/value搜索场景key/value⼆叉搜索树代码实现测试代码 二叉搜索树的…

7.揭秘C语言输入输出内幕:printf与scanf的深度剖析

揭秘C语言输入输出内幕:printf与scanf的深度剖析 C语言往期系列文章目录 往期回顾: VS 2022 社区版C语言的安装教程,不要再卡在下载0B/s啦C语言入门:解锁基础概念,动手实现首个C程序C语言概念之旅:解锁关…

5.4.2-1 编写Java程序在HDFS上创建文件

本次实战涉及使用Java操作Hadoop HDFS,包括创建文件、判断文件存在性及异常处理。通过手动添加依赖、启动HDFS服务,成功在HDFS上创建和检查文件。进一步探索了文件操作的最佳实践,如检查文件存在性以避免重复创建,以及处理HDFS安全…

RabbitMQ教程:路由(Routing)(四)

文章目录 RabbitMQ教程:路由(Routing)(四)一、引言二、基本概念2.1 路由与绑定2.2 Direct交换机2.3 多绑定2.4 发送日志2.5 订阅 三、整合代码3.1 EmitLogDirectApp.cs3.2 ReceiveLogsDirectApp.cs3.3 推送所有和接收e…

智云-一个抓取web流量的轻量级蜜罐v1.5

智云-一个抓取web流量的轻量级蜜罐v1.5 github地址 https://github.com/xiaoxiaoranxxx/POT-ZHIYUN 新增功能-自定义漏洞信息 可通过正则来添加相关路由以及响应来伪造 nacos的版本响应如下 日流量态势 月流量态势 抓取流量效果

21.UE5游戏存档,读档,函数库

2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档: 3.加载游戏,保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂,中间没有运行程序进行阶段性成果的验…

实验5:网络设备发现、管理和维护

实验5:网络设备发现、管理和维护 实验目的及要求: 通过实验,掌握Cisco 路由器和交换机的IOS配置管理。自动从NTP服务器获取时间信息。能够利用TFTP服务器实现路由器和交换机配置文件的备份和恢复。同时验证CDP协议和LLDP协议的网络参数。完…

vue 项目使用 nginx 部署

前言 记录下使用element-admin-template 改造项目踩过的坑及打包部署过程 一、根据权限增加动态路由不生效 原因是Sidebar中路由取的 this.$router.options.routes,需要在计算路由 permission.js 增加如下代码 // generate accessible routes map based on roles const acce…

DataWorks on EMR StarRocks,打造标准湖仓新范式

在大数据领域,数据仓库和实时分析系统扮演着至关重要的角色。DataWorks 基于大数据引擎,为数据仓库/数据湖/湖仓一体等解决方案提供统一的全链路大数据开发治理平台,为用户带来智能化的数据开发和分析体验。而阿里云提供的 EMR Serverless St…

七、利用CSS和多媒体美化页面的习题

题目一&#xff1a; 利用CSS技术&#xff0c;结合表格和列表&#xff0c;制作并美化 “ 翡翠阁 ”页面。运行效果如下 运行效果&#xff1a; 代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>翡翠阁</title>&…

游戏引擎学习第15天

视频参考:https://www.bilibili.com/video/BV1mbUBY7E24 关于游戏中文件输入输出&#xff08;IO&#xff09;操作的讨论。主要分为两类&#xff1a; 只读资产的加载 这部分主要涉及游戏中用于展示和运行的只读资源&#xff0c;例如音乐、音效、美术资源&#xff08;如 3D 模型和…

【动手学深度学习Pytorch】2. Softmax回归代码

零实现 导入所需要的包&#xff1a; import torch from IPython import display from d2l import torch as d2l定义数据集参数、模型参数&#xff1a; batch_size 256 # 每次随机读取256张图片 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size) # 将展平每个…

51单片机基础05 实时时钟-思路及代码参考2、3

目录 一、思路二 1、原理图 2、代码 二、思路三 1、原理图 2、代码 一、思路二 所有设定功能相关的操作均在矩阵键盘进行实现&#xff0c;并在定时器中扫描、计数等 1、原理图 2、代码 #include <AT89X52.h> //调用51单片机的头文件 //------------------…