427 日 , 2024 12:43:17
WPF and UI thread

在C# WPF(Windows Presentation Foundation)应用程序中,Dispatcher扮演着非常关键的角色,尤其是在涉及到UI线程与其他后台线程交互的场景下。理解Dispatcher的工作机制对于编写响应灵敏和高效的WPF应用程序非常重要。

UI线程和非UI线程

在WPF中,所有UI元素都必须在创建它们的线程上进行操作,这通常是主线程,也称为UI线程。这是因为UI元素不是线程安全的。因此,如果你在一个后台线程(例如,一个工作线程)中修改UI,就可能会导致程序异常或者应用程序崩溃。

Dispatcher的作用

Dispatcher是WPF中的一个类,用于管理与UI相关的线程的访问。它提供了一个同步和异步操作UI元素的机制,确保这些操作在正确的线程(UI线程)上执行。Dispatcher维护一个工作项队列,并且按照这些项被添加的顺序逐一执行它们。

使用Dispatcher

当你需要从非UI线程更新UI元素时,可以使用Dispatcher。以下是一些常用的方法:

  1. Invoke: 同步方式调用。当你需要立即执行一项操作并且等待这项操作完成时使用。这意味着Invoke将阻塞调用它的线程,直到UI操作完成。

    Application.Current.Dispatcher.Invoke(() => {
       // 更新UI的代码
       myLabel.Content = "更新完成";
    });
  2. BeginInvoke: 异步方式调用。它不会阻塞调用它的线程,允许后台线程继续执行,而UI操作将在未来某个时刻自动执行。

    Application.Current.Dispatcher.BeginInvoke(new Action(() => {
       // 更新UI的代码
       myLabel.Content = "更新完成";
    }));

Dispatcher优先级

Dispatcher允许你指定一个操作的优先级。这是通过DispatcherPriority枚举设置的,它包括Idle、Normal、Send等几个级别。例如,如果你希望某个操作在UI较闲时执行,可以使用Idle优先级:

Application.Current.Dispatcher.BeginInvoke(new Action(() => {
    // 低优先级的UI更新
}), DispatcherPriority.Idle);

总结

在WPF中,Dispatcher是处理UI线程安全的重要机制,特别是在多线程环境中。它保证了即使是从后台线程发起的,UI更新操作也能安全且有效地在UI线程上执行,避免了线程安全问题和数据竞争的问题。理解和合理使用Dispatcher是开发高效和响应快速的WPF应用的关键。

119 日 , 2024 15:19:15
python 解决循环依赖

在 Python 中,当存在循环依赖(circular import)的情况时,可以通过延迟导入(deferred import)来避免循环依赖导致的问题。上述代码片段中使用了 importlib.import_module 来实现延迟导入。

循环依赖是指两个或多个模块相互导入,形成一个环形的依赖关系。这种情况下,解释器可能会遇到问题,因为在导入其中一个模块时,它可能需要导入另一个模块,而另一个模块又需要导入第一个模块,从而形成了循环。

通过上述代码中的方式,可以将导入的动作放在函数内部,而不是模块的顶层。当模块被导入时,函数内的导入语句不会立即执行,而是在函数被调用时才执行。这样可以延迟导入的时机,避免了在模块级别进行导入,从而避免了循环依赖的问题。

def register_modules(self, **kwargs):
    # import it here to avoid circular import
    diffusers_module = importlib.import_module(__name__.split(".")[0])
    pipelines = getattr(diffusers_module, "pipelines")

在这个具体的例子中,name.split(".")[0] 获取了当前模块的父模块的名称,然后通过 importlib.import_module 来导入这个父模块。这样可以确保在模块被导入时,不会立即导入父模块,而是在函数调用时才导入,从而避免了潜在的循环依赖问题。

101 日 , 2024 11:39:14
1225 日 , 2023 19:35:39
vscode C/C++ completion and diagnostic unusally slow

很可能是因为intelli sense mode被自动更新了,vscode的c++插件有时在更新后会自动将Intelli sense mode修改为msvc,这时intellisenseEngine不能选择default模式,需要手动修改intelli sence mode为gcc,选择default engine
file
没有diagnostic的解决方法:
在.vscode/settings.json中
file

include path报错解决方法:
添加: C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt
https://github.com/microsoft/vscode-cpptools/issues/5723

使用Mingw的话include path如下设置:
file

1211 日 , 2023 18:20:02
ASR中的TR与IR

TR R@1: Targeted Recognition Rate at Rank 1

这个指标表示在对抗攻击中,攻击者成功地将原始语音样本(声音输入)误导为目标文本的概率。"TR" 表示 targeted recognition,即有意识地将语音样本识别为攻击者所选择的目标文本。"R@1" 表示在排名为1的情况下的成功率,即攻击者的目标文本在识别结果的第一个位置。

IR R@1: Untargeted Recognition Rate at Rank 1

这个指标表示在对抗攻击中,攻击者成功地将原始语音样本误导为任意(非目标)文本的概率。"IR" 表示 untargeted recognition,即攻击者不关心语音样本被识别为哪个具体文本,只要它不是原始的目标文本。同样,"R@1" 表示在排名为1的情况下的成功率,即攻击者成功将语音样本误导为非目标文本,并且这个非目标文本出现在识别结果的第一个位置。

1126 日 , 2023 16:17:38
1115 日 , 2023 15:04:42
Contrastive learning

对比学习(Contrastive Learning)是一种自监督学习的方法,其目标是通过学习数据中样本之间的相似性和差异性来学习有用的表示。在对比学习中,模型被设计为使相似的样本在嵌入空间中更接近,而不相似的样本则更远离。这种方法通常不需要显式的标签,因为相似性和差异性可以通过样本对之间的比较来定义。

对比学习的核心思想是通过最大化相似样本的相似性,同时最小化不相似样本的相似性,来学习表示。以下是对比学习的一些关键概念和方法:

正样本和负样本: 在对比学习中,每个样本都会与其他样本形成正样本对(相似样本)和负样本对(不相似样本)。正样本对是同一样本的不同视图或增强版本,而负样本对是来自不同样本的样本。

损失函数: 对比学习通常使用一种损失函数,如对比损失(Contrastive Loss)或三元组损失(Triplet Loss)。对比损失基于正样本对和负样本对之间的相似性度量,通过最大化正样本对的相似性和最小化负样本对的相似性来训练模型。

样本增强: 为了增加模型的鲁棒性和泛化能力,对比学习通常会使用样本增强技术。这包括对输入数据进行随机变换、旋转、裁剪等,以生成正样本对。

自监督学习: 对比学习是自监督学习的一种形式,因为它不依赖外部标签,而是从数据本身学习表征。自监督学习的目标是通过自动生成标签或任务,从而使模型能够学到有意义的表示。

对比学习在计算机视觉、自然语言处理等领域取得了显著的成功。例如,图像对比学习可用于学习图像表示,而文本对比学习则可用于学习文本表示。一些流行的对比学习方法包括基于孪生网络(Siamese Network)的方法、具有自注意力机制的Transformer模型等。这些方法在预训练后可以用于下游任务,如图像分类、目标检测和语义分割。

1115 日 , 2023 10:00:33
NMS

IOU

file
IoU 的全称为交并比(Intersection over Union),通过这个名称我们得出 IoU 的计算方法。IoU 计算的是 “预测的边框” 和 “真实的边框” 的交集和并集的比值。在目标检测任务中,IoU成为一个衡量预测的检测框的准确度的一个重要计算指标。包括目标检测中的AP和mAP的指标,都是依据IoU的计算来实现的。
对于任意的检测框,设定两个框的IoU阈值作为两者是否合并的评判依据,并执行NMS操作来删除冗余的检测框

NMS(non_max_suppression)

在预测任务中,会出现很多冗余的预测框,就拿简单的行人检测任务来说. 可以看出行人检测有很多的冗余,通过NMS操作可以有效的删除冗余检测的结果。非极大值抑制(NMS)顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。

例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。

1115 日 , 2023 9:55:08
End-to-end Learning

端到端学习指的是深度学习模型中,所有参数或原先几个步骤需要确定的参数被联合学习,而不是分步骤学习。预训练、特征工程等工作也可以在端到端的一个神经网络中直接完成。端到端学习的不足,就是一个步骤承担了更多的工作,那么可以思考:神经网络的解释性是否会受到影响?在调试过程中,确定模型的问题是否会更加困难?一个网络的参数如果增多了,取得好的训练结果是否更加困难?
非端到端学习的例子,例如将一个 NLP 任务拆分为分词、词性标注、句法分析、语义分析等多个独立步骤;CV 中先确定候选框、然后进行目标检测和识别;每个步骤是一个独立的任务,其训练结果会影响到下一步骤,从而影响整个模型的结果。

1112 日 , 2023 16:26:57
Download files from ondrive via Bash

在科研中经常需要clone现有的工作做复现,这时候免不了需要通过onedrive等途径从云盘上下载数据集或者模型,一般的通过Onedrive分享的文件可以通过点击下载后的下载链接直接wget,而如果是需要下载一个共享的文件夹中的内容,直接对下载链接使用wget就行不通了。
这时候需要打开开发者工具,点击下载,观察network tab中的条目,找到对应的条目,右键 -> 复制cURL,然后粘贴到终端或者shell脚本中,手动补充上--output指定下载文件名称,即可成功下载。

1110 日 , 2023 19:54:30
1110 日 , 2023 9:31:04
Windows转跳上一级

之前很依赖通过鼠标侧键实现对上一级的转跳,不但可以在浏览器中便捷返回,重要的是可以在大部分IDE或者文本剪辑器中实现转跳definition后的返回,但是之前的鼠标左键坏了,借了一个没有侧键的微软鼠标之后研究了一下如何通过快捷键实现转跳,答案是:
Alt + <左右方向键>
虽然终究没有侧键方便,但也足够用了。

1109 日 , 2023 13:29:02
Transformer论文初探

为什么要将传统的dot-product attention修改为multi-head attention?

一般的dot-product attention中没有可供修改的参数选项,因为其本质就是向量之间求内积, 为了可以使得注意力机制有更大的customize的空间, 使用多头注意力机制可以提供更多的可调参数, 从而提供更强大的功能

position-wise forward feed network是如何工作的

本质上就是一个单隐藏层MLP, 输入维度为512, 隐藏层拓展到2048, 输出层为了适配残差链接恢复到512层, 中间的拓展有助于进行特征提取.

1101 日 , 2023 19:23:59
UAP

在计算机视觉领域,UAP 是 "Universal Adversarial Perturbation"(通用对抗扰动)的缩写。UAP 是一种对抗性攻击技术,旨在欺骗计算机视觉系统,使其在处理图像时产生错误的分类结果或误判。通用对抗扰动是一种特殊类型的对抗性扰动,它可以添加到图像中,而且可以对不同图像和不同模型都有效。

UAP 是一个通用性攻击,意味着一旦生成了一个对抗性的扰动,它可以被添加到任何图像上,而不仅仅是一个特定的图像。这使得攻击者能够以一种隐蔽的方式欺骗计算机视觉系统,从而可能导致系统做出错误的决策。

研究人员和安全专家努力寻找方法来防止和检测这种对抗性攻击,以提高计算机视觉系统的鲁棒性。

1025 日 , 2023 22:32:47
CWD in python

在Python中,相对地址是相对于运行Python命令的当前工作目录(Current Working Directory,CWD)的,而不是相对于Python文件所在的目录。当前工作目录通常由运行Python脚本的方式来确定。

如果你运行Python文件,Python的CWD将是包含该文件的目录。如果你在终端中运行脚本,CWD通常是你在终端中的当前目录。如果你使用一个集成开发环境(IDE)来运行Python文件,CWD将根据IDE的配置而定。

当Python文件中使用相对地址时,它们是相对于CWD来计算的。这也适用于导入其他包或模块时的相对导入。Python使用当前工作目录来解析相对地址,这可以在代码中通过os模块来获取:

import os

cwd = os.getcwd()  # 获取当前工作目录

如果你的Python文件需要使用其他包,并且这些包使用了相对地址,它们也将相对于CWD来计算。确保CWD 在执行Python代码之前设置正确非常重要,以确保相对地址引用按预期工作。

你可以使用os.chdir()来更改当前工作目录,或者在运行Python脚本时,可以通过终端命令或IDE配置来指定CWD。请注意,对CWD 的更改可能会影响相对地址的解析,因此要谨慎使用。

1019 日 , 2023 19:46:48
huggingface.co无法访问

我身别的设备除了我的电脑以外都可以顺利的访问huggingface.co,但是电脑不行,怀疑过是dns有鬼,调整dns服务器刷新缓存好几次也不见好转,最后讲小猫设置为全局模式才可以访问。记录在这里方便有同样问题的人(未来的我)查阅。

1017 日 , 2023 18:22:32
单目深度估计

Monocular Depth Estimation(单目深度估计)是深度学习领域的一个任务,旨在使用单张彩色图像(单目图像)来估计场景中每个像素点的深度或距离信息。这一任务对于计算机视觉和自主导航应用非常重要,因为深度信息可以帮助机器理解场景的三维结构,从而实现更准确的对象检测、场景分割、立体视觉以及导航等任务。

传统上,深度估计需要使用多个相机或其他传感器来获得深度信息。但单目深度估计试图通过分析单个图像的像素值和视觉特征,来预测每个像素的深度值,从而实现从单张图像中获取深度信息的目标。这对于无人驾驶汽车、增强现实、虚拟现实、机器人导航等领域具有广泛应用。

深度学习方法在单目深度估计方面取得了显著的进展,尤其是使用卷积神经网络(CNN)和其他深度学习体系结构。这些模型通过训练数据来学习图像中的深度信息与像素值之间的关系,从而使它们能够在未见过的图像上进行深度估计。这种任务的典型输出是深度图,其中每个像素都有一个估计的深度值,反映了该像素在场景中的距离。

1012 日 , 2023 19:35:47
Generative Prior

在深度学习和生成模型领域,"generative prior"(生成先验)是指与生成模型结构相关的概率分布或先验知识,用于指导生成模型生成合理、逼真的数据样本。这个概率分布通常表示为一个潜在变量的分布,这些变量可以控制生成模型的输出。生成先验有助于生成模型在生成数据时更好地捕捉数据分布的特征,使生成的数据更加真实和有意义。

生成先验通常与生成对抗网络(GANs)、变分自编码器(VAEs)等生成模型一起使用。它可以包括以下元素:

潜在变量空间(Latent Space): 这是一个概率分布空间,用于定义生成模型的输入。潜在变量可以是高维度的向量,它们通过采样从概率分布中获得。生成模型将这些潜在变量映射到数据空间,从而生成具体的数据样本。

概率分布: 生成先验定义了潜在变量的概率分布,通常是一个简单的分布,如多维正态分布(高斯分布)或均匀分布。这个分布的选择可以根据具体问题和应用来调整。

生成模型: 生成模型利用潜在变量和生成先验来生成数据。模型学习如何从潜在变量采样,并将其映射到数据分布上。通过训练,生成模型可以生成具有逼真性和多样性的数据。

生成先验的目标是帮助生成模型学习如何生成合理的数据样本,而不仅仅是复制训练数据。它可以使生成的数据在潜在变量空间中具有更好的结构,允许用户探索不同的潜在变量值以生成不同的数据样本。这种方法在图像生成、语音合成、自然语言生成等领域都得到了广泛应用。

923 日 , 2023 20:07:57
处理DNS污染

今天查找关于Lora的资料的时候需要访问huggingface.co,但是电脑怎么都访问不了,无论开不开代理或者连接热点还是校园网,而同时手机和舍友同网络环境下的设备都可以访问。应当是本地邦讯的dns解析配置被污染了,需要手动解决一下,解决方法:

  1. ipconfig /flushdns
  2. 清空浏览器缓存,或者直接重启电脑

再次尝试访问huggingface.co,成功。

923 日 , 2023 0:30:25
What is Ablation Study?

参考材料: https://zhuanlan.zhihu.com/p/644502891
消融实验是在科研论文中经常见到的一个名字,在解释模型工作原理的因果性中起到了很大作用,是科研环节中必不可少的一个环节。
在机器学习领域,尤其是复杂的深度神经网络中,"消融研究 "被用来描述切除网络某些部分的过程,以便更好地了解网络的行为。
例如,Girshick 及其同事(2014 年)提出了一个由三个 "模块 "组成的物体检测系统RCNN[2]:第一个模块使用选择性搜索算法(Uijlings 及其同事,2012 年)[3]提出在图像中搜索物体的区域,然后输入一个大型卷积神经网络(有 5 个卷积层和 2 个全连接层)进行特征提取,再输入一组支持向量机进行分类。为了更好地了解该系统,作者进行了一项消融研究,移除系统的不同部分--例如,移除卷积神经网络的一个或两个全连接层,性能损失却出奇地小,这让作者得出以下结论,

902 日 , 2023 20:50:01
831 日 , 2023 16:15:46
关于梯度消失以及梯度爆炸

参考资料:https://zhuanlan.zhihu.com/p/72589432

原因

神经网络的优化方法目前都是基于反向传播(反向传播:基于链式法则一层一层的向前推到权重与偏置的梯度),在链式法则的误差反向传播中,若梯度连续大于1或小于1,就会导致靠近输入层的权值梯度值接近0或者非常大。

现象

  • 梯度消失导致靠近输入层的网络基本不被更新,模型等同于没有这几层的效果
  • 梯度爆炸会导致每次更新模型变化过大,是网络变得不稳定。
  • 有可能导致权值溢出,损失变为NaN

    产生原因

    1. 深层网络
    2. 采用了不合适的损失函数

预告:关于残差网络 https://zhuanlan.zhihu.com/p/449792026

831 日 , 2023 15:22:12
Encoder-Decoder & Transformer

传统的自然语言处理使用RNN(循环神经网络)来对于文本进行序列化的处理,但是这样的方式会相应的造成一定的梯度消失,使得模型对于远距离语境中的内容产生“遗忘”。
在transformer模型中,使用了multi=head attention的机制,是的可以对于文本进行并行处理,但同时也失去了文本之间的相对位置信息,为此出现了位置编码(Encoder)
参考资料: https://zhuanlan.zhihu.com/p/507798134
file
file

为什么位置嵌入会有用

file

827 日 , 2023 23:54:26
“采样率”为何能和CDF联系起来

GPT的回答:
在统计学和概率论中,与采样频率相关的术语是“采样率”(Sampling Rate),而与概率分布相关的术语是“累积分布函数”(CDF,Cumulative Distribution Function)和“概率密度函数”(PDF,Probability Density Function)。我会为您解释这些概念:

  1. 采样率(Sampling Rate): 采样率是指在一定时间间隔内,连续信号的离散样本的数量。它通常以赫兹(Hz)为单位,表示每秒采集的样本数。例如,如果采样率为1000 Hz,则每秒采集1000个样本。采样率的高低会影响到采样到的数字信号的质量和能否准确地表示原始连续信号。

  2. 累积分布函数(CDF,Cumulative Distribution Function): CDF 是概率分布函数的一种表示形式,它描述了随机变量小于或等于某个特定值的概率。对于连续随机变量,CDF 是积分概率密度函数(PDF)得到的。数学上,CDF 在变量 x 处的值表示 P(X ≤ x),其中 X 是随机变量。

  3. 概率密度函数(PDF,Probability Density Function): PDF 描述了连续随机变量在各个取值上的可能性密度。对于连续随机变量 X,其 PDF f(x) 满足以下条件:在某个区间 [a, b] 上,X 落在这个区间内的概率可以通过对 f(x) 在 [a, b] 区间上的积分来计算。

在论文中概率分布函数实际上相当于每一帧中出现各种object size的概率,等同于在一段累计帧数中各个object size的出现频率,所以这里的“sampled frequency”并不是采样率的意思,而是采样到的各个size的分布频率

827 日 , 2023 21:30:43
关于EoT

"Expectation over Transformation"(期望变换)是计算机视觉领域中的一种方法,用于处理图像的不变性和变化性。该方法通常用于增强模型的鲁棒性和泛化能力,使其能够更好地应对图像数据在各种变换下的变化。

在计算机视觉中,图像可能会受到旋转、缩放、平移、光照变化等多种变换的影响。这些变换可能导致模型难以准确识别或分类图像,因为模型可能没有学会对这些变换进行适当的处理。

"Expectation over Transformation" 的方法思想是,通过对输入图像在不同变换下的期望(均值)进行建模,来改进模型的性能。具体来说,该方法通过对一组变换应用于输入图像,并计算变换后的图像预测的期望(均值),从而生成更稳健的特征表示。这些稳健的特征表示可以帮助模型更好地处理各种变换,从而提高其在现实世界中的性能。

这种方法的一个常见应用是在数据增强中。数据增强是一种通过对训练图像应用多种变换来扩充训练数据集的方法。使用 "Expectation over Transformation" 的方法,可以对这些变换后的图像的预测进行平均,从而得到更鲁棒的特征表示。

总之,"Expectation over Transformation" 是一种用于增强模型鲁棒性和泛化能力的方法,通过对输入图像在不同变换下的预测进行期望计算,从而改进模型的性能。这有助于使模型在现实世界的复杂变换情况下表现更好。

827 日 , 2023 21:04:07
826 日 , 2023 21:10:56
关于似然的初步解释

似然 (likehood) 与概率 (probability) 在英语语境中是可以互换的。但是在统计学中,二者有截然不同的用法。

概率描述了已知参数时的随机变量的输出结果;似然则用来描述已知随机变量输出结果时,未知参数的可能取值。

例如,对于“一枚正反对称的硬币上抛十次”这种事件,我们可以问硬币落地时十次都是正面向上的“概率”是多少;而对于“一枚硬币上抛十次”,我们则可以问,这枚硬币正反面对称的“似然”程度是多少。

区别似然和概率的直接方法为,"谁谁谁的概率"中谁谁谁只能是事件,也就是,事件(发生)的概率是多少;而"谁谁谁的似然"中的谁谁谁只能是参数,比如说,参数等于某个值时的似然是多少。

826 日 , 2023 15:01:18
825 日 , 2023 23:23:52
深度神经网络与线性模型

对于一个基本的线性回归模型, 就是一个由weights 和 bias 组成的网络而言, 在回归以及部分二分类的任务场景下会有比较好的表现, 然而其局限性就在于该网络本质上是线性的, 反映在二维空间上的分类问题上就是一条直着划分的线, 而这样的分类方式明显对于一些情况会出现水土不服的现象, 而这个问题也不能通过增加网络深度来解决, 因为经数学证明, 无论多少层线性网络的叠加, 本质上仍然与单层线性网络相当.

所以产生了深度神经网络, 关键词在于神经, 每一个节点不再单单只是对于传入的数值进行回归运算, 而是在回归运算后经过一个激活函数引入非线性(模拟人脑神经元的激活机制), 对于每一个神经元都是如此, 因此就可以产生多层隐藏层大大提升神经网络的能力

825 日 , 2023 19:03:40