从零开始深度学习:全连接层、损失函数与梯度下降的详尽指南
引言
在深度学习的领域,全连接层、损失函数与梯度下降是三块重要的基石。如果你正在踏上深度学习的旅程,理解它们是迈向成功的第一步。这篇文章将从概念到代码、从基础到进阶,详细剖析这三个主题,帮助你从小白成长为能够解决实际问题的开发者。
第一部分:全连接层——神经网络的基础单元
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)) # 激活函数ReLUx = 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 常见损失函数
- 均方误差(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=1∑n(y^i−yi)2
适用于回归问题,计算预测值与真实值的平方差。
- 交叉熵损失(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=1∑nyilog(y^i)
- 二元交叉熵损失(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=1∑n[yilog(y^i)+(1−yi)log(1−y^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)
总结
全连接层、损失函数与梯度下降是深度学习的基石。通过本文的详细解析,你不仅理解了它们的理论,还掌握了代码实现和优化技巧。在深度学习的道路上,这三块知识将帮助你构建强大的模型,解决实际问题。
相关文章:

从零开始深度学习:全连接层、损失函数与梯度下降的详尽指南
引言 在深度学习的领域,全连接层、损失函数与梯度下降是三块重要的基石。如果你正在踏上深度学习的旅程,理解它们是迈向成功的第一步。这篇文章将从概念到代码、从基础到进阶,详细剖析这三个主题,帮助你从小白成长为能够解决实际…...
Liebherr利勃海尔 EDI 需求分析
Liebherr 使用 EDI 技术来提高业务流程的效率、降低错误率、加快数据交换速度,并优化与供应商、客户和其他合作伙伴之间的业务沟通。通过 EDI,Liebherr 实现了与全球交易伙伴的自动化数据交换,提升了供应链管理和订单处理的透明度。 Liebher…...
java小练习
小练1.用while语句计算11/2!1/3!1/4!...1/20!的和 public class test_11_17_2 {public static void main(String[] args) {double sum 0;double item 1;int n 20;int i 1;while(i<n){sum item;i i1;item item*(1.0/i);}System.out.println(sum);} } 小练2.计算88888…...
go语言中的占位符有哪些
在Go语言中,占位符主要用于格式化字符串输出,特别是在使用fmt包中的Printf系列函数时。以下是Go语言中常用的占位符: %v:代表值的默认格式,对于字符串是直接输出,对于整型是十进制形式。%v:扩展…...
基于Windows安装opus python库
项目中需要用到一些opus格式的编解码功能,找到网上有opus的开源库。网址:Opus Codec 想着人生苦短,没想到遇上了错误!在这里记录一下过程 过程 安装python库 pip3 install opuslib验证 >>> import opuslib Tracebac…...

【设计模式】行为型模式(五):解释器模式、访问者模式、依赖注入
《设计模式之行为型模式》系列,共包含以下文章: 行为型模式(一):模板方法模式、观察者模式行为型模式(二):策略模式、命令模式行为型模式(三):责…...

使用nossl模式连接MySQL数据库详解
使用nossl模式连接MySQL数据库详解 摘要一、引言二、nossl模式概述2.1 SSL与nossl模式的区别2.2 选择nossl模式的场景三、在nossl模式下连接MySQL数据库3.1 准备工作3.2 C++代码示例3.3 代码详解3.3.1 初始化MySQL连接对象3.3.2 连接到MySQL数据库3.3.3 执行查询操作3.3.4 处理…...

【MySQL】ubantu 系统 MySQL的安装与免密码登录的配置
🍑个人主页:Jupiter. 🚀 所属专栏:MySQL初阶探索:构建数据库基础 欢迎大家点赞收藏评论😊 目录 📚mysql的安装📕MySQL的登录🌏MySQL配置免密码登录 📚mysql的…...

高级 SQL 技巧讲解
大家好,我是程序员小羊! 前言: SQL(结构化查询语言)是管理和操作数据库的核心工具。从基本的查询语句到复杂的数据处理,掌握高级 SQL 技巧不仅能显著提高数据分析的效率,还能解决业务中的复…...

浅论AI大模型在电商行业的发展未来
随着人工智能(AI)技术的快速发展,AI大模型在电商行业中扮演着越来越重要的角色。本文旨在探讨AI大模型如何赋能电商行业,包括提升销售效率、优化用户体验、增强供应链管理等方面。通过分析AI大模型在电商领域的应用案例和技术进展…...
【python笔记03】《类》
文章目录 面向对象基本概念对象的概念类的概念 类的定义类的创建(实例的模板)类的实例化--获取对象对象方法中的self关键字面试题请描述什么是对象,什么是类。请观阅读如下代码,判断是否能正常运行,如果不能正常运行&a…...
Flutter 应用在真机上调试的流程
在真机上调试 Flutter 应用的方法有很多,可以使用 USB 数据线连接设备到电脑进行调试,也可以通过无线方式进行 Flutter 真机调试。 1. 有线调试 设备准备 启用开发者模式: Android:进入 设置 > 关于手机,连续点击…...
以太坊基础知识结构详解
以太坊的历史和发展 初创阶段 2013年:Vitalik Buterin 发表了以太坊白皮书,提出了一个通用的区块链平台,不仅支持比特币的货币功能,还能支持更复杂的智能合约。2014年:以太坊项目启动,进行了首次ICO&…...
安全见闻(完整版)
目录 安全见闻1 编程语言和程序 编程语言 函数式编程语言: 数据科学和机器学习领域: Web 全栈开发: 移动开发: 嵌入式系统开发: 其他: 编程语言的方向: 软件程序 操作系统 硬件设备…...

LeetCode100之反转链表(206)--Java
1.问题描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 示例1 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例2 输入:head [1,2] 输出:[2,1] 示例3 输入:head [] 输…...
牛客周赛第一题2024/11/17日
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 时间限制:C/C/Rust/Pascal 1秒,其他语言2秒 空间限制:C/C/Rust/Pascal 256 M,其他语言512 M 64bit IO Format: %lld 题目描述 小红这天来到了三…...

麒麟Server下安装东方通TongLINK/Q
环境 系统:麒麟Server SP3 2403 应用:TLQ8.1(Install_TLQ_Standard_Linux2.6.32_x86_64_8.1.17.0.tar.gz) 安装Server 将文件解压到/usr/local/tlq。 cd /opt/tlq/ mkdir /usr/local/tlq/ tar -zxvf Install_TLQ_Standard_Linux2.6.32_x86_64_8.1.1…...
BERT的中文问答系统33
我们在现有的代码基础上增加网络搜索的功能。我们使用 requests 和 BeautifulSoup 来从百度搜索结果中提取信息。以下是完整的代码,包括项目结构、README.md 文件以及所有必要的代码。 项目结构 xihe241117/ ├── data/ │ └── train_data.jsonl ├── lo…...

Ubuntu下的Eigen库的安装及基本使用教程
一、Eigen库介绍 简介 Eigen [1]目前最新的版本是3.4,除了C标准库以外,不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试,并自动安装。如果使用Eigen库,只需包特定模块的的头文件即可。 基本功能 Eigen适用范…...

【spring 】Spring Cloud Gateway 的Filter学习
介绍和使用场景 Spring Cloud Gateway 是一个基于 Spring Framework 5 和 Project Reactor 的 API 网关,它旨在为微服务架构提供一种简单而有效的方式来处理请求路由、过滤、限流等功能。在 Spring Cloud Gateway 中,Filter 扮演着非常重要的角色&#…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...