1.ef���Դ��
2.ALBEF,框架框架BLIP中的源码原理对比学习损失函数——源码公式推导
3.Angular Ivy 执行变更检测
4.易语言飞扬EBNF语法
ef���Դ��
在.NET Core开发中,开发者通常会遇到使用EF Core时,框架框架缺少AddOrUpdate方法的源码原理情况。虽然可以自定义实现,框架框架但有一个通用且简便的源码原理property的源码AddOrUpdate方法会更实用。在.NET Framework时代,框架框架EF6的源码原理AddOrUpdate方法深受欢迎。经过多年的框架框架习惯调整,许多开发者在网络中寻找解决方案,源码原理但大多不甚满意。框架框架
为此,源码原理本文提供了一种通过扩展DbSet类型,框架框架为EF Core找回AddOrUpdate方法的源码原理实现方案。基本思路是框架框架,为DbSet添加一个扩展方法,根据传入实体的特定属性进行数据的存在性判断,通常使用Id、手机号或身份证号等唯一键进行查存。为确保灵活性,动态构建where的Expression表达式是关键。
首先,创建一个名为AddOrUpdate的扩展方法,接受DbSet类型及一个表达式树类型作为参数。这个表达式树类型决定了实体根据哪个字段进行存在性判断。通过表达式树编译,可以反射获取实体的判重字段值。如使用字符串类型的时时彩源码图片Name进行查重,编译后传入实体调用,得到Name的值。
在构造where表达式树前,封装表达式树的参数访问至关重要。此步骤涉及两种操作:成员访问和创建新对象,用于生成所需的条件表达式树主体部分。例如,将e=>e.Name表达式转换为e=>e.Name=="白火石"的形式。
构造完成where表达式树后,可以进行数据查询。通过判断传入的实体是否为null来决定是新增还是更新操作。若为null,则直接使用DBSet的Add方法。若不为null,表示需要更新,但需排除主键字段和判重字段,这可通过反射操作实现。获取主键字段后,即可更新非主键字段的值。
至此,AddOrUpdate方法实现完毕。完整代码已封装在Masuit.Tools类库中,便于直接使用。详情见源代码地址。
ALBEF,BLIP中的对比学习损失函数——源码公式推导
ALBEF和BLIP模型中的对比学习损失函数——详细解析
在图像-文本(ITC)对比学习中,关键步骤是时光轴源码下载基于[CLS]向量的和文本表示进行对比。和文本的全局表示分别用[公式]和[公式]表示,动量编码器的输出通过[公式]和[公式]反映。首先,通过动量编码器处理和文本,将得到的[CLS]置入对应队列头部,接着计算编码器与动量编码器输出的相似度,如[公式]和[公式]所示。
硬标签的制作部分,通过[公式]生成每对图-文的标签,表示它们的关系。原始标签队列与生成的硬标签进行拼接,形成新的对比矩阵。动量蒸馏引入后,计算动量编码器输出与队列的相似度,并生成软标签,如[公式]和[公式]所示。
对比学习ITC损失计算基于交叉熵,通过[公式]变形,考虑了动量蒸馏的情况。不蒸馏时,损失函数可以表示为[公式],而带动量蒸馏的MLM损失则为[公式],通过KL散度的近似公式简化计算,最终得到的源代码计算公式为[公式]。
ITM头的运用则是在每个样本的全局表示上进行分类,通过[公式]计算ITM损失。至于MLM损失,慢速关注指标源码通过掩码处理文本并生成标签,计算方式基于[公式],并在动量蒸馏下调整为[公式]。
模型的配置调整可以通过改变num_hidden_layers参数来完成,如在Huggingface的bert-base-uncased模型中。总的来说,ALBEF和BLIP的损失函数设计注重了全局表示的对比和样本关系的精细处理,通过动量蒸馏优化了模型的训练效果。
Angular Ivy 执行变更检测
在Angular框架的进化中,Ivy渲染引擎的引入成为了关键转折点,它带来了性能提升、维护性和代码可读性的显著改善。本文将通过可视化的方式,深入探讨Ivy在变更检测机制上的运作,同时,我们也将从零构建基于Ivy的demo应用,以直观展示其工作原理。
首先,为了更好地理解本文内容,我们提供了一个在线demo,它展示了如何在不同的生命周期区块内触发变更检测流程。只需要在Sub-Child组件的输入框中输入文本,即可体验到变更检测的实时响应。
在Angular中,视图(View)是底层抽象的核心,它用于描述模板结构,包含了用于反射模板的麟龙决策源码数据。以ChildComponent为例,其视图结构包含了特定的模板。在传统渲染引擎中,视图定义通过工厂创建节点,并将节点存储在视图定义的nodes数组中。而在Ivy中,使用ngComponentDef.template函数创建LNodes,并将其存储在data数组中。此外,data数组还包括绑定信息,这些信息按照模板中出现的顺序存储,起始位置为bindingStateIndex参数的值。
要获取ChildComponent的view实例,可以通过ComponentInstance.__ngHostLNode__属性或使用注入ChangeDetectorRef的方式。通过这种方法,Angular首先创建root view,并将宿主元素定位在data数组中下标为0的位置。之后,遍历所有组件并为每个view填充data。
接下来,让我们深入了解变更检测机制。ChangeDetectorRef是抽象类,包含detectChanges和markForCheck等方法。在注入ChangeDetectorRef时,实际上获取的是从ChangeDetectorRef类拓展得到的ViewRef实例。为了更深入了解Ivy中的变更检测机制,本文将详细探讨内部方法,包括detectChanges、tick、scheduleTick、markViewDirty和markDirty等。
detectChanges方法以同步方式在一个组件及其子组件上执行变更检测。尽管在某些情况下,直接调用detectChanges触发变更检测是合理的,但通常更推荐使用markDirty函数,等待未来的某个时间点通过调度器调用该函数。这是因为单个用户操作可能导致多个组件失效,同时,对每个组件进行变更检测效率较低。等待所有组件都被标记为dirty后,执行单次变更检测更为高效。
用于在整个应用层面触发变更检测的tick方法类似于detectChanges方法,但仅在根组件上调用。此外,tick还会执行生命周期钩子,并基于组件的ChangeDetectionStrategy和dirty状态有条件地检查组件。
scheduleTick用于调度整个应用的变更检测计划,它将多个调用合并在一个变更检测轮询中执行。当视图需要重新渲染时,通常通过调用markDirty方法间接调用scheduleTick方法。
markViewDirty(markForCheck)将当前视图及其所有祖先视图标记为dirty。在Angular 5中,该方法向上遍历并确保对所有父级view进行检查。值得注意的是,在Ivy中,markForCheck并不会触发任何变更检测循环。
markDirty将组件标记为dirty,这意味着调度器将在未来的某个时间点对该组件进行变更检测。对已标记为dirty的组件再次标记不会产生额外效果,每个组件树只会被调度一次变更检测。(使用不同的renderComponent构造的组件拥有不同的处理器)。
checkNoChanges方法通常不包含新的内容。
在调试新的变更检测机制时,发现忘记安装zone.js。然而,应用能够正常运行,即使没有依赖zone.js,没有cdRef.detectChanges或tick。基于当前设计,对于采用OnPush的组件,Angular只有在特定情况下才会触发变更检测。这些规则同样适用于Ivy,如子组件存在一个output绑定,通过(input)事件触发,调用markForCheck方法。这解释了为什么在没有zone.js的情况下,应用仍然可以正常运行。
关于ExpressionChangedAfterItHasBeenCheckedError问题,虽然操作类似,但顺序似乎有所变化。比如,Angular首先检测子组件,然后检测嵌入的视图。在demo中的ChildComponent展示了这种实现,应用动态方式观察这种变化,可以看到顺序与过去的视图引擎相似。
在demo中还有一个可选的run angular complier按钮,可以检测其他场景。
一次性字符串初始化在组件以字符串值方式接受颜色参数时,Angular将常量存储在负责创建和更新组件的代码之外,仅在创建模式中使用它。因此,Angular不再对这个绑定进行额外检查。
在Ivy中,Angular编译器将常量存储在创建模式中,只有在创建组件时使用它,这使得容器不再创建文本节点。
最后,通过构建一个小demo,我们展示了IDOM渲染的工作流程。IDOM关注构建和更新DOM树,其设计理念与Ivy有相似之处。通过测试方案,我们验证了更新文本节点的代码,使用浏览器工具可以观察到文本节点内容的变化。IDOM的核心理念是使用真实DOM与新树进行比较,以实现高效渲染。
感谢阅读本文,希望您通过本文对Angular Ivy渲染引擎的变更检测机制有了更深入的理解。如需更多详细内容,可参考相关文档或深入研究Angular源代码。
易语言飞扬EBNF语法
本文以易语言飞扬(EF)的EBNF语法进行详细解析。EBNF,即Extended Backus-Naur Form,是一种用于描述编程语言结构的上下文无关文法表示法。 在EBNF的规则中,方括号 [] 表示其内容是可选的,例如,[expression] 表示可以有expression,也可以没有。花括号 { } 则表示零个或多个重复,如 { expression}+ 表示expression可以重复一次或多次。小括号 () 用于分组,主要用来明确语法结构,但并不影响其实现。而竖线 | 用于多选一,如 x|y|z 表示在x、y或z中选择一个。 在 EF 代码的语法表述中,粗体部分代表实际的 EF 代码,而斜体部分则代表用户自定义的名称或嵌套的 EBNF 表达式,如 identifier 或 other_expression。 代码结构方面,一个完整的 EF 项目是由任意数量的源代码文件(*.ef)构成,每个文件包含具体的语言规则。此外,还可以包含一个可选的类库信息定义文件(*.inf),用于管理项目的库引用和配置。这些文件共同构建了 EF 语言的完整语法框架。扩展资料
“易语言。飞扬”(英文名称“EF”)是一门简单易学、高效实用、面向对象、跨平台的计算机通用编程语言。它是完全面向对象的编程语言,因而在面向对象机制上,与同为面向对象的Java、C#等编程语言,有相似甚至相同之处。它的语法脱胎自“类C语言”,因而在语法上,与C、C++、Java、C#等编程语言,有相似甚至相同之处。它是一个全新的易语言版本,从核心架构上明显区别于原有的易语言(4.x及以前版本),它与以前的易语言共同构成了一个可以面向更广泛应用层次的软件开发平台。