diffusion model(十八):diffusion model中negative prompt的工作机制

info
个人博客主页http://myhz0606.com/article/ncsn

前置阅读:

DDPM: http://myhz0606.com/article/ddpm

classifier-guided:http://myhz0606.com/article/guided

classifier-free guided:http://myhz0606.com/article/classifier_free

Score based generative model:http://myhz0606.com/article/ncsn

引言

在用Stable Diffusion生成图片时,除了输入图片表述文本外(positive prompt),我们还经常会使用negative prompt作为condition来让模型避免生成negative prompt所表述的概念。查阅源码发现stable diffusion中negative prompt的实现机制是将classifier-free guided中 ϵ θ ( x t , y = ∅ , t ) \epsilon_{\theta}(x_t, y=\empty, t) ϵθ(xt,y=,t)替换为 ϵ θ ( x t , y ~ , t ) \epsilon_{\theta}(x_t, \tilde{y}, t) ϵθ(xt,y~,t),( y ~ \tilde{y} y~表示negative prompt)。即:

原生classifier-free guided每一个timestep的噪声估计如下:

ϵ ^ θ ( x t , y , t ) = ϵ θ ( x t , y = ∅ , t ) + s [ ϵ θ ( x t , y , t ) − ϵ θ ( x t , y = ∅ , t ) ] \begin{align} \hat{\epsilon}_{\theta}(x_t, y, t)=\epsilon_{\theta}(x_t, y=\empty,t) + s[\epsilon_{\theta}(x_t, y, t) - \epsilon_{\theta}(x_t, y=\empty, t) ]\tag{1} \end{align} ϵ^θ(xt,y,t)=ϵθ(xt,y=,t)+s[ϵθ(xt,y,t)ϵθ(xt,y=,t)](1)

当有negative prompt condition时,将上式改为

ϵ ^ θ ( x t , y , t ) = ϵ θ ( x t , y ~ , t ) + s [ ϵ θ ( x t , y , t ) − ϵ θ ( x t , y ~ , t ) ] \begin{align} \hat{\epsilon}_{\theta}(x_t, y, t)=\epsilon_{\theta}(x_t, \tilde{y},t) + s[\epsilon_{\theta}(x_t, y, t) - \epsilon_{\theta}(x_t, \tilde{y}, t) ]\tag{2} \end{align} ϵ^θ(xt,y,t)=ϵθ(xt,y~,t)+s[ϵθ(xt,y,t)ϵθ(xt,y~,t)](2)

源码位置位于(diffuser版本v0.29.1): https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py#L427

那么为什么negative prompt能够work呢?

How do negative prompt take effect

为了引出相关推导,先快速回顾一下classifier-guided和classifier-free的motivation。

为了做条件生成(即从条件分布 p ( x ∣ y ) p(x|y) p(xy)中采样样本),我们可以根据贝叶斯公式进行如下推导:

p ( x ∣ y ) = p ( y ∣ x ) p ( x ) p ( y ) log ⁡ p ( x ∣ y ) = log ⁡ p ( y ∣ x ) + log ⁡ p ( x ) − log ⁡ p ( y ) ⇒ ∇ x log ⁡ p ( x ∣ y ) = ∇ x log ⁡ p ( y ∣ x ) + ∇ x log ⁡ p ( x ) − ∇ x log ⁡ p ( y ) ⏟ = 0 ⇒ ∇ x log ⁡ p ( x ∣ y ) = ∇ x log ⁡ p ( y ∣ x ) + ∇ x log ⁡ p ( x ) (3) \begin{aligned} p(\mathrm{x}|y) &= \frac{p(y|\mathrm{x})p(\mathrm{x})}{p(y)} \\ \log p(\mathrm{x}|y) &= \log p(y|\mathrm{x}) + \log p(\mathrm{x}) - \log p(y) \\ \Rightarrow \nabla_{\mathrm{x}} \log p(\mathrm{x}|y) &= \nabla_{\mathrm{x}} \log p(y|\mathrm{x}) + \nabla_{\mathrm{x}} \log p(\mathrm{x}) - \underbrace{ \nabla_{\mathrm{x}} \log p(y) }_{=0} \\ \Rightarrow \nabla_{\mathrm{x}} \log p(\mathrm{x}|y) &= \nabla_{\mathrm{x}} \log p(y|\mathrm{x}) + \nabla_{\mathrm{x}} \log p(\mathrm{x}) \end{aligned} \tag{3} p(xy)logp(xy)xlogp(xy)xlogp(xy)=p(y)p(yx)p(x)=logp(yx)+logp(x)logp(y)=xlogp(yx)+xlogp(x)=0 xlogp(y)=xlogp(yx)+xlogp(x)(3)

在classifier-guided任务中,我们已知无条件输入的score based model能够估计出 ∇ x log ⁡ p ( x ) \nabla_{\mathrm{x}} \log p(\mathrm{x}) xlogp(x) ,因此,为了得到 ∇ x log ⁡ p ( y ∣ x ) \nabla_{\mathrm{x}} \log p(y|\mathrm{x}) xlogp(yx) ,我们只需额外训练一个分类器来估计 ∇ x log ⁡ p ( y ∣ x ) \nabla_{\mathrm{x}} \log p(y|\mathrm{x}) xlogp(yx)即可。为了控制condition的强度,引入一个guidance scale s s s

∇ x log ⁡ p ( x ∣ y ) : = s ∇ x log ⁡ p ( y ∣ x ) + ∇ x log ⁡ p ( x ) (4) \nabla_{\mathrm{x}} \log p(\mathrm{x}|y) := s \nabla_{\mathrm{x}} \log p(y|\mathrm{x}) + \nabla_{\mathrm{x}} \log p(\mathrm{x}) \tag{4} xlogp(xy):=sxlogp(yx)+xlogp(x)(4)

对于classifier-free任务中,通过随机drop标签,我们同时训练 ∇ x log ⁡ p ( x ) \nabla_{\mathrm{x}} \log p(\mathrm{x}) xlogp(x) ∇ x log ⁡ p ( x ∣ y ) \nabla_{\mathrm{x}} \log p(\mathrm{x}|y) xlogp(xy) 两个score based model。虽然我们可以通过 ∇ x log ⁡ p ( x ∣ y ) \nabla_{\mathrm{x}} \log p(\mathrm{x}|y) xlogp(xy) 直接进行条件生成,但为了控制生成时条件的强度,沿用了公式(4) guidance scale的概念。并且 ∇ x log ⁡ p ( y ∣ x ) = ∇ x log ⁡ p ( x ∣ y ) − ∇ x log ⁡ p ( x ) \nabla_{\mathrm{x}} \log p(y|\mathrm{x}) = \nabla_{\mathrm{x}} \log p(\mathrm{x}|y) - \nabla_{\mathrm{x}} \log p(\mathrm{x}) xlogp(yx)=xlogp(xy)xlogp(x) ,故有:

∇ x log ⁡ p ( x ∣ y ) : = s ( ∇ x log ⁡ p ( x ∣ y ) − ∇ x log ⁡ p ( x ) ) + ∇ x log ⁡ p ( x ) (5) \nabla_{\mathrm{x}} \log p(\mathrm{x}|y) := s (\nabla_{\mathrm{x}} \log p(\mathrm{x}|y) - \nabla_{\mathrm{x}} \log p(\mathrm{x}) ) + \nabla_{\mathrm{x}} \log p(\mathrm{x}) \tag{5} xlogp(xy):=s(xlogp(xy)xlogp(x))+xlogp(x)(5)

stable diffusion代码路径:https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py#L1019

当有negative prompt作为condition时,此时的condition为两项,一项是 y y y: positive prompt condition,另一项为 n o t y ~ \mathrm{not} \, \tilde{y} noty~:negative prompt condition。

只要得到 ∇ x log ⁡ p ( x ∣ y , n o t y ~ ) \nabla_{\mathrm{x}} \log p(\mathrm{x}|y, \mathrm{not} \, \tilde{y}) xlogp(xy,noty~)我们就可以参考之前的采样算法生成样本。重新直接训练一个score based model来估计 ∇ x log ⁡ p ( x ∣ y , n o t y ~ ) \nabla_{\mathrm{x}} \log p(\mathrm{x}|y, \mathrm{not} \, \tilde{y}) xlogp(xy,noty~)当然可行,但成本巨大。下面来看如何进行简化[1,2]

p ( x ∣ y , n o t y ~ ) = p ( x , y , n o t y ~ ) p ( y , n o t y ~ ) = p ( y , n o t y ~ ∣ x ) p ( x ) p ( y , n o t y ~ ) = 在 x 条件下 y 与 n o t y ~ 独立 p ( y ∣ x ) p ( n o t y ~ ∣ x ) p ( x ) p ( y , n o t y ~ ) ∝ p ( x ) p ( y , n o t y ~ ) p ( y ∣ x ) p ( y ~ ∣ x ) ⇒ ∇ x log ⁡ p ( x ∣ y , n o t y ~ ) ∝ ∇ x log ⁡ p ( x ) + ∇ x log ⁡ p ( y ∣ x ) − ∇ x log ⁡ p ( y ~ ∣ x ) (6) \begin{aligned} p(\mathrm{x}|y, \mathrm{not}\, \tilde{y} ) & = \frac{p(\mathrm{x},y, \mathrm{not}\, \tilde{y})}{p(y, \mathrm{not}\, \tilde{y})} \\ &= \frac{p(y, \mathrm{not}\, \tilde{y}|\mathrm{x})p(\mathrm{x})}{p(y, \mathrm{not}\, \tilde{y})} \\ & \stackrel{在x条件下y与\mathrm{not} \, \tilde{y}独立}= \frac{p(y|\mathrm{x})p(\mathrm{not}\, \tilde{y}|\mathrm{x})p(\mathrm{x})}{p(y,\mathrm{not}\, \tilde{y})} \\ & \propto \frac{p(\mathrm{x})}{{p(y,\mathrm{not}\, \tilde{y})}} \frac{p(y|\mathrm{x})}{p(\tilde{y}|\mathrm{x})} \\ \Rightarrow \nabla_{\mathrm{x}} \log p(\mathrm{x}|y, \mathrm{not}\, \tilde{y} ) & \propto \nabla_{\mathrm{x}} \log p(\mathrm{x}) + \nabla_{\mathrm{x}} \log p(y|\mathrm{x}) - \nabla_{\mathrm{x}} \log {p(\tilde{y}|\mathrm{x})} \end{aligned} \tag{6} p(xy,noty~)xlogp(xy,noty~)=p(y,noty~)p(x,y,noty~)=p(y,noty~)p(y,noty~x)p(x)=x条件下ynoty~独立p(y,noty~)p(yx)p(noty~x)p(x)p(y,noty~)p(x)p(y~x)p(yx)xlogp(x)+xlogp(yx)xlogp(y~x)(6)

由于:

∇ x log ⁡ p ( y ∣ x ) = ∇ x log ⁡ p ( x ∣ y ) − ∇ x log ⁡ p ( x ) ∇ x log ⁡ p ( y ~ ∣ x ) = ∇ x log ⁡ p ( x ∣ y ~ ) − ∇ x log ⁡ p ( x ) (7) \begin{aligned}\nabla_{x} \log p(y|\mathrm{x}) = \nabla_{x} \log p(\mathrm{x}|y) - \nabla_{\mathrm{x}} \log p(\mathrm{x}) \\ \nabla_{\mathrm{x}} \log p(\tilde{y}|\mathrm{x}) = \nabla_{x} \log p(\mathrm{x}|\tilde{y}) - \nabla_{\mathrm{x}} \log p(\mathrm{x}) \end{aligned} \tag{7} xlogp(yx)=xlogp(xy)xlogp(x)xlogp(y~x)=xlogp(xy~)xlogp(x)(7)

s + s^{+} s+为positive prompt condition的guidance scale, s − s^{-} s为negative prompt的guidance scale,有

∇ x log ⁡ p ( x ∣ y , n o t y ~ ) : = ∇ x log ⁡ p ( x ) + s + ( ∇ x log ⁡ p ( x ∣ y ) − ∇ x log ⁡ p ( x ) ) − s − ( ∇ x log ⁡ p ( x ∣ y ~ ) − ∇ x log ⁡ p ( x ) ) (8) \nabla_{\mathrm{x}} \log p(\mathrm{x}|y, \mathrm{not}\, \tilde{y} ) := \nabla_{\mathrm{x}} \log p(\mathrm{x}) + s^{+}(\nabla_{x} \log p(\mathrm{x}|y) - \nabla_{\mathrm{x}} \log p(\mathrm{x})) - s^{-} (\nabla_{x} \log p(\mathrm{x}|\tilde{y}) - \nabla_{\mathrm{x}} \log p(\mathrm{x})) \tag{8} xlogp(xy,noty~):=xlogp(x)+s+(xlogp(xy)xlogp(x))s(xlogp(xy~)xlogp(x))(8)

通过式(8)可以得出,我们只需计算 ∇ x log ⁡ p ( x ) \nabla_{\mathrm{x}} \log p(\mathrm{x}) xlogp(x) ∇ x log ⁡ p ( x ∣ y ) \nabla_{x} \log p(\mathrm{x}|y) xlogp(xy) ∇ x log ⁡ p ( x ∣ y ~ ) \nabla_{x} \log p(\mathrm{x}|\tilde{y}) xlogp(xy~)三项即可估计出 ∇ x log ⁡ p ( x ∣ y , n o t y ~ ) \nabla_{\mathrm{x}} \log p(\mathrm{x}|y, \mathrm{not}\, \tilde{y} ) xlogp(xy,noty~)

1 − s + + s − = 0 1 - s^{+} + s^{-} = 0 1s++s=0时, s − = s + − 1 s^{-} = s^{+} - 1 s=s+1

∇ x log ⁡ p ( x ∣ y , n o t y ~ ) = s + ∇ x log ⁡ p ( x ∣ y ) − ( s + − 1 ) ∇ x log ⁡ p ( x ∣ y ~ ) = ∇ x log ⁡ p ( x ∣ y ~ ) + s + ( ∇ x log ⁡ p ( x ∣ y ) − ∇ x log ⁡ p ( x ∣ y ~ ) ) (9) \begin{aligned} \nabla_{\mathrm{x}} \log p(\mathrm{x}|y, \mathrm{not}\, \tilde{y} ) &= s^{+}\nabla_{x} \log p(\mathrm{x}|y) - (s^{+} - 1)\nabla_{x} \log p(\mathrm{x}|\tilde{y}) \\ & = \nabla_{x} \log p(\mathrm{x}|\tilde{y}) + s^{+}(\nabla_{x} \log p(\mathrm{x}|y) - \nabla_{x} \log p(\mathrm{x}|\tilde{y})) \end{aligned} \tag{9} xlogp(xy,noty~)=s+xlogp(xy)(s+1)xlogp(xy~)=xlogp(xy~)+s+(xlogp(xy)xlogp(xy~))(9)

式(9) 就是stable diffusion源码中实现形式

源码位置位于(diffuser版本v0.29.1): https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py#L427

文献[3]通过“Neutralization Hypothesis”,“Reverse Activation”解释negative prompt conditioning的工作机制,感兴趣的同学可以后续阅读。

When do negative prompt take effect

定性分析

上文我们通过理论推导证明了negative prompt conditioning的可行性。本节将从可视化的角度分析negative prompt conditioning是如何影响图片生成的。主要文献参考[3]

类似Prompt-to-prompt[4]的研究思路,我们可以绘制不同时间步token-wise attention map热力图。从图中发现,negative prompt作用存在一定延迟。positive prompt conditioning在生成的早期(t=0-3)时就关注到对应的区域,而negative prompt conditioning直到t=8-11才能正确关注到对应的区域。

在这里插入图片描述

定量分析

进一步的,为了定量的描述上述机制,文献[3]定义了 r t r_t rt为negative prompt conditioning的强度

r t = Σ k ∥ F k , p − ( i ) ( t ) ∥ F Σ k ∥ F k , p + ( r ( i ) ) ( t ) ∥ F (10) r _ { t } = \frac { \Sigma _ { k } \| F _ { k , p _ { - } ( i ) } ^ { ( t ) } \| _ { F } } { \Sigma _ { k } \| F _ { k , p _ { + } ( r ( i ) ) } ^ { ( t ) } \| _ { F } } \tag{10} rt=ΣkFk,p+(r(i))(t)FΣkFk,p(i)(t)F(10)

假设:Positive prompt: Pofessional office woman. Negative prompt: Glasses

p _ p_{\_} p_: 表示negative prompt

p + p_{+} p+: 表示positive prompt

p _ ( i ) p_{\_ }(i) p_(i):表示negative prompt第 i i i个索引处的token

p + ( r ( i ) ) p_{+}(r(i)) p+(r(i)):表示positive prompt p + p_{+} p+中与 p _ ( i ) p_{\_ }(i) p_(i)最相关的token。 p _ ( i ) p_{\_ }(i) p_(i)=”Glasses”, 那么 p + ( r ( i ) ) p_{+}(r(i)) p+(r(i))=“woman”。

F k , p _ ( i ) t F_{k, p_{\_ (i)}}^{t} Fk,p_(i)t: 在时间步为t时,在第k层cross-attention处token p _ ( i ) p_{\_ }(i) p_(i)对应的attention map。

F k , p + ( r ( i ) ) t F_{k, p_{+}(r(i))}^{t} Fk,p+(r(i))t: 在时间步为t时,在第k层cross-attention处token p + ( r ( i ) ) p_{+}(r(i)) p+(r(i))对应的attention map。

r t r_t rt越小时,说明negative prompt conditioning的强度越小,反之越大。

选择了10对相应的提示对,10个不同的随机种子上进行实验,并绘制 ( r t , t ) (r_t, t) (rt,t)曲线如下:

在这里插入图片描述

从上图不难得出:

  • negative prompt conditioning的强度初始较弱,在时间步为5-10时达到峰值。
  • 当negative prompt 为名词时, r t r_t rt呈先增强后降低趋势,这是由于当negative prompt作用后,会移除生成图片中的对应实体,从而让token-wise attention map的响应变弱。
  • 当negative prompt 为形容词时, r t r_t rt呈先增强后稳定。

即然negative prompt conditioning存在滞后性,可以在初始阶段(t=0-5)不引入negative prompt conditioning,之后在引入,这能起到类似局部编辑的效果。

在这里插入图片描述

小结

本文相对系统探讨了diffusion model中negative prompt conditioning的工作机理,解释了stable diffusion关于negative prompt conditioning源码实现的合理性(式9),并给出了更一般的形式(式8)。

参考文献

[1] Compositional Visual Generation with Energy Based Models

[2] Compositional Visual Generation with Composable Diffusion Models

[3]Understanding the Impact of Negative Prompts: When and How Do They Take Effect?

[4]http://myhz0606.com/article/p2p

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/37111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SANGFOR深信服配置短信验证全流程

登录管理平台: 打开浏览器,输入管理平台地址(例如:http://192.168.0.1)。输入管理员账号和密码,点击“登录”。 配置认证策略: 导航到“认证” -> “认证策略”。点击“新建策略”。选择“验…

如何评估CRM客户系统的功能是否满足助贷机构的需求?

评估 CRM 客户系统的功能是否满足助贷机构的需求,可以从以下几个方面入手: 1. 客户信息管理 - 检查系统能否全面、准确地记录客户的基本信息,如个人身份、财务状况、贷款需求等。 - 确认是否支持多维度的客户分类和标签功能,以…

《妃梦千年》第十四章-第十五章:重重困局,风云再起

第十四章:重重困局 林清婉和皇上的关系日益亲密,但宫中的局势却依然复杂多变。一天夜里,林清婉正在寝宫中思考未来的对策,忽然接到一个紧急消息。小翠匆匆跑来,神色紧张:“娘娘,边疆的将军送来…

LeetCode:经典题之876、143 题解及延伸

系列目录 88.合并两个有序数组 52.螺旋数组 567.字符串的排列 643.子数组最大平均数 150.逆波兰表达式 61.旋转链表 160.相交链表 83.删除排序链表中的重复元素 389.找不同 1491.去掉最低工资和最高工资后的工资平均值 896.单调序列 206.反转链表 92.反转链表II 141.环形链表 …

pdfmake不能设置表格边框颜色?

找到pdfmake>build>pdfmake.js中: 找到定义的“TableProcessor.prototype.drawVerticalLine”和“TableProcessor.prototype.drawHorizontalLine”两个方法: 重新定义borderColor: var borderColor this.tableNode.table.borderColor||"#…

Python:探索高效、智能的指纹识别技术(简单易懂)

目录 概括 导入库 函数一 参数: 函数二 函数三 主函数 运行结果 src: model_base 7.bmp ​编辑 总结 概括 指纹识别是一种基于人体生物特征的身份验证技术。它通过捕捉和分析手指上的独特纹路和细节特征,实现高准确度的身份识别。…

【工具测评】ONLYOFFICE8.1版本桌面编辑器测评:好用!

随着远程工作的普及和数字化办公的发展,越来越多的人开始寻找功能强大、易于使用的办公软件。在这个背景下,ONLYOFFICE 8.1应运而生,成为许多用户的新选择。ONLYOFFICE 8.1是一款办公套件软件,提供文档处理、电子表格和幻灯片制作…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-41目标检测数据集

41目标检测数据集 import os import pandas as pd import torch import torchvision import matplotlib.pylab as plt from d2l import torch as d2l# 数据集下载链接 # http://d2l-data.s3-accelerate.amazonaws.com/banana-detection.zip# 读取数据集 #save def read_data_b…

6.28U-Net深度学习基准模型特点与应用

U-Net深度学习基准模型特点与应用 U-Net是一种在深度学习领域广泛应用于图像分割任务的卷积神经网络(CNN)模型,最初由Olaf Ronneberger、Philipp Fischer和Thomas Brox在2015年的论文《U-Net: Convolutional Networks for Biomedical Image …

右键新建没有TXT文本文档的解决办法

电脑右键新建,发现没有txt了,我查网上办法都有点复杂,诸如注册表的,但是其实很简单,重启windows资源管理器就可以了。 点击重新启动,之后新建就有txt文档了。

C++20中的Feature Test Mocros

C20定义了一组预处理器宏,用于测试各种语言和库的feature。 Feature Test Mocros(特性测试宏)是C20中引入的一种强大机制,用于应对兼容性问题。Feature Test Mocros作为预处理器指令(preprocessor directives)出现,它使你能够在编译过程中仔细…

区块链的优势与挑战:为什么区块链如此重要?

区块链听起来像是一种高科技的魔法,很多人都想知道它到底是怎么回事,为什么会引起如此大的关注。今天,我们就来揭开区块链的神秘面纱,看看它的优势和挑战,顺便聊聊为什么它会变得如此重要。 优势篇 1. 去中心化&…

流水线作业模拟程序

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 流水线作业模拟 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private int Count 0;private bool IsStop false;private void uiLight1_Click(object sender, EventArgs e…

[MYSQL] MYSQL库的操作

前言 本文主要介绍MYSQL里 库 的操作 请注意 : 在MYSQL中,命令行是不区分大小写的 1.创建库 create database [if not exists] database_name [charsetutf8 collateutf8_general_ci] ...] create database 是命名语法,不可省略[if not exists] 如果不存在创建,如果存在跳过…

GESP 四级急救包(2):客观题真题集

客观题真题集 一、选择题1. 真题梳理2. 真题答案3. 重难点点播(1) 指针和地址(2) 时间复杂度 二、判断题1. 真题梳理2. 真题答案 一、选择题 1. 真题梳理 若函数声明为 void f(int &a, int b, const int &c),且在主函数内已经声明了 x , y , z x,y,z x,y,…

最新Node.js安装及配置详细教程

文章目录 下载Node.js安装Node.js配置Node.js1、修改npm包的全局安装路径和缓存路径2、环境变量设置3、镜像源配置4、安装其他包管理工具 下载Node.js 下载:https://nodejs.org/en/download/prebuilt-installer,下载LTS版本的,LTS(Long Time…

代码随想录算法训练营day67 | 110.字符串接龙、105. 有向图的完全可达性、106. 岛屿的周长

本次题目全部来自卡码网 110.字符串接龙 本题只需要求出最短路径的长度就可以了,不用找出具体路径。 所以这道题要解决两个问题: 图中的线是如何连在一起的起点和终点的最短路径长度 首先题目中并没有给出点与点之间的连线,而是要我们自…

驼峰命名法在编程中的应用

驼峰命名法在编程中的应用 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!驼峰命名法(Camel Case)是一种常见的命名约定,在编…

IPython “%%script“ 魔法命令:跨平台脚本执行指南

IPython是一个强大的交互式Python解释器,提供了许多增强功能来提高开发效率。其中,%%script魔法命令是一个非常有用的特性,它允许用户在IPython环境中执行外部脚本。本文将详细介绍%%script命令的使用方法,包括其基本概念、使用场…

前端 JS 经典:函数签名

函数签名是什么?函数签名 函数名 参数 返回类型。 当我们明确了这 3 样东西,那么这个函数的作用和用法就确定了,它内部怎么实现的,我们完全不用管。 如下,我们知道这是一个判断属性是否对象的函数,只需…