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

张量链式法则(上篇):任意维度反向传播公式推导与常见算子解析

本文首发于本人的微信公众号,原文链接:https://mp.weixin.qq.com/s/k4hMPT4UrHoPcV3lcdTaiQ

摘要

本文为常用算子反向传播公式的上篇,介绍了适用于任意张量函数的链式法则公式,使用该公式可以求出诸如 reshapebroadcast_to 这类会改变张量维度数量的算子的反向传播公式。

本文同时给出了求常见算子反向传播公式的通用方法,并以几个简单的算子为例进行了演示。

本系列文章的下篇将用本文提到的公式求解 reshapetranspose 等更复杂的算子的反向传播公式。

写在前面

昨天写了一篇关于矩阵函数链式法则的文章,那篇文章里的方法只适用于二维矩阵函数的情形,且没有对公式的正确性做解释。

在经过了一天的思考和沉淀后,我发现了更加通用的链式法则公式,该公式适用于任意维度数量的张量函数(不要求输入输出的维度数量相同),并且还琢磨出了公式正确性的证明。

本文将会介绍这一公式,并使用这一公式来对12个常见的深度学习算子进行反向传播公式推导。

本文涉及到的算子全部来自CMU 10-714的Homework 1。

由于公式推导部分内容较多,所以这篇文章会分为上下两篇

本篇主要介绍基本方法,以及一些简单算子的公式推导,涉及到维度数量变化的复杂算子公式推导会放到下篇单独展开。

张量的链式法则公式

上一篇文章里介绍的公式只适用于二维矩阵映射到二维矩阵的函数,但是在深度学习中通常还会遇到高维张量,甚至于遇到会改变张量维度数量的情况,例如 reshapebroadcast_tosummation

本节介绍的张量链式法则公式可以适用于任意维度数量的张量函数,真正实现梯度自由。

问题描述

  • \(X \in \mathbb{R}^{d_1 \times d_2 \times \cdots \times d_n}\) 是一个 \(n\) 维张量

  • 函数 \(F: \mathbb{R}^{d_1 \times d_2 \times \cdots \times d_n} \to \mathbb{R}^{e_1 \times e_2 \times \cdots \times e_m}\)\(n\) 维张量 \(X\) 映射到 \(m\) 维张量

  • 损失函数 \(L: \mathbb{R}^{e_1 \times e_2 \times \cdots \times e_m} \to \mathbb{R}\)\(m\) 维张量 \(F(X)\) 映射到一个实数,即 \(Y = L(F(X))\)

  • 现在已知 \(G = \frac{\partial Y}{\partial F}\)

  • \(\nabla = \frac{\partial Y}{\partial X}\)

解决方法

首先先确定这里涉及到的张量的形状,可以断言 \(G \in \mathbb{R}^{e_1 \times e_2 \times \cdots \times e_m}\),因为 \(L\) 是一个将 \(m\) 维张量映射到实数的函数,所以其导数也一定是和 \(Y\) 同形状的。

同理也可以得出 \(\nabla \in \mathbb{R}^{d_1 \times d_2 \times \cdots \times d_n}\)

记张量 \(G\) 的第 \(\mu_1, \mu_2, \ldots, \mu_m\) 个元素为 \(g_{\mu_1 \mu_2 \mu_3 \cdots \mu_m}\)

张量 \(F(X)\) 的第 \(\mu_1, \mu_2, \ldots, \mu_m\) 个元素为 \(f_{\mu_1 \mu_2 \mu_3 \cdots \mu_m}\)

最终梯度 \(\nabla\) 的第 \(\lambda_1, \lambda_2, \ldots, \lambda_n\) 个元素为 \(\nabla_{\lambda_1 \lambda_2 \lambda_3 \cdots \lambda_n}\)

张量 \(X\) 的第 \(\lambda_1, \lambda_2, \ldots, \lambda_n\) 个元素为 \(x_{\lambda_1 \lambda_2 \lambda_3 \cdots \lambda_n}\)

则有如下公式:

\[\nabla_{\lambda_1 \lambda_2 \cdots \lambda_n}=\sum_{\substack{\mu_1 \in [1, e_1] \\ \mu_2 \in [1, e_2] \\ \vdots \\ \mu_m \in [1, e_m]}} g_{\mu_1 \mu_2 \cdots \mu_m} \frac{\partial}{\partial x_{\lambda_1 \lambda_2 \cdots \lambda_n}} f_{\mu_1 \mu_2 \cdots \mu_m} \]

这个公式可以这样理解:

  1. 我们首先把目光聚焦到某一个自变量 \(x_{\lambda_1 \lambda_2 \lambda_3 \cdots \lambda_n}\)
  2. 然后用 \(F(X)\) 这个张量里的每个元素对 \(x_{\lambda_1 \lambda_2 \lambda_3 \cdots \lambda_n}\) 求导,得到一个 \(m\) 维张量,记为 \(F'\)
  3. 然后再把这个张量 \(F'\) 和张量 \(G\)哈达马积得到 \(F''\)(即对应的元素相乘,这两个张量的形状是相同的)
  4. 最后把 \(F''\) 里面的所有元素相加,得到一个实数,就是自变量 \(x_{\lambda_1 \lambda_2 \lambda_3 \cdots \lambda_n}\) 的导数,即 \(\nabla_{\lambda_1 \lambda_2 \lambda_3 \cdots \lambda_n}\)
  5. \(X\) 里的所有元素做同样的操作即可得到最终的导数 \(\nabla\)

正确性证明

上述操作其实是在做Tensor Contraction,但是为什么这样做就能求出正确的导数呢?下面我们来证明这个方法的正确性。

这里为了让文章看起来更简洁,我们就不失一般性地假设 \(X\)\(F(X)\) 都是3维张量,且 \(X \in \mathbb{R}^{d_1 \times d_2 \times d_3}\)\(F(X) \in \mathbb{R}^{e_1 \times e_2 \times e_3}\),下面的推导过程可以很轻易地推广到任意维度数量的情形。

这里我们同样先把视角放到具体的某一个自变量 \(x_{ijk}\) 上,要记住一点,\(Y = L(F(X))\) 最终会把这个自变量映射到一个实数上,也就是说Y本质上是一个关于 \(x_{ijk}\) 的表达式

比如可能本质上 \(Y = x_{123} \cdot x_{345} + \cdots\),我们完全可以使用简单的一元函数求导公式求出其导数。

但是目前的情况是,\(Y\) 实际上是以 \(F\) 来表达的,例如 \(Y = f_{123} + f_{456}\),并且我们已知 \(F\) 的具体表达式(即 \(F\) 里的任一元素 \(f_{lmn}\) 是如何通过 \(X\) 里的元素计算出来的)。

那么这个时候就可以使用多元函数的链式法则,把 \(Y\) 看作是由 \(f_{111}, f_{112}, \ldots, f_{e_1 e_2 e_3}\) 构成的复合函数,那么就可以得到

\[\frac{\partial Y}{\partial x_{ijk}} = \sum_{\substack{l \in [1, e_1] \\ m \in [1, e_2] \\ n \in [1, e_3]}} \frac{\partial Y}{\partial f_{lmn}} \frac{\partial f_{lmn}}{\partial x_{ijk}} \]

其中 \(\frac{\partial Y}{\partial f_{lmn}}\) 就是 \(g_{lmn}\),即张量 \(G\) 对应位置的元素

\(\frac{\partial f_{lmn}}{\partial x_{ijk}}\) 则是 \(F'\) 张量中的元素

求和符号里的整体就是 \(F''\) 里的元素

将这些元素全部相加就能够得到 \(Y\) 关于 \(x_{ijk}\) 的导数。

所以这里能够使用Tensor Contraction进行链式法则计算的本质原因是因为相乘再求和这一操作与多元函数链式法则是相一致的

对于有多层嵌套的张量函数,例如神经网络,多次应用张量链式法则即可求得导数,因此这里只讨论 \(Y = L(F(X))\) 这一典型场景。

上述过程可以推广到任意维度数量的张量函数,具体过程不展开赘述了,留作习题自证不难。

对于损失函数是多维张量的场景(目前来看比较少见),也可以使用类似的过程进行推导,只是最终的导数结果会是一个多维张量,这里同样不展开赘述了。

常见算子的反向传播推导(上半部分)

基本方法

这里的问题和上文提到的张量函数链式法则问题相同,\(G\) 表示反向传播中上一个节点传递过来的导数。

基本的求解方法如下:

  1. 首先确定涉及到的张量形状,尤其是函数 \(F\) 的输入张量与输出张量的形状(具体形状与函数定义,函数传入的参数相关)
  2. 写出 \(f_{ijk \cdots}\) 的表达式
  3. 然后根据上文提到的公式,写出 \(\nabla_{ijk \cdots}\) 的表达式,最后尝试化简表达式。

这里分享一些小技巧:

  1. 对于输入输出形状不定的函数,例如与输入参数有关的 broadcast_to,可以先以一维向量 \(X\) 得到二维矩阵 \(F(X)\) 为例子进行推导,然后再尝试扩展到任意维度。
  2. 在扩展时,可以尝试使用猜测的方式,因为最终导数的形状是已知的,所以可以尝试使用各种方法来凑出最终的形状,猜出表达式,然后再对表达式进行证明验证。

PowerScalar

这一算子的作用是将一个张量的所有元素都进行一个指定幂次的 pow 操作,以二维矩阵为例,\(f_{ij} = x_{ij}^{\text{scalar}}\),其中 \(\text{scalar}\) 为算子的参数。

(注:算子的输入分为自变量和参数,这里求导仅针对自变量求导,参数可看作常数)

这里函数的输入和输出形状相同,且和参数无关,所以就直接假设 \(X\)\(F(X)\) 为二维矩阵进行推导了,不难验证,推导出的表达式同样适用于任意维度数量的情形。

首先确定,如果 \(X\)\(m \times n\) 矩阵,那么 \(F(X)\) 也是 \(m \times n\) 矩阵,所以 \(\nabla\) 也是 \(m \times n\) 矩阵,其拥有2个维度,所以首先需要写出 \(\nabla_{ij}\) 的表达式。

由于 \(F(X)\)\(G\) 都是2个维度,所以求和变量有2个,分别求和到 \(m\)\(n\),所以最终的表达式为:

\[\nabla_{ij} = \sum_{k=1}^{m} \sum_{l=1}^{n} g_{kl} \cdot \frac{\partial f_{kl}}{\partial x_{ij}} = \sum_{k=1}^{m} \sum_{l=1}^{n} g_{kl} \cdot \frac{\partial x_{kl}^{\text{scalar}}}{\partial x_{ij}} \]

注意到,只有当 \(k = i\)\(l = j\) 时,求和项才不为0,所以求和式化简后为

\[\nabla_{ij} = \text{scalar} \cdot g_{ij} \cdot x_{ij}^{\text{scalar} - 1} \]

所以最终求得导数

\[\nabla = \text{scalar} \cdot G \odot X^{\text{scalar} - 1} \]

注:这里的 \(X^a\) 是指 PowerScalar(X, a),而非 \(a\)\(X\) 矩阵进行矩阵乘法,后文也将沿用这一记法。

EWiseDiv

这一算子有两个参数 \(F(X, Y) = X / Y\),这里的除法表示逐元素相除,即 \(f_{ij} = \frac{x_{ij}}{y_{ij}}\),后文也将沿用这一记法。

这里同样以二维矩阵为例推导,首先确定如果 \(X\)\(m \times n\) 矩阵,那么 \(\nabla\) 也是 \(m \times n\) 矩阵。

同样的,\(G\)\(F(X, Y)\)\(m \times n\) 矩阵,所以可以仿照上面 PowerScalar 的例子写出:

\[\nabla_{ij} = \sum_{k=1}^{m} \sum_{l=1}^{n} g_{kl} \cdot \frac{\partial}{\partial x_{ij}} \frac{x_{kl}}{y_{kl}} \]

注意到,只有当 \(k = i\), \(l = j\) 时表达式不为0,所以如果以 \(X\) 为自变量,可以得到

\[\nabla_{ij}^{X} = \frac{g_{ij}}{y_{ij}} \]

\[\nabla^{X} = \frac{G}{Y} \]

同理,可以得到对 \(Y\) 的导数为

\[\nabla^{Y} = -\frac{G \odot X}{Y^2} \]

DivScalar

这一算子是将 \(X\) 的所有元素都除以一个常数 \(\text{scalar}\),具体推导过程和 PowerScalar 高度重合,这里不再赘述,只给出最终结果,推导过程留作习题供读者练习。

\[\nabla = \frac{G}{\text{scalar}} \]

(未完待续)

相关文章:

张量链式法则(上篇):任意维度反向传播公式推导与常见算子解析

本文为常用算子反向传播公式的上篇,介绍了适用于任意张量函数的链式法则公式,使用该公式可以求出诸如reshape,broadcast_to这类会改变张量维度数量的算子的反向传播公式。本文同时给出了求常见算子反向传播公式的通用方法,并以几个简单的算子为例进行了演示。 本系列文章的…...

GAS_Aura-Aura Input Component

1...

CF739C Alyona and towers

比较套路的一个题。 首先你先想 DP 怎么做。 设 \(f_{i, 0/1}\) 表示到了 \(i\) 目前正在上升还是正在下降最长长度是多少,不难发现这个只和相邻两个数的大小关系有关。 发现区间加并不影响区间内相邻大小关系,只影响交界处的关系,所以这是一个单点改。 我们用一个矩阵维护 …...

bitset 相关记录

这里记录有关 \(bitset\) 的一些知识点和实用技巧。 可以引起 \(O(\frac{n}{w})\) 优化的原理和操作:原理:\(bitset\) 内置 \(long long\) 类型数组,每一位是一个 \(bit\)。因此实际操作时,若操作 \(n\) 位,则相当于只是对 \(\frac{n}{64}\) 个 \(longlong\) 类型的数字操…...

大学生开始学习编程

第一篇blog 各位厉害的编程大神们你们好呀! 我现在刚上大二,算法分析与设计老师要求我们开通这个网站的博客,然后在这个论坛学习。在很多帖子我看见很多人悉心请教,也有很多大佬乐于解答,是个氛围很好的社区呢!以后我会偶尔在这个网站上发博客,主要是关于我的近期学习成…...

2025京东方全球创新伙伴大会隆重举行 AI焕新驱动产业质变跃迁

9月11日,以“屏之物联 AI焕新”为主题的京东方全球创新伙伴大会2025(BOE IPC 2025)在北京中关村国际创新中心盛大开幕。作为BOE(京东方)面向全球显示及物联网生态合作伙伴举办的第八届行业盛会,本届IPC大会延续IPC WEEK的形式,呈现了十余场专业论坛以及投资者活动、电竞…...

VMware Workstation 17.5.2 Build 23775571

下载地址:https://www.filehorse.com/download-vmware-workstation/88268/ 激活码:JA09H-4V15H-M80V8-8A8Z4-2U8N4...

编程要求

1 接口写参数(Value1, Value2) 必须第一个参数,后面加一个空格,再写第二个参数 2 入参命名 In_Name,出参命名 Out_Name...

qoj1828 TraveLog

题意 给出一个有向带权图。 有一条 \(1\to n\) 的最短路。给出 \(1\) 到这条最短路上某些点的最短路长度,询问这条最短路是否无解,唯一解,多解,并输出唯一解的方案。 \(n\le 2\times 10^5,m\le 3\times 10^5\)。 思路 首先跑一遍 dij 求出 \(1\to i\) 的最短路长度,记为 \…...

CF827D Best Edge Weight

代码有点史,懒得写了。 你注意到一件事情就是,先随便拎出一棵最小生成树,我们将边分为在这棵树上的边和不在这棵树上的边,那么我们分别考虑。对于树边,考虑所有包含它的非树边最小的那一条就是其上界。 对于非树边,其两个端点之间的树边路径上边权最小的那一条就是其上界…...

基于 YOLOv8 和 Streamlit 搭建视频实时目标跟踪与分割 Web 应用的完整流程

计算机视觉技术的快速发展使得实时目标检测与分割在多个领域得到广泛应用。本文将详细解析如何结合 YOLOv8 算法与 Streamlit 框架,构建一个功能完善的视频实时目标跟踪与分割 Web 应用。通过这个方案,开发者可以快速实现从模型集成到 Web 界面开发的全流程,最终部署一个能够…...

win10休眠失败_自动启动 解决办法

************************************************** *********************** ***************** 每个文章内容都是测试有效的...

新人必看:入职第一个月,如何快速熟悉业务并开始测试?

作为一名刚加入团队的新人测试工程师,面对全新的工作环境、陌生的业务领域和复杂的技术栈,内心既充满期待又不免有些忐忑。如何高效地度过第一个月,快速熟悉业务并开始承担测试任务,是每个新人都在思考的问题。作为一名刚加入团队的新人测试工程师,面对全新的工作环境、陌…...

202210_QQ群_神秘的压缩包

ZIP,CRC碰撞Tags:ZIP,CRC碰撞 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202210_QQ群_神秘的压缩包.zip 某地网安专责截获疑似攻击者用于传送秘密信息的压缩包,请协助该网安专责进行分析。flag格式为fla…...

人闲的时候

可以在猜盐中大展神威! #include<bits/stdc++.h> #include<windows.h> using namespace std; string fu[100100]={"sbdzb","b","p","m","f","d","t","n","l","g…...

第一周作业

第一周作业1.自我介绍 唐潇情 爱好:听歌 刷视频 2.现状、经验和计划 学习过C语言和Java 掌握的基础不扎实 计划是在课上认真听课,课下复习前面掌握不牢的知识,练习代码 目前不知道未来具体做什么工作,先把专业和基础知识学好,有考研的打算 代码量少,基本没有额外练习 在这…...

C# GC

C# GC...

CCPC 2024 郑州 个人题解

目前完成:A、B、C、J、L、M。 待补:D、E、F、G、I、K。比赛链接QOJ 链接题解完成情况A B C D E F G H I J K L M\(\Box\) \(\Box\) \(\Box\) 待补待补 待补\(\Box\) 待补 \(\Box\) \(\Box\)H 是个论文题。 L. Z-曲线 (Z-order Curve)点击查看题意简述 给定二维 Z 形曲线的一个…...

Pollard Rho 分解质因数

Miller_Rabin 判断素数 如果有 \(a^{p-1} \equiv 1(\bmod p)\) ,\(p\) 大概率为质数。但是人们发现有些合数无法被这个式子判掉。 有一个显然成立的式子: \(x^2 \equiv 1 (\bmod p) \rightarrow x^2-1\equiv 0 \rightarrow (x-1)(x+1) \equiv 0\)​ 当 \(p\) 是质数时,\(x\)…...

智慧消防大数据中心

在现代城市化进程不断加快的背景下,消防安全面临着日益复杂严峻的形势。传统消防模式难以满足大体量、多样化的消防需求。智慧消防大数据中心应运而生,它如同消防领域的 “智慧大脑”,正全方位革新消防工作模式,为生命财产安全筑牢坚实防线。一、建设内容 (一)数据采集层…...

GAS_Aura-Input Config Data Asset

1...

[杂谈] 关于听的音乐

持续更新中,应为开学较忙未能一次整理完。 防止有某些人攻击,叠甲。 以下所有内容仅代表个人观点,没有贬低某歌手或歌曲的意思,如果有不同意见欢迎在评论区讨论,但请保持良好的语言环境。 就是分享一下自己听的音乐吧,虽然Frums的歌手排行中第一是山茶花第二是静屋。 听歌…...

7777

tyyyy...

[豪の学习笔记] 软考中级备考 基础复习#7

基本概念、编译与解释、文法、语法推导树、有限自动机、正规式、表达式、传值与引用、各种程序语言特点跟学视频:学以致知Learning - 软件设计师 基础阶段|考点理论精讲 Chapter 7 - 程序设计语言基础知识 1 - 基本概念 低级语言和高级语言低级语言:通常称机器语言和汇编语言…...

经典面试题目:二叉树遍历

一、 核心定义与性质 二叉树(Binary Tree) 是一种每个节点最多有两个子节点的树形结构。这两个子节点通常被称为左子节点和右子节点。 关键术语:根节点(Root): 树的顶层节点,没有父节点。 叶子节点(Leaf): 没有子节点的节点。 深度(Depth): 从根节点到该节点所经历…...

十、微程序控制器是什么?

目录一言以蔽之一个精妙的比喻:做菜与菜谱核心组成部分(对照比喻)它为什么重要?有什么优点?总结一言以蔽之 微程序控制器是CPU的“灵魂指挥家”,它通过执行预先写好的“微程序”(一套精细的指令步骤)来指挥CPU的各个部件协同工作,从而完成一条条机器指令。一个精妙的比…...

2023CCPC秦皇岛站

define时间:#define itn int #define int long long #define ind long double #define yes cout << "Yes" #define no cout << "No" #define pii pair<long long, long long> #define pci pair<char, int> #define re return;QOJ…...

十一、微程序控制器的组成和工作过程

目录一、微程序控制器的核心思想二、微程序控制器的主要组成部分三、微程序控制器的工作过程(重中之重)四、一个简单的例子一、微程序控制器的核心思想 首先,再次强调其核心思想:将一条机器指令的执行,转化为一段由更简单的“微指令”组成的“微程序”的执行。 这些微程序…...

11

111...

六、数据通路的功能和基本结构

目录1. 数据通路的功能2. 数据通路的基本结构3. 工作流程示例(以加法指令 ADD Rd, Rs, Rt 为例)总结1. 数据通路的功能 数据通路(Data Path) 是中央处理器(CPU)的核心组成部分之一。它的主要功能是为指令的执行提供数字信号(数据、地址)的传输路径和加工场所。 具体来说…...

五、单周期CPU和多周期CPU

目录单周期CPU核心思想工作原理优点缺点多周期CPU核心思想工作原理优点缺点核心差异对比总结与发展计算机组成原理中的两个核心概念:单周期CPU和多周期CPU。 它们是实现CPU控制器的两种经典设计方法,各有其优缺点和设计哲学。单周期CPU 核心思想 单周期CPU的设计理念非常直观…...

七、组合逻辑元件(操作元件)和 时序逻辑元件(状态原件)

目录1. 组合逻辑元件(Combinational Logic Elements)核心特征功能常见示例抽象表示2. 时序逻辑元件(Sequential Logic Elements)核心特征功能常见示例抽象表示对比总结在数据通路中的协同工作在数字电路和计算机组成原理中,几乎所有元件都可以被划分为这两大类:组合逻辑元…...

九、指令、微程序、微指令、微命令、微操作

目录核心比喻:做一道菜(比如“鱼香肉丝”)1. 指令 (Instruction)2. 微操作 (Micro-operation, μop)3. 微命令 (Micro-command)4. 微指令 (Microinstruction)5. 微程序 (Microprogram)梳理总结与记忆口诀核心比喻:做一道菜(比如“鱼香肉丝”) 我们把执行一条CPU指令(比如…...

八、CPU控制器的功能和工作原理

目录一、CPU控制器是什么?二、控制器的核心功能三、控制器的工作原理1. 硬布线控制器(Hardwired Control)2. 微程序控制器(Microprogrammed Control)四、现代控制器的演变总结一、CPU控制器是什么? CPU(中央处理器)是计算机的大脑,而控制器(Control Unit, CU) 则是这…...

Linux命令实践

课上测试 作业题目:Linux命令实践 | 学号 | 20131321 | | 姓名 | 王曦轶 | | 日期 | 2025-09-11 | | 实验环境 | Ubuntu |目录实验目的 命令清单与截图 遇到的问题和解决方法 总结与心得实验目的熟练掌握 ls / who / pwd / cd /man/whereis/find/locate/ grep 等高频命令的常…...

Debian 12 解决乱码问题

1.安装中文包apt install -y locales locales-all2.配置本地化设置dpkg-reconfigure locales勾选 中文apt install -y fonts-wqy-zenhei fonts-wqy-microhei xfonts-wqyreboot如果还是不行nano /etc/default/locale## 写入下面的内容 LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 LC_C…...

软工第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13478这个作业的目标 <初步了解博客的写作;向别人介绍自己;了解Github的基本…...

Kafka的元数据Metadata

元数据是指Kafka集群的元数据,这些元数据具体记录了集群中有哪些主题,这些主题有哪些分区,每个分区的leader副本分配在哪个节点上,follower副本分配在哪些节点上,哪些副本在AR、ISR等集合中,集群中有哪些节点,控制器节点又是哪一个。Kafka 的元数据(Metadata) 正是描述…...

datadome笔记

pYZs00 -> 0 y7S2ew -> 0E9CFE54DD8A 随机数 有 hash 组成 NEvtKJ -> 0 首次执行 为0 ,查看localStorage 里的值 PFLOGM -> 1.17.0 js固定 wugUNB | display window["ddm"]["displayEnabled"] 返回的...

AI 机器视觉检测方案:破解食物包装四大质检难题,筑牢食品安全防线

在食品生产领域,包装盒或包装袋作为食品的直接包装载体,其质量优劣直接关系到食品安全与企业声誉。传统人工质检在应对食物包装生产的高速节奏与复杂质量问题时,逐渐暴露出诸多局限性,成为企业发展的瓶颈。而 AI 视频检测技术的出现,犹如一把 “智能利剑”,精准且高效地斩…...

Tkinter 多线程并行任务开发:从秒数丢失到完整显示的踩坑与解决

在 Tkinter 桌面应用开发中,多线程是解决 UI 卡顿的常用方案,但新手很容易在 "线程安全" 和 "UI 更新" 上踩坑。本文记录了一次 Tkinter 多线程并行任务开发中的典型问题:函数执行秒数丢失、最后一秒不显示,以及对应的排查思路和解决方法,适合 Tkinte…...

和你的推式子过一辈子去吧。

问题 给定若干个数 \(a_1 \dots a_n\),\(q\) 次询问,或单点修改,或询问第 \(i\) 个数取 \([0,a_i]\) 中任意数时,\(n\) 个数异或和是 \(z\) 的方案数。 本题的正确做法应该是贪心,但是我的贪心能力为 \(0\),就十分诡异地发现这个东西可以推式子推出来。 一些记号:\(\tex…...

NKOJ全TJ计划——NP1397

题目内容 有一条河,左边一个石墩(A区)上有编号为\(1\backsim n\)的只青蛙,河中有个\(k\)荷叶(C区),还有个\(h\)石墩(D区),右边有一个石墩(B区),如下图所示。\(n\)只青蛙要过河(从左岸石墩A到右岸石墩B),规则为: 石墩上可以承受任意多只青蛙,荷叶只能承受一只青蛙(不论大…...

LT9211C 芯片使用

配置文件: LT9211C_Main.h DrvTtlRx.c 添加屏时序参数 ModTtlRx.h ModMipiTx.h...

枚举类型

在实际的编程应用中,有的变量只有几种可能的取值,譬如说一个家族的几个成员,性别的两种可能等等。C++为这种类型的变量的定义提供了enum关键字。要使用枚举类型的变量,首先需要先定义一个枚举类型名,再声明变量是该枚举类型的。 一、枚举类型的定义 1、定义方式: enum 枚…...

用 C++ + OpenCV + Tesseract 实现英文数字验证码识别(完整可跑)

本文展示如何用 C++ 结合 OpenCV 做图像预处理,再调用 Tesseract OCR 识别验证码。适用于希望在高性能后端或本地服务里集成 OCR 的场景。方案包含: 环境与依赖安装 图像预处理(灰度、二值化、形态学去噪、放大) 使用 Tesseract API 调用(设定白名单、PSM) 完整 C++ 示例…...

2025中国HR SaaS市场分析与选型指南

引言:HR SaaS——企业数字化转型的核心驱动力 2025年,中国HR SaaS市场正站在一个关键的十字路口。随着企业对人力资源战略价值的重新认知,以及人工智能、云计算等前沿技术的深度融合,HR SaaS已不再是简单的管理工具,而是企业实现数字化转型、提升人才竞争力的核心驱动力。…...

jenkins部署消息发送至钉钉--jenkins配置

jenkins配置: 1、点击进入设置页面 2、点击进入插件管理页 3、安转钉钉插件 4、安装后,点击进入 5、输入前面复制的webhook,和钉钉那输入的关键字,保存应用后就配置成功了...

android java层字符串加密对抗

常见的字符串加密格式 来源以及熟悉 1)stringfog插件实现对抗方法 1)dex转换jar2)jar加载对应的解密方法3)遍历文件定位加密函数的位置以及参数4)主动调用以及加密 -- 后期可以把结果覆盖重新打包jadx加载可以还原...

Windows10 RDP远程桌面连接被控端wifi自动断开解决

操作系统: win10 wifi协议: Wi-Fi 6 (802.11ax) 安全类型: WPA2-企业 登录信息的类型: Microsoft: 受保护的 EAP (PEAP)现象 使用frp暴露端口到公网,使用window rdp登录到被控端时,连接配置处理,然后被控端黑屏,wifi端口,导致连接不上。 原因 由于wifi是需要企业认证的,并…...