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

强化学习(Reinforcement Learning)与策略梯度(Policy Gradient)

写在前面:本篇博文的内容来自李宏毅机器学习课程与自己的理解,同时还参考了一些其他博客(懒得放链接)。博文的内容主要用于自己学习与记录。

1 强化学习的基本框架

  强化学习(Reinforcement Learning, RL)主要由智能体(Agent/Actor)、环境(Environment)、状态(State)、动作(Action)、奖励(Reward)组成。在这些成员中,需要训练的是智能体,他会根据不同的状态产生动作。具体过程见下图,智能体由环境得到Observation(状态),再根据Observation得到一个动作作用于环境产生一个新的环境,再根据之前的状态和动作会给出奖励(正奖励或者负奖励)。随后,智能体根据新的状态和奖励,按照一定的策略执行新的动作。智能体通过强化学习,可以知道自己在什么状态下,应该采取什么样的动作使得自身获得最大奖励。

在这里插入图片描述

2 强化学习基本步骤
2.1 步骤1:构建决策框架

  对于智能体(后文都用Actor)模块,很容易想到构建一个用于分类任务的Neural Network,根据例如图像一类的输入,通过Neural Network的计算得到每个动作的概率,选最大概率的动作作为最终的动作。再根据最终的Reward进行反向传播更新权重,从而达到训练的效果。这是典型的Deep Learning(DL)做法。当然,在RL中确实是这么做的。

在这里插入图片描述

  有了可训练的网络模型,就需要定义"Loss Function"用于训练。不同的是DL是为了使结果更加精准,需要尽可能的减小Loss,是一个“下山”的过程,而RL是为了尽可能的增大奖励,是一个“上山”的过程。奖励可以根据动作和状态计算,例如下图中击杀怪物后会获得一定量的分数。

在这里插入图片描述

  让模型不断产生动作直到游戏结束,这就是一轮次(episode)(类似于DL中的epoch),那么我们可以把所有的奖励累加起来。一个简单的思路是可以利用奖励和去更新Neural Network的权重。

在这里插入图片描述

  定义:一次episode的奖励总和为 R = ∑ t = 1 T r t R=\sum_{t=1}^{T}{r_t} R=t=1Trt ,总共进行 T T T 次动作, r t r_t rt 为第 t t t 次动作 a T a_T aT 产生的奖励。现在需要训练Neural Network使 R R R 最大化,这就需要一个优化策略。

2.2 Policy Gradient详解

  怎么知道这个动作好还是不好呢?可以让Actor实际的去“玩”一下游戏。假设动作 π θ ( s ) \pi_\theta(s) πθ(s) 的参数是 θ \theta θ ,就让Actor π θ ( s ) \pi_\theta(s) πθ(s) 反复去玩这个游戏。那么经过不断“玩”,可以得到总得分为 R θ R_\theta Rθ 。就算是在同一个环境下采取相同的Action,得到的 R θ R_\theta Rθ 也会不相同,这是因为Actor具有一定的随机性。那么我们需要尽可能大的去增加总奖励的期望 R ˉ θ \bar R_\theta Rˉθ ,而不是某一次的结果增大。

在这里插入图片描述

  定义:一次episode的所有状态、动作、奖励组成的向量叫 τ \tau τ ,其代表一次episode的过程,相关公式如下:
τ = { s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , . . . , s T , a T , r T } \tau = \{s1, a1, r1, s2, a2, r2, ..., s_T, a_T, r_T\} τ={s1,a1,r1,s2,a2,r2,...,sT,aT,rT}

R ( τ ) = ∑ n = 1 N r n R(\tau)=\sum_{n=1}^{N}r_n R(τ)=n=1Nrn

  假设对于一个Actor,每一种过程 τ \tau τ 都可能被列举到,每一种 τ \tau τ 出现的概率取决于Actor的参数 θ \theta θ ,定义为 P ( τ ∣ θ ) P(\tau|\theta) P(τθ) 。那么 R ˉ θ \bar R_\theta Rˉθ 就等于每一次episode中的得分 R θ R_\theta Rθ 与该过程 τ \tau τ 出现的几率的乘积之和,见如下公式:
R ˉ θ = ∑ τ R ( τ ) P ( τ ∣ θ ) ≈ 1 N ∑ n = 1 N R ( τ n ) \bar R_\theta=\sum_{\tau}{R(\tau)P(\tau|\theta)}\approx\frac{1}{N}\sum_{n=1}^N{R(\tau^n)} Rˉθ=τR(τ)P(τθ)N1n=1NR(τn)
τ \tau τ 的情况太复杂了,难以枚举所有情况,可以让 π θ \pi_\theta πθ sample N N N 次,得到 { τ 1 , τ 2 , . . . , τ N } \{\tau^1, \tau^2, ..., \tau^N\} {τ1,τ2,...,τN} 与所有的出现概率 P ( τ ∣ θ ) P(\tau|\theta) P(τθ) 。那么问题就变成了如下表达式:
θ ∗ = arg ⁡ max ⁡ θ R ˉ θ , R ˉ θ = ∑ τ R ( τ ) P ( τ ∣ θ ) \theta^{*}=\arg \max _{\theta} \bar{R}_{\theta}, \bar{R}_{\theta}=\sum_{\tau}R(\tau)P(\tau|\theta) θ=argθmaxRˉθ,Rˉθ=τR(τ)P(τθ)
由前文中提到RL的训练过程是一个“上山”的过程,所以可以用Gradient Ascent。

2.2.1 Gradient Ascent

  需要更新的权重为 θ \theta θ ,梯度的方向为 ∇ R ˉ θ \nabla \bar R_\theta Rˉθ

在这里插入图片描述

根据 R ˉ θ = ∑ τ R ( τ ) P ( τ ∣ θ ) \bar{R}_{\theta}=\sum_{\tau}R(\tau)P(\tau|\theta) Rˉθ=τR(τ)P(τθ) ,其中 R ( τ ) R(\tau) R(τ) 由于其有一定的随机性,只需要把 τ \tau τ 放进去根据 R ( ⋅ ) R(·) R() 得到结果,可以把其看成一个完全的“黑盒子”,不用考虑其可微性质。这样考虑的具体原因是 R ( τ ) R(\tau) R(τ) 本身是由环境打分得到的,环境是一个“黑盒子”。那么 ∇ R θ \nabla R_{\theta} Rθ 为:
∇ R θ = ∑ τ R ( τ ) ∇ P ( τ ∣ θ ) = ∑ τ R ( τ ) P ( τ ∣ θ ) ∇ P ( τ ∣ θ ) P ( τ ∣ θ ) \nabla R_\theta = \sum_{\tau}{R(\tau)\nabla P(\tau|\theta)} = \sum_{\tau}{R(\tau)P(\tau|\theta)\frac{\nabla P(\tau|\theta)}{P(\tau|\theta)}} Rθ=τR(τ)P(τθ)=τR(τ)P(τθ)P(τθ)P(τθ)
又由于:
d l o g ( f ( x ) ) d x = 1 f ( x ) d f ( x ) d x \frac{dlog(f(x))}{dx}=\frac{1}{f(x)} \frac{df(x)}{dx} dxdlog(f(x))=f(x)1dxdf(x)

∇ l o g ( f ( x ) ) = ∇ f ( x ) f ( x ) \nabla log(f(x))=\frac{\nabla f(x)}{f(x)} log(f(x))=f(x)f(x)

那么 ∇ R θ \nabla R_\theta Rθ 可以变为:
∇ R θ = ∑ τ R ( τ ) P ( τ ∣ θ ) ∇ l o g P ( τ ∣ θ ) ≈ 1 N ∑ n = 1 N R ( τ n ) ∇ l o g P ( τ n ∣ θ ) \nabla R_\theta = \sum_{\tau}{R(\tau)P(\tau|\theta)\nabla log P(\tau|\theta)} \approx \frac{1}{N}\sum^{N}_{n=1}{R(\tau^n)\nabla log P(\tau^n|\theta)} Rθ=τR(τ)P(τθ)logP(τθ)N1n=1NR(τn)logP(τnθ)

其中 “玩” N N N 次游戏得到 { τ 1 , τ 2 , . . . , τ N } \{\tau^1, \tau^2, ..., \tau^N\} {τ1,τ2,...,τN} ,假设 N N N 足够大,表示概率的部分 P ( τ ∣ θ ) P(\tau|\theta) P(τθ) 就可以直接利用平均数去掉。现在的问题变成了如何计算 ∇ l o g P ( τ ∣ θ ) \nabla log P(\tau|\theta) logP(τθ)

  我们可以把 P ( τ ∣ θ ) P(\tau|\theta) P(τθ) 展开:
P ( τ ∣ θ ) = p ( s 1 ) p ( a 1 ∣ s 1 , θ ) p ( r 1 , s 2 ∣ s 1 , a 1 ) p ( a 2 ∣ s 2 , θ ) p ( r 2 , s 3 ∣ s 2 , a 2 ) ⋯ = p ( s 1 ) ∏ t = 1 T p ( a t ∣ s t , θ ) p ( r t , s t + 1 ∣ s t , a t ) P(\tau|\theta)= p\left(s_{1}\right) p\left(a_{1} \mid s_{1}, \theta\right) p\left(r_{1}, s_{2} \mid s_{1}, a_{1}\right) p\left(a_{2} \mid s_{2}, \theta\right) p\left(r_{2}, s_{3} \mid s_{2}, a_{2}\right) \cdots =p(s_1)\prod^{T}_{t=1}{p(a_t|s_t, \theta)p(r_t, s_{t+1}|s_t, a_t)} P(τθ)=p(s1)p(a1s1,θ)p(r1,s2s1,a1)p(a2s2,θ)p(r2,s3s2,a2)=p(s1)t=1Tp(atst,θ)p(rt,st+1st,at)
其实这是一个用于描述马尔科夫决策过程的公式,其中每个状态和行动都有相应的概率分布。其中 p ( s 1 ) p(s_1) p(s1) p ( r t , s t + 1 ∣ s t , a t ) p(r_t, s_{t+1}|s_t, a_t) p(rt,st+1st,at) π θ \pi_\theta πθ 是没关系的, p ( a t ∣ s t , θ ) p(a_t|s_t, \theta) p(atst,θ) π θ \pi_\theta πθ 控制,后者的解释可以见下图。

在这里插入图片描述

那么 l o g P ( τ ∣ θ ) logP(\tau|\theta) logP(τθ) 可以变成如下:
l o g P ( τ ∣ θ ) = l o g p ( s 1 ) + ∑ t = 1 T l o g p ( a t ∣ s t , θ ) + l o g p ( r t , s t + 1 ∣ s t , a t ) logP(\tau|\theta) = logp(s_1)+\sum_{t=1}^{T}logp(a_t|s_t, \theta) + logp(r_t, s_{t+1}|s_t, a_t) logP(τθ)=logp(s1)+t=1Tlogp(atst,θ)+logp(rt,st+1st,at)
∇ l o g P ( τ ∣ θ ) \nabla log P(\tau|\theta) logP(τθ) π θ \pi_\theta πθ 不相干的项直接可以去掉了,变成如下式子:
∇ l o g P ( τ ∣ θ ) = ∑ t = 1 T ∇ l o g p ( a t ∣ s t , θ ) \nabla logP(\tau|\theta)=\sum_{t=1}^{T}\nabla logp(a_t|s_t, \theta) logP(τθ)=t=1Tlogp(atst,θ)
那么可以把这个式子往回带,就可以得到 ∇ R ˉ θ ​ \nabla \bar R_\theta​ Rˉθ (注意这里的 T ​ T​ T 变成了 T n ​ T_n​ Tn ,这是因为对于不同的 τ ​ \tau​ τ 产生动作序列的次数不一样,所以需要添加下标 n ​ n​ n 与 不同轮次的 τ ​ \tau​ τ 对应):
∇ R ˉ θ ≈ 1 N ∑ n = 1 N R ( τ n ) ∇ l o g P ( τ n ∣ θ ) = 1 N ∑ n = 1 N R ( τ θ ) ∑ t = 1 T n ∇ l o g p ( a t n ∣ s t n , θ ) = 1 N ∑ n = 1 N ∑ t = 1 T n R ( τ θ ) ∇ l o g p ( a t n ∣ s t n , θ ) \nabla \bar R_\theta \approx \frac{1}{N} \sum_{n=1}^{N}{R(\tau^n) \nabla log P(\tau^n|\theta)} = \frac{1}{N} \sum_{n=1}^{N}{R(\tau^\theta) \sum_{t=1}^{T_n}{\nabla log p(a_t^n|s_t^n, \theta)}} = \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_n}{R(\tau^\theta){\nabla log p(a_t^n|s_t^n, \theta)}} RˉθN1n=1NR(τn)logP(τnθ)=N1n=1NR(τθ)t=1Tnlogp(atnstn,θ)=N1n=1Nt=1TnR(τθ)logp(atnstn,θ)
这个式子的含义是,假设在sample的一个 θ ​ \theta​ θ 里面, s t n ​ s_t^n​ stn 这个State下采取了 a t n ​ a_t^n​ atn 这个动作的概率,取log再计算梯度,与那一次 τ ​ \tau​ τ 的总奖励相乘。进一步理解,如果在某一次 τ n ​ \tau^n​ τn 时,机器在看到状态 s t n ​ s_t^n​ stn 时,采取了一个动作 a t n ​ a_t^n​ atn ,然后总的奖励是正的,那么机器就会自己去增加看到这个场景下做出该行动的概率。

在这里插入图片描述

值得注意的是,如果把梯度里的 R ( τ n ) R(\tau^n) R(τn) 替换成 r t n r_t^n rtn 后,也就是将第 n n n τ n \tau^n τn 的总奖励换成第 n n n τ n \tau^n τn t t t 时刻在状态 s t n s_t^n stn 下采取动作 a t n a_t^n atn 得到的奖励,那么就会丢失其他动作的期望贡献,最后训练出来的模型只会在原地开火。这里还能这么理解(个人理解),如果换成 r t n r_t^n rtn ,由于sample的随机性,可以不用考虑 1 N ∑ n = 1 N \frac{1}{N}\sum_{n=1}^{N} N1n=1N 这一层。那么 ∇ R ˉ θ \nabla \bar R_\theta Rˉθ 可以写成:
∇ R ˉ θ = g ( ∑ t = 1 T r t ∇ l o g p ( a t ∣ s t , θ ) ) \nabla \bar R_\theta = g(\sum_{t=1}^{T}r_t \nabla log p(a_t|s_t, \theta)) Rˉθ=g(t=1Trtlogp(atst,θ))
此时的 r t r_t rt a t , s t a_t, s_t at,st 唯一对应,那么梯度在每个时刻只关注了一个动作的奖励与概率~~,很容易陷入局部最优~~,导致训练出来的模型在某一特定环境下只会侧重一个动作。由Actor在不同连续的 s t s_t st 下产生的一系列动作是有一定的关联性的~~,类似于NLP上下文特征或者音频里的时域特征~~,所以不能只考虑某一 a t , s t a_t, s_t at,st 下单独的 r t r_t rt。这就有点类似于分类任务的损失函数。

  有了梯度,就可以根据Gradient Ascent更新Actor网络的权重,公式如下:
θ n e w ← θ o l d + η ∇ R ˉ θ o l d \theta^{new} ← \theta^{old} + \eta \nabla \bar R_{\theta^{old}} θnewθold+ηRˉθold
  下面我们再看看更新模型的过程,如下图,即生成一组训练数据,更新一次 θ \theta θ ,值得注意的是每一组训练数据只能用一次。

在这里插入图片描述

2.2.2 如何损失函数进一步优化

  假设所有的 R ( τ n ) R(\tau^n) R(τn) 都是正值。假设在某一个状态下,采取 a , b , c a, b, c a,b,c 三个动作的概率如下,但 a , c a, c a,c 的奖励更高,那么理想状态下经过训练 a , c a, c a,c 出现的概率会增高, b b b 出现的概率会降低。但实际上我们是sample的,假设没有采集到 a a a 动作这种情况,那么经过训练后 a a a 出现的概率会降低。这时,我们需要引入一个baseline,即可以对 R ( τ n ) R(\tau^n) R(τn) 减去一个 b b b ,从而使奖励有好有坏,不然都是正值无法区分,通常可以将 b b b 值设置为与 R ( τ n ) R(\tau^n) R(τn) 的期望接近的值,即 E [ R ( τ n ) ] E[R(\tau^n)] E[R(τn)]

在这里插入图片描述

  还有很多方法能缓解这一问题,例如为不同的动作分配不同的权重,即好的动作给正分,差的动作给负分,再将 R ( τ n ) R(\tau^n) R(τn) 替换成所有动作的权重和,这种做法的本质就是改变了原本奖励的计算。

在这里插入图片描述

随着时间的推移,状态-动作的组合会越来越多,那么前面的组合对距离过远的组合的影响就会越来越小,可以用添加一个衰减因子 γ \gamma γ ,这种方法叫Advantage function,见下图。

在这里插入图片描述

相关文章:

强化学习(Reinforcement Learning)与策略梯度(Policy Gradient)

写在前面:本篇博文的内容来自李宏毅机器学习课程与自己的理解,同时还参考了一些其他博客(懒得放链接)。博文的内容主要用于自己学习与记录。 1 强化学习的基本框架 强化学习(Reinforcement Learning, RL)主要由智能体(Agent/Actor)、环境(Environment)、…...

JUC之ForkJoin并行处理框架

ForkJoin并行处理框架 Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。 类似于mapreduce 其实,在Java 8中引入的并行流计算,内部就是采用的ForkJoinPool来实现…...

【牛客面试必刷TOP101】Day8.BM33 二叉树的镜像和BM36 判断是不是平衡二叉树

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:牛客面试必刷TOP101 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&…...

CSS padding(填充)

CSS padding(填充)是一个简写属性,定义元素边框与元素内容之间的空间,即上下左右的内边距。 padding(填充) 当元素的 padding(填充)内边距被清除时,所释放的区域将会受到…...

C语言达到什么水平才能从事单片机工作

C语言达到什么水平才能从事单片机工作 从事单片机工作需要具备一定的C语言编程水平。以下是几个关键要点:基本C语言知识: 掌握C语言的基本语法、数据类型、运算符、流控制语句和函数等基本概念。最近很多小伙伴找我,说想要一些C语言学习资料&…...

Java架构师理解SAAS和多租户

目录 1 云服务的三种模式1.1 IaaS(基础设施即服务)1.2 PaaS(平台即服务)1.3 SaaS(软件即服务)1.4 区别与联系2 SaaS的概述2.1 Saas详解2.2 应用领域与行业前景2.3 Saas与传统软件对比3 多租户SaaS平台的数据库方案3.1 多租户是什么3.2 需求分析3.3 多租户的数据库方案分析…...

关于Java线程池相关面试题

【更多面试资料请加微信号:suns45】 https://flowus.cn/share/f6cd2cbe-627a-435f-a6e5-1395333f92e8 【FlowUs 息流】📣suns-Java资料 访问密码:【请加微信号:suns45】 ————线程相关的面试题———— 0:创建线…...

ExcelBDD Python指南

在Python里面支持BDD Excel BDD Tool Specification By ExcelBDD Method This tool is to get BDD test data from an excel file, its requirement specification is below The Essential of this approach is obtaining multiple sets of test data, so when combined with…...

基于深度学习的驾驶员疲劳监测系统的设计与实现

点击以下链接获取源码: https://download.csdn.net/download/qq_64505944/88421622?spm1001.2014.3001.5503 基于深度学习的驾驶员疲劳监测系统的设计与实现 1 绪论 在21世纪,各国的经济飞速发展,人民越来越富裕,道路上的汽车也逐…...

B树、B+树详解

B树 前言   首先,为什么要总结B树、B树的知识呢?最近在学习数据库索引调优相关知识,数据库系统普遍采用B-/Tree作为索引结构(例如mysql的InnoDB引擎使用的B树),理解不透彻B树,则无法理解数据…...

使用hugging face开源库accelerate进行多GPU(单机多卡)训练卡死问题

目录 问题描述及配置网上资料查找1.tqdm问题2.dataloader问题3.model(input)写法问题4.环境变量问题 我的卡死问题解决方法 问题描述及配置 在使用hugging face开源库accelerate进行多GPU训练(单机多卡)的时候,经常出现如下报错 [E Process…...

IDEA 修改插件安装位置

不说假话,一定要看到最后,不然你以为我为什么要自己总结!!! IDEA 修改插件安装位置 前言步骤 前言 IDEA 默认的配置文件均安装在C盘,使用时间长会生成很多文件,这些文件会占用挤兑C盘空间&…...

牛客网SQL160

国庆期间每类视频点赞量和转发量_牛客题霸_牛客网 select * from ( select tag,dt, sum(单日点赞量)over(partition by tag order by dt rows between 6 preceding and 0 following), max(单日转发量)over(partition by tag order by dt rows between 6 preceding and 0 follo…...

HDFS Java API 操作

文章目录 HDFS Java API操作零、启动hadoop一、HDFS常见类接口与方法1、hdfs 常见类与接口2、FileSystem 的常用方法 二、Java 创建Hadoop项目1、创建文件夹2、打开Java IDEA1) 新建项目2) 选择Maven 三、配置环境1、添加相关依赖2、创建日志属性文件 四、Java API操作1、在HDF…...

论文阅读之【Is GPT-4 a Good Data Analyst?(GPT-4是否是一位好的数据分析师)】

文章目录 论文阅读之【Is GPT-4 a Good Data Analyst?(GPT-4是否是一位好的数据分析师)】背景:数据分析师工作范围基于GPT-4的端到端数据分析框架将GPT-4作为数据分析师的框架的流程图 实验分析评估指标表1:GPT-4性能表现表2&…...

【数据结构】:二叉树与堆排序的实现

1.树概念及结构(了解) 1.1树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的有一个特殊的结点&#…...

纯css手写switch

CSS 手写switch 纯css手写switchcss变量 纯css手写switch 思路: switch需要的元素有:开关背景、开关按钮。点击按钮后,背景色变化,按钮颜色变化,呈现开关打开状态。 利用typecheckbox,来实现switch效果(修…...

PyTorch 深度学习之处理多维特征的输入Multiple Dimension Input(六)

1.Multiple Dimension Logistic Regression Model 1.1 Mini-Batch (N samples) 8D->1D 8D->2D 8D->6D 1.2 Neural Network 学习能力太好也不行(学习到的是数据集中的噪声),最好的是要泛化能力,超参数尝试 Example, Arti…...

LeetCode【438】找到字符串中所有字母异位词

题目&#xff1a; 注意&#xff1a;下面代码勉强通过&#xff0c;每次都对窗口内字符排序。然后比较字符串。 代码&#xff1a; public List<Integer> findAnagrams(String s, String p) {int start 0, end p.length() - 1;List<Integer> result new ArrayL…...

关于LEFT JOIN的一次理解

先看一段例子&#xff1a; SELECTproduct_half_spu.id AS halfSpuId,product_half_spu.half_spu_code,product_half_spu.half_spu_name,COUNT( product_sku.id ) AS skuCount,product_half_spu.create_on,product_half_spu.create_by,product_half_spu.upload_pic_date,produc…...

各报文段格式集合

数据链路层-- MAC帧 前导码8B&#xff1a;数据链路层将封装好的MAC帧交付给物理层进行发送&#xff0c;物理层在发送MAC帧前&#xff0c;还要在前面添加8字节的前导码&#xff08;分为7字节的前同步码1字节的帧开始定界符&#xff09;MAC地址长度6B数据长度46&#xff5e;1500B…...

【算法-动态规划】最长公共子序列

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

区块链游戏的开发流程

链游&#xff08;Blockchain Games&#xff09;的开发流程与传统游戏开发有许多相似之处&#xff0c;但它涉及到区块链技术的集成和智能合约的开发。以下是链游的一般开发流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&…...

目标检测网络系列——YOLO V2

文章目录 YOLO9000better,更准batch Normalization高分辨率的训练使用anchor锚框尺寸的选择——聚类锚框集成改进——直接预测bounding box细粒度的特征图——passthrough layer多尺度训练数据集比对实验VOC 2007VOC 2012COCOFaster,更快网络模型——Darknet19训练方法Strong…...

15. Java反射和注解

Java —— 反射和注解 1. 反射2. 注解 1. 反射 动态语言&#xff1a;变量的类型和属性可以在运行时动态确定&#xff0c;而不需要在编译时指定 常见动态语言&#xff1a;Python&#xff0c;JavaScript&#xff0c;Ruby&#xff0c;PHP&#xff0c;Perl&#xff1b;常见静态语言…...

pdf处理工具 Enfocus PitStop Pro 2022 中文 for mac

Enfocus PitStop Pro 2022是一款专业的PDF预检和编辑软件&#xff0c;旨在帮助用户提高生产效率、确保印刷品质量并减少错误。以下是该软件的一些特色功能&#xff1a; PDF预检。PitStop Pro可以自动检测和修复常见的PDF文件问题&#xff0c;如缺失字体、图像分辨率低、颜色空…...

微信小程序入门开发教程

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…...

php函数

1. strstr() 返回a在b中的第一个位置 2.substr() 截取字符串 3.PHP字符串函数parse_str(将字符串解析成多个变量)-CSDN博客 4.explode() 字符串分割为数组 5.trim&#xff08;&#xff09; 1.去除字符串两边的 空白字符 2.去除指定字符 6.extract()函数从数组里…...

3.3 封装性

思维导图&#xff1a; 3.3.1 为什么要封装 ### 3.3.1 为什么要封装 **封装**&#xff0c;在Java的面向对象编程中&#xff0c;是一个核心的思想。它主要是为了保护对象的状态不被外部随意修改&#xff0c;确保数据的完整性和安全性。 #### **核心思想&#xff1a;** - 保护…...

Redis魔法:点燃分布式锁的奇妙实现

分布式锁是一种用于在分布式系统中控制对共享资源的访问的锁。它与传统的单机锁不同&#xff0c;因为它需要在多个节点之间协调以确保互斥访问。 本文将介绍什么是分布式锁&#xff0c;以及使用Redis实现分布式锁的几种方案。 一、前言 了解分布式锁之前&#xff0c;需要先了…...

iOS 项目避坑:多个分类中方法重复实现检测

#前言 在项目中,我们经常会使用分类 -> category。category在实际项目中一般有两个左右:1.给已有class增加方法,扩充起能力、2.将代码打散到多个文件中,避免因为一个类过于复杂而导致代码篇幅过长(应用于viewController中很好用) 但是 category 也有很多弊端~ **首…...

【003】EIS数据分析_#LIB

EIS数据分析 1. EIS测试及数据获取2. EIS数据分析2.1 EIS曲线划分 1. EIS测试及数据获取 点击查看往期介绍 2. EIS数据分析 2.1 EIS曲线划分 一般来说&#xff0c;实轴处的截获表示体电阻(Rb)&#xff0c;它反映了电解质&#xff0c;隔膜和电极的电导率。高频区的半圆对应于…...

Sprint framework Day07:注解结合 xml 配置

前言 Spring注解结合XML配置是指在Spring应用中&#xff0c;使用注解和XML配置的方式来进行Bean的定义、依赖注入和其他配置。这种方式可以充分利用Spring框架的注解和XML配置两种不同的配置方式的特点。 在Spring框架中&#xff0c;我们可以使用注解来定义Bean&#xff0c;如…...

LiveGBS流媒体平台GB/T28181功能-国标流媒体服务同时兼容内网收流外网收流多网段设备收流

LiveGBS流媒体平台GB/T28181功能-国标流媒体服务同时兼容内网收流外网收流多网段设备收流 1、背景2、设备接入播放2.1、查看通道2.2、直播播放 3、默认收流地址配置4、其它网络设备收流配置5、搭建GB28181视频直播平台 1、背景 服务器部署的时候&#xff0c;可能有多个网卡多个…...

js题解(四)

文章目录 批量改变对象的属性判断是否包含数字判断是否符合指定格式 批量改变对象的属性 给定一个构造函数 constructor&#xff0c;请完成 alterObjects 方法&#xff0c;将 constructor 的所有实例的 greeting 属性指向给定的 greeting 变量。 function alterObjects(const…...

如何进行大数运算和高精度计算?

大数运算和高精度计算是在计算机编程中常见的需求&#xff0c;尤其是当处理大整数、分数、复数、浮点数等需要更多位数的数据时。在C语言中&#xff0c;由于原生的数据类型有限&#xff0c;您需要使用自定义的数据结构和算法来执行大数运算和高精度计算。在本文中&#xff0c;我…...

身份证读卡器跟OCR有何区别?哪个好?

二代身份证读卡器&#xff08;以下简称读卡器&#xff09;和OCR&#xff08;光学字符识别&#xff09;是两种常见的身份证信息获取技术&#xff0c;它们在原理、功能和应用方面存在一些区别。下面将详细介绍二者的区别并探讨哪个更好。 1. 原理&#xff1a; - 读卡器&#xff…...

华为云云耀云服务器L实例评测 | 实例评测使用之硬件参数评测:华为云云耀云服务器下的 Linux 网络监控神器 bmon

华为云云耀云服务器L实例评测 &#xff5c; 实例评测使用之硬件参数评测&#xff1a;华为云云耀云服务器下的 Linux 网络监控神器 bmon 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什…...

C++ 设计模式 —— 组合模式

C 设计模式 —— 组合模式 0. 引用连接 本文主要的思路和代码&#xff0c;来自于对以下连接的学习和实现&#xff1a; 组合模式 1. 引言 1.1 什么是组合模式&#xff1f; 组合模式的定义组合模式的作用 组合模式是一种行为型设计模式&#xff0c;它将对象组合成树形结构以…...

华为云Stack的学习(九)

十、华为云Stack灾备服务介绍 1.云硬盘备份VBS 云硬盘备份服务&#xff08;VBS&#xff0c;Volume Backup Service&#xff09;可为云硬盘&#xff08;EVS&#xff0c;Elastic Volume Service&#xff09;创建备份&#xff0c;利用备份数据恢复云硬盘&#xff0c;最大限度保障…...

Flink中jobmanager、taskmanager、slot、task、subtask、Parallelism的概念

场景 一个工厂有三个车间每个车间两条生产线 生产流程如下 原料->加工->过滤->分类->美化->包装->下线 JobManager&#xff1a;工厂 在上述场景中&#xff0c;工厂就是jobManager&#xff0c;负责协调、调度和监控整个生产过程 TaskManager&#xff1a;车间…...

OpenHarmony docker环境搭建

OpenHarmony docker环境搭建 要求一台安装ubuntu的虚拟机,vscode软件 安装docker 在 Ubuntu 上安装 Docker 非常直接。我们将会启用 Docker 软件源&#xff0c;导入 GPG key&#xff0c;并且安装软件包。 首先&#xff0c;更新软件包索引&#xff0c;并且安装必要的依赖软件…...

【计算机网络】网络编程接口 Socket API 解读(11)

Socket 是网络协议栈暴露给编程人员的 API&#xff0c;相比复杂的计算机网络协议&#xff0c;API 对关键操作和配置数据进行了抽象&#xff0c;简化了程序编程。 本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍&#xff0c;从而更好的理解 socket 编程。…...

Qt工具开发,该不该跳槽?

Qt工具开发&#xff0c;该不该跳槽? 就这样吧&#xff0c;我怕你跳不动。 嵌入式UI&#xff0c;目前趋势是向着LVGL发展。QT已经在淘汰期了。很多项目还在用&#xff0c;但技术上已经落后。QT短期内不会全面淘汰&#xff0c;但退位让贤的大趋势已经很清楚了。 最近很多小伙伴…...

【深度学习】DDPM,Diffusion,概率扩散去噪生成模型,原理解读

看过来看过去&#xff0c;唯有此up主&#xff0c;非常牛&#xff1a; Video Explaination(Chinese) 1. DDPM Introduction q q q - 一个固定&#xff08;或预定义&#xff09;的正向扩散过程&#xff0c;逐渐向图像添加高斯噪声&#xff0c;直到最终得到纯噪声。 p θ p_θ p…...

HT8699:内置 BOOST 升Y双声道音频功率放大器

HT8699是一款内置BOOST升Y模块的立体声音频功率放大器。HT8699具有AB类和D类切换功能&#xff0c;在受到D类功放EMI干扰困扰时&#xff0c;可切换至AB类音频功放模式。 在D类模式下&#xff0c;内置的BOOST升Y模块可通过外置电阻调节升Y值&#xff0c;即使是锂电池供电&#xf…...

利达卓越:关注环保事业,持续赋能科技

随着全球环境问题的日益突出,绿色金融作为一种新兴的金融模式逐渐受到各国的重视。绿色金融是指在金融活动中,通过资金、信贷和风险管理等手段,支持环境友好和可持续发展的项目和产业。绿色金融的出现是为了应对气候变化、资源短缺、污染问题等现实挑战,促进经济的绿色转型和可…...

Spring MVC中通过配置文件配置定时任务

Spring MVC中配置定时任务&#xff08;配置文件方式&#xff09; 1.步骤 1.步骤 1-1 在springmvc.xml&#xff08;配置文件&#xff09;的beans中添加 xmlns:task"http://www.springframework.org/schema/task" http://www.springframework.org/schema/task http…...

AI项目十六:YOLOP 训练+测试+模型评估

若该文为原创文章&#xff0c;转载请注明原文出处。 通过正点原子的ATK-3568了解到了YOLOP&#xff0c;这里记录下训练及测试及在onnxruntime部署的过程。 步骤&#xff1a;训练->测试->转成onnx->onnxruntime部署测试 一、前言 YOLOP是华中科技大学研究团队在2021年…...

Flink报错could not be loaded due to a linkage failure

文章目录 1、报错2、原因3、解决 1、报错 在Flink上提交作业&#xff0c;点Submit没反应&#xff0c;F12看到接口报错信息为&#xff1a; 大概意思是&#xff0c;由于链接失败&#xff0c;无法加载程序的入口点类xx。没啥鸟用的信息&#xff0c;去日志目录继续分析&#xff1a…...