2022IJCAI“My nose is running.” “Are you also coughing?”:Building a Medical Diagnosis Agent with Interpretable Inquiry Logics

Abstract:

随着远程医疗的兴起,发展医疗诊断对话系统(DSMD)的任务近年来受到了广泛的关注。与早期需要依赖额外的人力资源和专业知识来帮助构建系统的研究不同,最近的研究集中在如何以纯数据驱动的方式构建DSMD。然而,以往数据驱动的DSMD方法存在两个问题:

  • 忽略了系统的可解释性,对话诊断的可解释性对于医疗应用至关重要,

  • 存在数据稀疏性的问题,可用的训练数据少

本文探讨了如何向数据驱动的DSMD引入可解释性。提出了一个可解释的决策过程,通过合理地模拟真实医生的查询逻辑实现了DSMD的对话管理模块,并设计了一个具有高度透明组件的模型来进行推理。此外,还收集了一个新的DSMD数据集,它比现有的数据集具有更大的规模,更多样化的模式,质量也更高。实验结果表明,该方法在三个数据集上的诊断准确率分别得到了7.7%、10.0%和3.0%的绝对提高,证明了其合理决策过程和模型设计的有效性。

代码链接:https://github.com/lwgkzl/BR-Agent

论文链接:https://arxiv.org/pdf/2204.13953.pdf

Introduction:

由于医疗资源的普遍短缺,世界各地的数百万患者正面临着疾病诊断和治疗的延误。为了使医疗咨询的过程自动化并缓解治疗压力,关于如何开发医疗诊断对话系统已经研究了几十年。通常,DSMD需要多次询问患者的症状,直到做出初步诊断。在这一研究领域中,早期的工作需要依靠额外的人力资源和专业知识来帮助构建系统,如特征工程和规则设计[Shortliffe, 1974; Pople et al., 1975;Milward and Beveridge, 2003]。直到2018年,[Wei et al. 2018]公开了从在线医疗社区收集的第一个DSMD数据集,以纯数据驱动的方式开发DSMD成为了新的研究趋势[Xu et al.,2019; Xia et al., 2020; Liao et al., 2020; He et al., 2020;Zhao et al., 2020; Liu et al., 2021; Liu et al., 2020;Lin et al., 2021]。在此之前,对话诊断模型的研究需要模拟患者的情况以测试系统性能,而不是使用直接从真实患者的病例中收集的数据。

然而,虽然避免了依赖额外的人力资源来构建系统,但数据驱动的方法在很大程度上忽略了系统的可解释性,之前很多基于数据驱动的对话诊断研究都使用黑盒神经网络实现对话管理,并直接生成所有可能行为的概率分布,即同时进行疾病推断和症状选择。这种决策过程的可解释性非常弱,它们的模型组件也缺乏足够的透明度。为此,本文提出了一个更可解释的两阶段决策过程,通过合理地模拟真实的医生的咨询逻辑,来实现对话管理。本文认为分别构建疾病推理及症状选择模块要比将两者放在一个模块效果更好(深以为然)

具体来说,在每个对话回合中,系统应该首先根据当前的症状信息推断患者可能患的疾病。如果最可疑的疾病达到一个置信阈值,则会给出诊断结果;否则,它将根据疾病估计进一步查询症状。这就像在真正的会诊场景中一样,医生只因为怀疑有特定疾病而询问症状,而不是直接基于已知的症状。此外,对于症状的选择,本文总结了有两种选择逻辑:查询一种症状,一是确保对一种疾病的怀疑,二是区分相似的疾病

本文提出了一个具有高度透明组件的模型来进行上述决策过程,名为贝叶斯增强代理(BR-Agent)。它包括一个用于疾病推断的贝叶斯网络和两个矩阵,分别模拟两种症状选择逻辑,并由一个逻辑切换器控制。它们的参数都是有实际意义的。例如,BayesNet中的参数要么是疾病的先验概率,要么是特定疾病-症状的条件概率。

由于缺乏回合级监督标签,BR-Agent通过考虑症状召回和诊断准确性的长期强化奖励进行优化。BRAgent中的BayesNet也通过RL的梯度与其他组件端到端进行训练,这与医学领域其他BayesNet应用的学习范式不同。在以往的研究中,BayesNet的参数通常是借助专家知识或使用统计估计方法来确定的。即使当以深度学习的方式将贝叶网与其他神经网络相结合时,贝叶网的参数也可以使用更传统的方法单独学习,而不是像本文提到的从末端训练其他组件。

Perliminaries:

对话诊断系统一般由NLU、DM、NLG几部分组成。在每个交互步,NLU从对话中提取目前已知的症状,DM要么选择一种疾病作为诊断结果并完成对话,要么选择另一个症状进行查询,DM的输出通过NLG变为更合理的自然语言。在本文中,同之前的对话诊断模型一样,只关注DM部分。由于患者对症状的叙述方式相对固定,因此NLU可以使用基于规则的方法;且对话诊断系统不怎么关注回复的多样性和生动,所以NLG可以使用基于模板的方式。

对于DM,其输入为从对话上下文中得到的症状的表示,输出为要查询的症状或诊断的疾病。若对话诊断系统考虑NNN个症状、MMM种疾病,则每轮对话第ttt步DM的输入为st∈RNs_t∈R^Nst​∈RN,表示当前获得的患者症状知识。其中sts_tst​的每一维表示一个症状,且从{1,−1,0}\{1,-1,0\}{1,−1,0}中取值(1表示患者有这个症状,-1表示患者没有这个症状,0表示患者不确定)。DM输出的动作空间大小为M+NM+NM+N。

Methodology:

DM部分(BR-Agent)由贝叶斯网络构成的疾病推理和使用一个神经逻辑转换器、两个模拟不同问询逻辑的逻辑矩阵症状查询两部分组成,并基于强化学习对两部分进行训练。

在每轮对话第ttt时间步,给定患者症状信息sts_tst​,BR-Agent中的贝叶斯网络首先会推断患者的患病概率PDP_DPD​。如果最可能的疾病概率(PDP_DPD​中的最大值)超过了阈值εd\varepsilon_dεd​或者ttt到达了最大回合步数TmaxT_{max}Tmax​(之前的模型到达最大回合步时若输出动作仍是症状,也不会直接诊断疾病并结束),DM返回诊断结果。否则模型将会使用一个神经逻辑转换器和两个模拟不同问询逻辑的逻辑矩阵预测在下一次响应PSP_SPS​中最需要查询的症状(概率高的疾病对应的症状被查询的概率也应该大(不一定),是有相关性在的,如何正确建模这种相关性呢?——文中使用条件概率矩阵)。

Disease Inference

BR-Agent通过贝叶斯网络进行疾病推理,其由一个双向二部图G=(V,ζ)G=(V,\zeta)G=(V,ζ)构成,节点集合VVV由疾病节点D={Di∣i=1,2,...,M}D=\{D_i|i=1,2,...,M\}D={Di​∣i=1,2,...,M}和症状节点S={Sj∣j=1,2,...,N}S=\{S_j|j=1,2,...,N\}S={Sj​∣j=1,2,...,N}构成,边集合ζ\zetaζ由疾病-症状对在语料库(什么语料库?电子病历?对话数据)中出现的共现频次计算得到。具体的,当疾病节点DiD_iDi​与症状节点SjS_jSj​的共现频次大于给定阈值ϵe\epsilon_eϵe​时,图中有一条边由DiD_iDi​指向SjS_jSj​。症状节点SjS_jSj​的父集合由所有指向该节点的疾病节点组成,表示所有可能引起该症状的疾病集合,由Parents(Sj)Parents(S_j)Parents(Sj​)构成。

对于贝叶斯网络的参数学习(贝叶斯网络参数学习我没了解过,实在不懂,先复述文中的话,以后明白了再加自己的理解),本文借鉴[Chen et al., 2020]提到的方法进行初始化,而后在端到端RL训练中使用其他组件对它们进行微调。在贝叶斯网络θBN\theta_{BN}θBN​中有两种参数,一个是疾病Di(i=1,2,...,M)D_i(i=1,2,...,M)Di​(i=1,2,...,M)的先验概率P(Di)P(D_i)P(Di​),通过数据集中疾病发生的次数进行初始化。另一种是在相关疾病发生情况下产生某种症状的条件概率P(Si∣Di+,Di−)P(S_i|D_i^+,D_i^-)P(Si​∣Di+​,Di−​),其中Di+D_i^+Di+​为患者有的疾病集合,Di−D_i^-Di−​为患者没有的疾病集合,且Parents(Si)=Di+∪Di−Parents(S_i)=D_i^+∪D_i^-Parents(Si​)=Di+​∪Di−​。在本文使用的数据集中,对一个患者的诊断只包括一种疾病,并且假设该患者没有任何其他未提及的疾病。因此,如果∣Di+∣=1|D_i^+|=1∣Di+​∣=1只有一个元素,我们就可以根据症状和疾病的共现关系计算上述概率。对于其他情况,使用随即猜测0.5进行初始化。参数P(Si∣Di+,Di−)P(S_i|D_i^+,D_i^-)P(Si​∣Di+​,Di−​)的初始值计算如下:
P(Si∣Di+,Di−)={n(Si,Di+)/n(Di+)if∣Di+∣=10.5else.P(S_i|D_i^+,D_i^-)=\begin{cases}n(S_i,D_i^+)/n(D_i^+) \qquad if |D_i^+|=1 \\ \\ 0.5 \qquad\qquad\qquad\qquad else. \end{cases} P(Si​∣Di+​,Di−​)=⎩⎨⎧​n(Si​,Di+​)/n(Di+​)if∣Di+​∣=10.5else.​
其中n(Di+)n(D_i^+)n(Di+​)是数据集中存在疾病Di+D_i^+Di+​的患者数量,n(Si,Di+)/n(Di+)n(S_i,D_i^+)/n(D_i^+)n(Si​,Di+​)/n(Di+​)为患者存在症状SiS_iSi​、疾病Di+D_i^+Di+​,不存在疾病Di−D_i^-Di−​的数量。

在初始化后,贝叶斯网络所有的参数θBN\theta_{BN}θBN​会在对话管理组件端到端训练时进行微调。给定贝叶斯网络以及状态sts_tst​中观测到的积极症状S+S^+S+及消极症状S−S^-S−的集合,就可以通过变量消除算法(Variable Elimination, VE)计算疾病的分布PD=P(D∣S+,S−)=VE(S+,S−;θBN)P_D=P(D|S^+,S^-)=VE(S^+,S^-;\theta_BN)PD​=P(D∣S+,S−)=VE(S+,S−;θB​N)。本质上,给定观测到的症状,VE可以将未观测到的症状Su=S/(S+∪S−)S^u=S/(S^+∪S^-)Su=S/(S+∪S−)边缘化,并求得观测症状条件下的疾病的概率分布。由于VE的计算过程是可微的,因此在对话管理中其他模型组件进行端到端训练中,可以使用PDP_DPD​上的梯度来更新贝叶斯网络参数θBN\theta_{BN}θBN​。

Symptom Selection

为进行症状选择,本文使用两个向量来模拟现实医生的两种问询逻辑:一个条件概率向量Mc∈RM×NM_c∈R^{M×N}Mc​∈RM×N(确保对一种特定疾病的怀疑),一个用来区分两个相似疾病的互信息向量Mm∈RM×NM_m∈R^{M×N}Mm​∈RM×N。(最近读到的论文很多提到互信息,有机会写一篇相关介绍)条件概率向量中的元素Mc(i,j)M_c(i,j)Mc​(i,j)表示给定疾病DiD_iDi​条件下症状SjS_jSj​的概率:
Mc(i,j)=P(Sj∣Di)=n(Di,Sj)/∑k=1Nn(Di,Sk)M_c(i,j)=P(S_j|D_i)=n(D_i,S_j)/\sum_{k=1}^N n(D_i,S_k) Mc​(i,j)=P(Sj​∣Di​)=n(Di​,Sj​)/k=1∑N​n(Di​,Sk​)
其中n(Di,Sj)n(D_i,S_j)n(Di​,Sj​)为患者同时存在疾病DiD_iDi​和症状SjS_jSj​的对话数量。

互信息向量中的元素Mm(i,j)M_m(i,j)Mm​(i,j)表示疾病DiD_iDi​华人症状SjS_jSj​之间的交互信息:
Mm(i,j)=I(Di;Sj)=∑k1∑k2P(Di=k1,Sj=k2)⋅log(P(Di=k1,Sj=k2)P(Di=k1)P(Sj=k2))M_m(i,j)=I(D_i;S_j)=\sum_{k_1}\sum_{k_2}P(D_i=k_1,S_j=k_2)\cdot log(\frac{P(D_i=k_1,S_j=k_2)}{P(D_i=k_1)P(S_j=k_2)}) Mm​(i,j)=I(Di​;Sj​)=k1​∑​k2​∑​P(Di​=k1​,Sj​=k2​)⋅log(P(Di​=k1​)P(Sj​=k2​)P(Di​=k1​,Sj​=k2​)​)
其中k1k_1k1​和k2k_2k2​分别为疾病DiD_iDi​和症状SjS_jSj​的可能值集。k1,k2∈{0,1}k1,k2∈\{0,1\}k1,k2∈{0,1},其中0代表不存在,1代表存在。

条件概率矩阵倾向于查询与疑似疾病同时出现的频繁症状。然而,一些症状在许多疾病中可能是常见的,如症状“发烧”,因此不能用来区分它们。另一方面,互信息度量疾病DiD_iDi​和症状SjS_jSj​之间的联系,表明症状SjS_jSj​是否可以用来区分DiD_iDi​和其他疾病,即便症状SjS_jSj​是一个低频的症状,只要其与疑似疾病的联系较强,就可以进行询问。这两个矩阵都沿着行轴进行了归一化处理。

为了确定哪种症状查询逻辑更适合当前的回合,采用多层感知器(MLP)计算权重因子µ∈[0,1]µ∈[0,1]µ∈[0,1]以融合两个矩阵的预测结果,得到最终结果PSP_SPS​:
μ=Sigmoid(MLP(st;PD)),\mu=Sigmoid(MLP(s_t;P_D)), μ=Sigmoid(MLP(st​;PD​)),
Ps=μPD⋅Mc+(1−μ)PD⋅MmP_s=\mu P_D\cdot M_c+(1-\mu)P_D\cdot M_m Ps​=μPD​⋅Mc​+(1−μ)PD​⋅Mm​

RL Training Framework

模型使用强化学习算法Advantage Actor Critic(A2C)算法进行训练。A2C算法包括一个生成动作的actor,一个基于动作更新当前状态并生成奖励的enviroment,以及一个评估当前状态的价值的critic。价值函数通过估计“优势”(估计的奖励和行动后获得的实际奖励之间的差异)来训练actor。在本文,状态为sts_tst​,即当前已知的症状信息;actor为对话管理模块;交互的环境为用户模拟器;通过MLP构建critic的值函数v(st;θv)v(s_t;\theta_v)v(st​;θv​),并通过时序差分度量“优势”:δt=rt+γv(st+1;θv)−v(st;θv)\delta_t=r_t+\gamma v(s_{t+1};\theta_v)-v(s_t;\theta_v)δt​=rt​+γv(st+1​;θv​)−v(st​;θv​)。

策略决策及值评估部分的参数θπ\theta_\piθπ​、θv\theta_vθv​分别通过以下公式进行更新:
θπ←θπ+β1⋅δt⋅∇θπlnπ(at∣st;θπ)+β2⋅H(π(at∣st;θπ)θ_π ← θ_π + β_1 · δ_t · ∇_{θ_π}ln π(a_t|s_t; θ_π) + β_2 · H(π(a_t|s_t; θ_π) θπ​←θπ​+β1​⋅δt​⋅∇θπ​​lnπ(at​∣st​;θπ​)+β2​⋅H(π(at​∣st​;θπ​)
θv←θv+α⋅δt⋅∇θvv(st;θv)θ_v ← θ_v + α · δ_t · ∇_{θ_v} v(s_t; θ_v) θv​←θv​+α⋅δt​⋅∇θv​​v(st​;θv​)
其中β1β_1β1​、β2β_2β2​和ααα是超参数,H(⋅)H(·)H(⋅)是鼓励政策探索的熵正则化项。通过这种方式,策略决策中的贝叶斯网络参数也会与其他组件一起进行微调。

Dataset Construction

本文除使用已公开标注数据集Muzhi [Wei et al., 2018]和Dxy[Xu et al., 2019]外还构建了自己的数据集GMD-12,该数据集从17000份电子病历中获得,包括12种疾病及118个症状。为评估三个数据集的数据质量,聘请3名有两年以上咨询经验的医生对每个数据集200个样本的合理性评分。合理性评分为0-2分(最佳评分为2分),GMD-12的理性得分最高,即从专业的角度来看,它的质量较好。

Experiments

实验结果评估:诊断的准确性和对症状的召回率。症状召回率是由对话代理成功查询患者症状的平均比例,衡量了药剂收集患者信息的效率。

对比实验:考虑的baseline有Basic DQN [Wei et al., 2018] 、A2C-GCN [Kipf and Welling,2017]、Sequicity [Lei et al., 2018] 、KR-DS [Xu et al., 2019]、GAMP [Xia et al., 2020]。

消融实验:考虑疾病推理的贝叶斯网络,症状检查的条件概率向量和互信息向量,在消融实验过程中使用MLP代替。

Analysis of Interpretability

在应用过程中,人们可以很容易地分析BR-Agent如何得出每个回合的决策。例如,可以通过调查贝叶斯网络中的疾病评估及逻辑转换器的查询逻辑解释为什么询问特定的症状。同时,贝叶斯网络的参数和两个过渡矩阵都是有意义的,从其中可以推断出某个疾病的先验概率或者给出特定疾病后症状的条件概率。

Case Study of the Decision Process.

图4展示了两个对话步中BR-Agent策略决策的学习案例。在症状查询过程中,逻辑切换器产生的权重µµµ等于0.7,说明条件概率矩阵主导了当前的查询逻辑。为了确定怀疑的疾病(肺炎),BR-Agent检查其典型症状的肺鼻音。经过询问,肺炎概率的估计从0.49增加到0.97,大于设定的阈值,因而做出最终的诊断。

(图中数据如何计算得出还没算出来)

Human Evaluation of the Decision Process.

本文从专业角度对所提模型的合理性进行了评分。具体了,找了两名临床专业对症状查询及疾病诊断过程进行了评估。

Analysis of the Neural Logic Switcher and Two Matrices.

为了更清楚地说明BR-Agent中两个矩阵的不同症状查询逻辑,在图3中给出了一个案例研究。在进行症状调查之前,该系统高度怀疑自己患有手足口病(HFMD)和上呼吸道感染(URI)。从两个矩阵数值中可以看出,条件概率矩阵倾向于询问高度频繁的症状“发热”。然而,“发烧”是HFMD和URI的常见症状,所以查询“发烧”不能排除/确认其中的任何一种疾病。而互信息能够考虑相对较低频率的症状“疱疹”,因为它是HFMD的典型症状,该症状可以用来有效区分这两种疾病。在本例中,神经逻辑转换器生成µ=0.3µ= 0.3µ=0.3,互信息矩阵占主导地位。所以,系统会询问“疱疹”这一症状。且确认该症状后,系统对HFMD诊断结果的置信度达到了96%。

Conclusion

本文中可解释的数据驱动的对话诊断模型进行了初步尝试。提出了一种具有可解释决策过程和透明组件的新框架,**该框架由一个用于疾病推断的贝叶斯网和两个用于模拟人类医生的症状查询逻辑的矩阵组成,并由一个神经逻辑转换器控制。**本文还构建了一个大型的对话诊断数据集来缓解数据的稀疏性问题。

这篇文章确实不错,所提出的方法可解释性很强,计算方法也比较容易理解。很值得一看。

参考文献:

[Shortliffe, 1974] Edward H. Shortliffe. MYCIN: A rule based computer program for advising physicians regarding antimicrobial therapy selection. In Roger C. Brown and Donald E. Glaze, editors, Proc. of the ACM Annual Confer ence, page 739. ACM, 1974.

[Pople et al., 1975] Harry E. Pople, Jack D. Myers, and Randolph A. Miller. DIALOG: A model of diagnostic logic for internal medicine. In Proc. of IJCAI, pages 848–855, 1975.

[Milward and Beveridge, 2003] David Milward and Martin Beveridge. Ontology-based dialogue systems. In Proc. of IJCAI, pages 9–18. Citeseer, 2003.

[Chen et al., 2020] Jun Chen, Xiaoya Dai, Quan Yuan, Chao Lu, and Haifeng Huang. Towards interpretable clinical diagnosis with bayesian network ensembles stacked on entity-aware cnns. In Proc. of ACL, pages 3143–3153, 2020.

[Wei et al., 2018] Zhongyu Wei, Qianlong Liu, Baolin Peng, Huaixiao Tou, Ting Chen, Xuanjing Huang, Kamfai Wong, and Xiangying Dai. Task-oriented dialogue system for automatic diagnosis. In Proc. of ACL, pages 201–207, July 2018.

[Xu et al., 2019] Lin Xu, Qixian Zhou, Ke Gong, Xiao dan Liang, Jianheng Tang, and Liang Lin. End-to-end knowledge-routed relational dialogue system for automatic diagnosis. In Proc. of AAAI, volume 33, pages 7346–7353, 2019.

[Lei et al., 2018] Wenqiang Lei, Xisen Jin, Min-Yen Kan, Zhaochun Ren, Xiangnan He, and Dawei Yin. Sequicity: Simplifying task-oriented dialogue systems with single sequence-to-sequence architectures. In Proc. of ACL, pages 1437–1447, July 2018.

[Xia et al., 2020] Yuan Xia, Jingbo Zhou, Zhenhui Shi, Chao Lu, and Haifeng Huang. Generative adversarial regularized mutual information policy gradient framework for automatic diagnosis. In Proc. of AAAI, volume 34, pages 1062–1069, 2020.

对话诊断(X)2022IJCAI-My nose is running.Are you also coughing?:Building a Medical Diagnosis Agent with相关推荐

  1. 论文综述—图神经网络用于医疗诊断的前世今生

    随着数据驱动的机器学习研究的进步,探索如何利用机器学习来分析医疗数据变得至关重要.现有方法的一个主要限制是人体生理信息的数据结构通常是不规则的和无序的,很难将这些数据网格化为易于分析处理的格式.而图表 ...

  2. 图神经网络用于医疗诊断的前世今生与未来-综述

    论文:https://arxiv.org/abs/2105.13137 随着数据驱动的机器学习研究的进步,探索如何利用机器学习来分析医疗数据变得至关重要.现有方法的一个主要限制是人体生理信息的数据结构 ...

  3. python nose(二)

    为什么80%的码农都做不了架构师?>>>    Testing with nose Writing tests is easier nose collects tests from ...

  4. 对话系统 | (3) 阿里云小蜜对话机器人背后的核心算法

    原文地址 分享嘉宾:唐呈光 阿里巴巴 算法专家 编辑整理:刘汝洲 内容来源:阿里小蜜 & DataFun AI Talk 出品社区:DataFun 阿里小蜜智能对话开发平台是智能服务事业部推出 ...

  5. 论文浅尝 | 基于动态知识图谱向量表示的对称合作对话代理的学习

    链接:https://arxiv.org/abs/1704.07130 文本研究了对称合作对话(symmetric collaborative dialogue)任务,任务中,两个代理有着各自的先验知 ...

  6. 人工神经网络在肺结核诊断中应用的研究进展

    人工神经网络在肺结核诊断中应用的研究进展 作者:胡青云 指导老师:杭诚方.李舰 摘要:结核病是一种全世界致死率极高的传染性疾病,转染性极强,可通过空气传播.该病在亚洲和非洲发病率极高,尤其是在大多数低 ...

  7. 基于机器学习的互联网医疗诊断APP设计与实现(TensorFlow框架实现的App端和Bmob后台)

    全套资料下载地址:https://download.csdn.net/download/sheziqiong/85584855?spm=1001.2014.3001.5503 摘要 如今随着科技.经济 ...

  8. 基于强化学习的医疗诊断 Inquire and Diagnose: Neural Symptom Checking Ensemble using Deep Reinforcement Learning

    将强化学习应用于医疗诊断的早期代表工作是发表在2016年人工智能领域顶级会议NIPS深度强化学习研讨会上的一篇工作(Inquire and Diagnose: Neural Symptom Check ...

  9. 深度 | 香港中文大学(深圳)张大鹏教授:生物特征识别的新进展 | CCF-GAIR 2019

    https://www.toutiao.com/i6713840784291922445/ 2019-07-15 18:51:11 不止干货,张教授演讲中还夹杂了诸多宝贵的史料 文 | 黄善清 AI ...

最新文章

  1. 软件架构自学笔记-- 畅途亿级业务日志系统演变过程
  2. apache+tomcat​现在我们实现session共享
  3. windowslive writer 发布问题
  4. 【2018/10/11完成】 ubuntu切换国内镜像源,加速apt-get下载速度
  5. 51单片机学习笔记(郭天祥版)(4)——练习、动态扫描、练习、数码管消影...
  6. 微软示例数据仓库AdventureWorksDW 与数据仓库概述
  7. Kubernetes-Service服务(十一)
  8. 7月26日见!华为Mate 20 X 5G正式官宣:国内首款5G双模手机
  9. PyTorch学习—20.模型的微调(Finetune)
  10. 深入浅出设计模式(C#/Java版)
  11. Pix4Dmapper系列教程(一):Pix4D模型成果导出OSGB并加载到CASS3D进行三维测图
  12. 技术分享 | 相较于ROS 1,ROS 2有哪些优越性?
  13. 记一次“香山杯”得WP
  14. neso n810 i7 android 4.4,NESO N810 i7平板电脑京东首发 预售超100000
  15. JS 如何将 HTML 页面导出为 PDF
  16. CTF杂项之总结(一)
  17. MySQL数据库 学习笔记 零基础入门 面试 整理
  18. 创业日志(十二) 关于怠惰
  19. 联想WIN10解决intel vt-x问题
  20. Palette基本用法

热门文章

  1. python去除字符串中表情字符
  2. Mac系统升级中途断电/关机,升级/开机失败的恢复方法
  3. 3款别出心裁的电脑软件,个个精选,让你眼前一亮
  4. 【GPLT】【2022天梯赛真题题解】
  5. 简洁大气的资源网站emlog模板
  6. EMLOG模板山河网站主题分享
  7. 【转】HDMI、DVI接口差异之解析
  8. java经典题丨有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总对数为多少?
  9. 关于计算机英语演讲ppt模板,英语演讲ppt模板(英语演讲8分钟ppt模板) 最新免费版...
  10. 新浪云、腾讯云、阿里云、百度云、谷歌云、亚马逊云的区别是什么,哪个更适合国内创业者使用?