【深度学习之四】知识蒸馏综述提炼
知识蒸馏综述提炼
目录
知识蒸馏综述提炼
前言
参考文献
一、什么是知识蒸馏?
二、为什么要知识蒸馏?
三、一点点理论
四、知识蒸馏代码
总结
前言
知识蒸馏作为一种新兴的、通用的模型压缩和迁移学习架构,在最近几年展现出蓬勃的活力。综合看的一些知识蒸馏综述总结如下。
参考文献
[1]邵仁荣,刘宇昂,张伟,等.深度学习中知识蒸馏研究综述[J].计算机学报,2022,45(08):1638-1673.
一、什么是知识蒸馏?
知识蒸馏本质上属于迁移学习的范畴,其主要思路是将已训练完善的模型作为教师模型,通过控制“温度”从模型的输出结果中“蒸馏”出“知识”用于学生模型的训练,并希望轻量级的学生模型能够学到教师模型的“知识”,达到和教师模型相同的表现。这里的“知识”狭义上的解释是教师模型的输出中包含了某种相似性,这种相似性能够被用迁移并辅助其它模型的训练,Hinton称之为“暗知识”;广义上的解释是教师模型能够被利用的一切知识形式,如特征、参数、模块等等。而“蒸馏”是指通过某些方法(如控制参数),能够放大这种知识的相似性,并使其显现的过程;由于这一操作类似于化学实验中“蒸馏”的操作,因而被形象地称为“知识蒸馏”。知识蒸馏的发展历程如图1所示,根据不同的划分形式,知识蒸馏框架又可细分如图2所示,图3-4对比了不同方法的优缺点。
图1 知识蒸馏的发展历程
图2 知识蒸馏整体分类框架
图3 不同“知识”表达形式的优缺点
图4 不同蒸馏方法的优缺点
二、为什么要知识蒸馏?
深度学习在计算机视觉、语音识别、自然语言处理等内的众多领域中均取得了令人难以置信的性能。但是,当前的一些SOTA模型也存在一定的局限,比如过于依赖计算设备的性能
模型压缩
随着任务的复杂性增加、性能要求愈高,导致神经网络模型的结构愈加复杂,这直接导致了计算成本的急剧上升,严重限制了其在移动嵌入式设备上的部署和应用。
跨模态/跨领域
知识蒸馏结合跨领域能够很好地解决交叉任务和不同任务上知识的融合。通过重用跨任务模型的知识有助于提升目标域的泛化效果和鲁棒性。其存在的主要问题在于源域中的数据分布和目标域数据分布不一致,可能会带来一定的偏差,因此在迁移过程中需要考虑域适应(Domain Adaptation)的问题。
隐私保护
传统的深度学习模型很容易受到隐私攻击。因此,出于隐私或机密性的考虑,大多数数据集都是私有的,不会公开共享。特别是在处理生物特征数据、患者的医疗数据等方面。因此,模型获取用于模型训练优质数据,并不现实。对于模型来说,既希望能访问这些隐私数据的原始训练集,而又不能将其直接暴露给应用。因而,可以通过教师-学生结构的知识蒸馏来隔离的数据集的访问。让教师模型学习隐私数据,并将知识传递给外界的模型。
持续学习
持续学习(Continual Learning) 是指一个学习系统能够不断地从新样本中学习新的知识,并且保存大部分已经学习到的知识,其学习过程也十分类似于人类自身的学习模式。但是持续学习需要面对一个非常重要的挑战是灾难性遗忘,即需要平衡新知识与旧知识之间的关系。知识蒸馏能够将已学习的知识传递给学习模型实现“知识”的增量学习(Incremental Learning)
三、一点点理论
图1 “暗知识”
以手写数字为例,教师网络对数字1 11的预测标签为" 1 " : 0.7 , " 7 " : 0.2 , " 9 " : 0.1,这里1的预测概率最大为 0.7 是正确的分类,但是标签" 7 " " 9 " 的预测概率也能提供一些信息,就是说 " 7 " , " 9 " 和预测标签1 还是有某种预测的相似度的。如果把这个信息也教会学生网络,学生网络就可以了解到这种类别之间的相似度,可以看作为学习到了教师网络中隐藏的知识,对于学生网络的分类是有帮助的。
图2 知识蒸馏的过程
如上图所示,教师网络(左侧)的预测输出除以温度参数(Temperature)之后、再做Softmax计算,可以获得软化的概率分布(软目标或软标签),数值介于0 − 1之间,取值分布较为缓和。Temperature数值越大,分布越缓和;而Temperature数值减小,容易放大错误分类的概率,引入不必要的噪声。针对较困难的分类或检测任务,Temperature通常取1 ,确保教师网络中正确预测的贡献。硬目标则是样本的真实标注,可以用One-hot矢量表示。Total loss设计为软目标与硬目标所对应的交叉熵的加权平均(表示为KD loss与CE loss),其中软目标交叉熵的加权系数越大,表明迁移诱导越依赖教师网络的贡献,这对训练初期阶段是很有必要的,有助于让学生网络更轻松的鉴别简单样本,但训练后期需要适当减小软目标的比重,让真实标注帮助鉴别困难样本。另外,教师网络的预测精度通常要优于学生网络,而模型容量则无具体限制,且教师网络推理精度越高,越有利于学生网络的学习。
教师网络与学生网络也可以联合训练,此时教师网络的暗知识及学习方式都会影响学生网络的学习,具体如下(式中三项分别为教师网络Softmax输出的交叉熵loss、学生网络Softmax输出的交叉熵loss、以及教师网络数值输出与学生网络Softmax输出的交叉熵loss)
图3 温度函数的作用
图4 损失函数的计算步骤
在分类网络中知识蒸馏的 Loss 计算
上部分教师网络,它进行预测的时候, softmax要进行升温,升温后的预测结果我们称为软标签(soft label)
学生网络一个分支softmax的时候也进行升温,在预测的时候得到软预测(soft predictions),然后对soft label和soft predictions 计算损失函数,称为distillation loss ,让学生网络的预测结果接近教师网络;
学生网络的另一个分支,在softmax的时候不进行升温T =1,此时预测的结果叫做hard prediction 。然后和hard label也就是 ground truth直接计算损失,称为student loss 。
总的损失结合了distilation loss和student loss ,并通过系数a加权,来平衡这两种Loss ,比如与教师网络通过MSE损失,学生网络与ground truth通过cross entropy损失, Loss的公式可表示如下:
四、知识蒸馏代码
一个简单的基于pytorch实现的知识蒸馏代码如下:
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt# 超参数设置
batch_size = 64
epochs_teacher = 5 # 教师模型训练轮数
epochs_student = 5 # 学生模型训练轮数
temperature = 5 # 温度参数(关键超参数)
alpha = 0.7 # 蒸馏损失权重
lr = 0.001 # 学习率# 设备配置
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 数据加载
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))])train_dataset = datasets.MNIST('data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST('data', train=False, transform=transform)train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 教师模型定义
class TeacherModel(nn.Module):def __init__(self):super().__init__()self.fc1 = nn.Linear(784, 512)self.fc2 = nn.Linear(512, 256)self.fc3 = nn.Linear(256, 10)self.dropout = nn.Dropout(0.5)def forward(self, x):x = x.view(-1, 784)x = torch.relu(self.fc1(x))x = self.dropout(x)x = torch.relu(self.fc2(x))x = self.dropout(x)return self.fc3(x)# 学生模型定义(更简单结构)
class StudentModel(nn.Module):def __init__(self):super().__init__()self.fc1 = nn.Linear(784, 128)self.fc2 = nn.Linear(128, 10)def forward(self, x):x = x.view(-1, 784)x = torch.relu(self.fc1(x))return self.fc2(x)# 训练教师模型
def train_teacher():teacher = TeacherModel().to(device)criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(teacher.parameters(), lr=lr)for epoch in range(epochs_teacher):teacher.train()for data, target in train_loader:data, target = data.to(device), target.to(device)optimizer.zero_grad()output = teacher(data)loss = criterion(output, target)loss.backward()optimizer.step()# 验证teacher.eval()correct = 0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = teacher(data)pred = output.argmax(dim=1, keepdim=True)correct += pred.eq(target.view_as(pred)).sum().item()print(f"Teacher Epoch {epoch + 1}, Accuracy: {correct / len(test_loader.dataset):.4f}")return teacher# 知识蒸馏训练
def distill(teacher, student):student = student.to(device)teacher.eval() # 固定教师模型参数# 定义两个损失函数criterion_ce = nn.CrossEntropyLoss()criterion_kl = nn.KLDivLoss(reduction="batchmean")optimizer = optim.Adam(student.parameters(), lr=lr)for epoch in range(epochs_student):student.train()for data, target in train_loader:data, target = data.to(device), target.to(device)optimizer.zero_grad()# 获取教师和学生的输出with torch.no_grad():teacher_logits = teacher(data)student_logits = student(data)# 计算学生损失(常规交叉熵损失)student_loss = criterion_ce(student_logits, target)# 计算蒸馏损失(KL散度损失)soft_targets = nn.functional.softmax(teacher_logits / temperature, dim=1)soft_output = nn.functional.log_softmax(student_logits / temperature, dim=1)distillation_loss = criterion_kl(soft_output, soft_targets) * (temperature ** 2)# 组合损失total_loss = alpha * student_loss + (1 - alpha) * distillation_losstotal_loss.backward()optimizer.step()# 验证student.eval()correct = 0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = student(data)pred = output.argmax(dim=1, keepdim=True)correct += pred.eq(target.view_as(pred)).sum().item()print(f"Distillation Epoch {epoch + 1}, Accuracy: {correct / len(test_loader.dataset):.4f}")return student# 普通训练学生模型(作为对比)
def train_student():student = StudentModel().to(device)criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(student.parameters(), lr=lr)for epoch in range(epochs_student):student.train()for data, target in train_loader:data, target = data.to(device), target.to(device)optimizer.zero_grad()output = student(data)loss = criterion(output, target)loss.backward()optimizer.step()# 验证student.eval()correct = 0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = student(data)pred = output.argmax(dim=1, keepdim=True)correct += pred.eq(target.view_as(pred)).sum().item()print(f"Normal Student Epoch {epoch + 1}, Accuracy: {correct / len(test_loader.dataset):.4f}")return student# 主程序
if __name__ == "__main__":# 训练教师模型print("Training Teacher Model...")teacher = train_teacher()# 普通训练学生模型print("\nTraining Student Model Normally...")normal_student = train_student()# 知识蒸馏训练学生模型print("\nDistilling Knowledge to Student Model...")distilled_student = distill(teacher, StudentModel())
总结
本文仅仅简单介绍了知识蒸馏的相关知识,讲解不到的地方请指正!
相关文章:
【深度学习之四】知识蒸馏综述提炼
知识蒸馏综述提炼 目录 知识蒸馏综述提炼 前言 参考文献 一、什么是知识蒸馏? 二、为什么要知识蒸馏? 三、一点点理论 四、知识蒸馏代码 总结 前言 知识蒸馏作为一种新兴的、通用的模型压缩和迁移学习架构,在最近几年展现出蓬勃的活力…...
Java大师成长计划之第23天:Spring生态与微服务架构之服务发现与注册中心
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4-turbo模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在微服务架构中,服务发现…...
list简单模拟实现
成员变量迭代器(重点)ListIterator运算符重载begin、end 插入、删除inserterase头插、尾插、头删、尾删 operator->const_iterator拷贝构造operator析构函数完整代码 由于前面已经模拟实现了vector,所以这里关于一些函数实现就不会讲的过于…...
undefined reference to `typeinfo for DeviceAllocator‘
出现“undefined reference to typeinfo”链接错误的原因及解决方法如下: class DeviceAllocator { public:explicit DeviceAllocator(DeviceType device_type){};virtual void* allocate(size_t n) 0;virtual void deallocate(void* p) 0;~DeviceAllocator() d…...
动态规划问题 -- 多状态模型(买股票的最佳时机II)
目录 动态规划分析问题五步曲题目概述利用状态机推导状态转移方程式代码编写 动态规划分析问题五步曲 不清楚动态规划分析问题是哪关键的五步的少年们可以移步到 链接: 动态规划算法基础 这篇文章非常详细的介绍了动态规划算法是如何分析和解决问题的 题目概述 链接: 买股票的最…...
【落羽的落羽 C++】进一步认识模板
文章目录 一、非类型模板参数二、模板的特化1. 函数模板特化2. 类模板特化 三、模板的编译分离 一、非类型模板参数 模板参数可以分为类型参数和非类型参数。我们之前使用的都是类型参数,即出现在模板参数列表中,跟在class或typename之类的参数类型名称…...
Java爬虫能处理京东商品数据吗?
Java爬虫完全可以处理京东商品数据。通过Java爬虫技术,可以高效地获取京东商品的详细信息,包括商品名称、价格、图片、描述等。这些信息对于市场分析、选品上架、库存管理和价格策略制定等方面具有重要价值。以下是一个完整的Java爬虫示例,展…...
#跟着若城学鸿蒙# web篇-初探
前言 先看下官方介绍,这里总结了比较重要的几点Web组件基础:加载与渲染网页全面解析Web组件是现代应用开发中不可或缺的重要元素,它允许开发者在原生应用中无缝集成Web内容。本文将全面介绍Web组件的基本功能,包括多种内容加载方…...
Top-p采样:解锁语言模型的创意之门
Top - p采样 是什么:核采样:排序,累计到0.7,随机选择 在自然语言生成和大规模语言模型推理中,Top - p采样(又叫核采样,Nucleus Sampling)是一种基于累积概率的采样策略。 Top - p介…...
周赛好题推荐
这周周赛很有质量的,上了一个很有意思的数学题目,推了半天..... 给定一个区间[l,r],求出区间内所有满足x mod 2^i !k的所有正整数(最后全部进行异或) 首先我们不妨先算出[l,r]区间所有数字的异或,然后在算…...
【RabbitMQ】实现RPC通信的完整指南
文章目录 RPC 通信创建相关队列客户端代码声明队列发送请求接收响应完整代码 服务端代码设置同时只能获取一个消息接收消息完整代码 运行程序启动客户端启动服务端 RPC 通信 RPC (Remote Procedure Call), 即远过程调用。它是一种通过网络从远程计算机上请求服务,而…...
CK3588下安装linuxdeployqt qt6 arm64
参考资料: Linux —— linuxdeployqt源码编译与打包(含出错解决) linux cp指令报错:cp: -r not specified; cp: omitting directory ‘xxx‘(需要加-r递归拷贝) CMake Error at /usr/lib/x86_64…...
滑动窗口之二(优先队列)
原本滑动窗口的板子用的是数组和双指针模拟,我嫌麻烦还不好懂找了双端队列。但其实还是不太好使,比如今天的这道题就处理起来很麻烦。但是如果用优先队列的话就可以一直保证整个窗口是有序的,只需判断一下是否在窗口内即可。但是!…...
小刚说C语言刷题—1088求两个数M和N的最大公约数
1.题目描述 求两个正整数 M 和 N 的最大公约数(M,N都在长整型范围内) .输入 输入一行,包括两个正整数。 输出 输出只有一行,包括1个正整数。 样例 输入 45 60 输出 15 2.参考代码(C语言版) #include <stdio.h> …...
pytorch训练可视化工具---TensorBoard
一、目的:为什么使用 TensorBoard 调控模型 使用 TensorBoard 可以帮我们: 实时查看 loss / acc 曲线 → 判断是否过拟合、欠拟合; 对比不同模型或超参数的效果; 可视化模型结构 → 帮助调试模型设计; 查看权重/梯…...
丝杆升降机限位失灵深度剖析:从故障机理到智能监测方案
在工业自动化与精密机械传动领域,丝杆升降机凭借高精度、大推力的特性,成为产线设备的核心执行部件。然而,限位系统的可靠性直接决定设备安全运行与生产连续性。本文将从技术原理、故障诊断到智能监测方案,系统性解析丝杆升降机限…...
系统集成项目管理工程师学习笔记
第九章 项目管理概论 1、项目基本要素 项目基础 项目是为创造独特的产品、服务或成果而进行的临时性工作。 项目具有临时性、独特性、渐进明细的特点。项目的“临时性”是指项目只有明确的起点和终点。“临时性”并一定意味着项目的持续时间短。 项目可宣告结束的情况&…...
RDD的自定义分区器-案例
对电商订单数据进行处理,订单数据包含用户 ID 和订单金额,不同地区的用户有不同的 ID 范围。我们会按照地区对订单数据进行分区,这样做能让相同地区的订单数据处于同一分区,便于后续按地区进行统计金额分析。 订单数据如下&#x…...
牛客网NC231954:斐波那契数列 (简单的数列问题)
牛客网NC231954:斐波那契数列 (简单的数列问题) 题目描述 本题要求我们计算斐波那契数列的第n项,斐波那契数列定义如下: f(1) 1f(2) 1f(n) f(n-1) f(n-2),当n ≥ 3 给定整数n,求f(n)的值。 算法思路 斐波那契…...
中国近代史3
辛亥革命 1.同盟会:建立 1905年,东京,第一个全国性的资产阶级革命政党;同盟会纲领“驱除鞑虏,恢复中华,建立民国,平均地权” “民族”“民生”“民权” 2.武昌起义 ①爆发:1911.10…...
晶振的核心参数
目录 1.简介 2.晶振核心参数详解 3.晶振的抖动(jitter) 4.抖动的三种测量方式 5.抖动的其他资料 1.简介 再看一些晶振的手册时,经常遇到一些类似或相近的参数,今天借此机会,做一个小姐。 2.晶振核心参数详解 1…...
北京孙河傲云源墅:限量典藏的主城墅居臻品
在限墅令的背景下,北京主城的墅居产品日益稀缺,而傲云源墅作为孙河墅区的杰出之作,凭借其独特的价值,成为了众多高端置业者的理想选择。 傲云源墅所处的孙河地区,是北京公认的高价值板块。其地位在 2025 年孙河 2902 …...
驱动-Linux定时-timer_list
了解内核定时相关基础知识 文章目录 简要介绍timer_list 特点API 函数实验测试程序 - timer_mod.c编译文件-Makefile实验验证 注意事项总结 简要介绍 硬件为内核提供了一个系统定时器来计算流逝的时间(即基于未来时间点的计时方式, 以当前时刻为计时开始…...
从理论到实战:模糊逻辑算法的深度解析与应用实践
从理论到实战:模糊逻辑算法的深度解析与应用实践 一、模糊逻辑的核心概念与数学基础 模糊逻辑(Fuzzy Logic)是一种处理不确定性的数学工具,其核心思想是将传统布尔逻辑的“非黑即白”扩展为连续的隶属度函数。例如,在…...
涨薪技术|0到1学会性能测试第65课-SQL捕获阻塞事件
前面的推文我们掌握了JVM调优技术。今天给大家分享MS SQL数据库监控与调优技术。后续文章都会系统分享干货,带大家从0到1学会性能测试。 01SQL捕获阻塞事件 在SQL Server 2005之前的版本,分析哪些进程产生阻塞以及哪些进程被阻塞,都需要使用脚…...
SQL实战:06交叉日期打折问题求解
文章目录 概述题目:交叉打折问题求解题解第一步:使用滑动窗口统计当前活动前的最大结束日期步骤二:拆分出交叉部分步骤三:计算每次活动的持续天数步骤四:分组统计最终结果完整SQL 概述 最近刷题时遇到一些比较有意思的…...
Linux云计算训练营笔记day09(MySQL数据库)
Linux云计算训练营笔记day09(MySQL数据库) 目录 Linux云计算训练营笔记day09(MySQL数据库)外键约束数据的导入和导出数据的导出数据的导入 DQL 数据查询语言查指定字段查所有字段where 过滤条件and 和 orin 和 not inbetween...an…...
docker 学习记录
docker pull nginx docker 将本地nginx快照保存到当前文件夹下 docker save -o nginx.tar nginx:latestdocker 将本地nginx 加载 docker load -i nginx.tar docker运行nginx在80端口 docker run --name dnginx -p 80:80 -d nginxredis启动 docker run --name mr -p 6379:6379 -…...
Kind方式部署k8s单节点集群并创建nginx服务对外访问
资源要求 请准备好doker环境,尽量用比较新的版本。我的docker环境如下 docker 环境: Docker version 20.10.21, build 20.10.21-0ubuntu1~18.04.3 安装kind kind表现上就是一个二进制程序,下载对应版本并增加执行权限即可: cu…...
Da14531蓝牙特征值1读没有回调解决
一. 我们调试中发现user_peripheral.c中的回调,一直都没有回调。(大家可以通过打印去排查) void user_catch_rest_hndl(ke_msg_id_t const msgid, void const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) { //此处省…...
journal of Electronic Imaging(JEI)投稿咨询
研究生投的第二篇论文-CV方向,由于太菜了,到处被拒,最后选择了Journal of Electronic Imaging(JEI) 审稿了三个月,最近突然变了状态,之前催稿说才一个审稿人,这样子是不是要被拒了,有没有知道的…...
upload-labs靶场通关详解:第6-9关
目录 第六关:大小写绕过 一、分析源代码 二、解题思路 三、解题步骤 第七关:空格绕过 一、分析源代码 二、解题思路 三、解题步骤 第八关:点号绕过 一、分析源代码 二、解题思路 三、解题步骤 第九关:::$DATA字符串绕…...
算法图表总结:查找、排序与递归(含 Mermaid 图示)
算法图表总结:查找、排序与递归(含 Mermaid 图示) 分类标签:算法、数据结构、Mermaid、技术图表 关键词: 算法可视化、Mermaid 图表、数据结构、二分查找、快速排序、递归树 摘要: 本文通过 Mermaid 图表…...
在文件检索方面doris和elasticsearch的区别
apache Doris 与 Elasticsearch 在文件检索领域的差异源于技术架构与定位目标的本质区别,以下从核心维度对比分析二者的技术特性: 一、 架构设计与定位差异 维度Apache DorisElasticsearch核心架构分布式 MPP 列式分析引擎,面向 OLAP 优化分布式倒排索…...
linux系统服务
Linux 系统服务(System Services) 是在后台持续运行的进程(守护进程,即 daemon),用于提供核心功能或支持其他应用程序(如网络管理、日志记录、定时任务等)。它们通常在系统启动时自动…...
大语言模型三大演进方向:记忆增强、工具集成与多模态突破
目录 一、方向演进:从通用模型到记忆增强系统 1.1 技术瓶颈分析 1.2 记忆增强技术路径 1.3 企业级应用架构 二、工具调用:从语言理解到行动执行 2.1 工具调用协议演进 2.2 工具编排范式比较 三、多模态突破:跨模态统一建模 3.1 多模态架构演进 3.2 医学多模态应用…...
嵌入式学习笔记DAY21(双向链表、Makefile)
一、双向链表 1.概念 双向链表(Doubly Linked List) 是一种链式数据结构,每个节点包含 两个指针(前驱指针 prev 和后继指针 next),分别指向 前一个节点 和 后一个节点,形成双向连接。 头节点&…...
Vue 学习随笔系列二十三 -- el-date-picker 组件
el-date-picker 组件 文章目录 el-date-picker 组件el-date-picker 只有某些日期可选 el-date-picker 只有某些日期可选 <template><div><el-form ref"form" size"mini":model"form" :rules"rules"label-width"8…...
IEEE出版|连续多年稳定检索|第三届信号处理与智能计算国际学术会议(SPIC2025)
【重要信息】 会议官网: www.ic-spic.com 会议日期:2025年11月28-30日 会议地点:中国 广州 截稿日期:2025年11月10日 接受或拒绝通知日期:提交后7个工作日 【征稿主题】 人工智能和机器学习 计算机系统和架构 …...
用Python代码绘制动态3D爱心效果
引言 介绍Python在创意编程中的应用,特别是如何通过简单的代码实现视觉上的美感。引出本文将分享的爱心代码,并简要说明其实现原理。 爱心代码的基本实现 展示一个简单的Python代码示例,使用字符画的方式在控制台中绘制一个爱心图案。 pr…...
牛客网刷题:NC208813求逆序数
牛客网刷题:NC208813求逆序数 问题描述 在排序和数据结构分析中,逆序数是一个重要的概念。对于一个数列来说,如果一对数的前后位置与大小顺序相反(即前面的数大于后面的数),那么它们就称为一个逆序对。一个…...
Day 21 训练
Day 21 训练 常见的降维算法数据预处理无监督降维PCA(主成分分析)主成分分析(PCA)作用和优势应用场景t-SNE(t-分布随机邻域嵌入)t-SNE(t-分布随机邻域嵌入)为什么 t-SNE 特别适用于高…...
1267, “Illegal mix of collations (latin1_swedish_ci,IMPLICIT
python 执行数据迁移报错 mysql : 1267, "Illegal mix of collations (latin1_swedish_ci,IMPLICIT 解决方法: 替换TABLE 后面的表名为你自己的表名,mysql 黑窗口执行。 以下是我的表名,仅作参考 ALTER TABLE book CONVERT TO CHARACTE…...
【C#】Thread.Join()、异步等待和直接join
JogThread.Join() 是 .NET 中 System.Threading.Thread 类的一个方法,用来让当前调用线程暂停执行,直到目标线程(这里是 JogThread)终止为止。以下是它的核心语义和你在 UI 代码里需要注意的几个相关知识点。 1. Thread.Join() 的…...
Malformed input or input contains unmappable characters解决
JDK 17 文件上传编码异常解决方案技术文档 1. 问题背景 在 JDK 17 环境下,文件上传过程中可能抛出 Malformed input or input contains unmappable characters 错误。此问题通常由以下原因触发: 文件路径/名称包含非 ASCII 字符(如中文、日…...
PYTHON训练营DAY26
一、函数 (一)不带参数的函数 # 定义一个简单的问候函数 def greet():"""打印一句问候语。"""message "大家好!欢迎学习Python函数定义!"print(message)greet()(二&#x…...
奇变偶不变,符号看象限
三角函数诱导公式口诀详解:奇变偶不变,符号看象限 口诀解析 1. 口诀含义 奇变偶不变: 奇/偶:指角度加减的是π/2(90)的奇数倍还是偶数倍 奇数倍(如π/2, 3π/2)→ 函数名改变&…...
基于SpringBoot的家政服务系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
Makefile 在 Go 项目中的实践
在 Go 项目中,Makefile 是一个强大的工具,用于自动化构建、测试和部署流程。它不仅能减少重复命令输入,还能确保团队开发环境的一致性。本文以 CoreDNS(一个高性能 DNS 服务器)的 Makefile 为例,解析其设计…...
关闭所有Nginx进程
要关闭所有Nginx进程,可以使用以下命令。这些命令适用于不同的操作系统。 在Linux/Unix系统中 在Linux或Unix系统中,可以使用killall命令来关闭所有Nginx进程。 sudo killall nginx 在Windows系统中 在Windows系统中,可以使用taskkill命…...