首页
关于
Search
1
图神经网络
109 阅读
2
java期末速成
46 阅读
3
CLIP
42 阅读
4
Attention2Transformer
36 阅读
5
MySQL
32 阅读
默认分类
AI
课内
技能
Search
标签搜索
AI
CS
Tools
paper
DeepLearning
python
DATA
GNN
Transformer
hadoop
晨旭不想写程序
累计撰写
24
篇文章
累计收到
23
条评论
首页
栏目
默认分类
AI
课内
技能
页面
关于
搜索到
20
篇与
的结果
2024-06-02
SSL综述
SSL(SoundSourceLocation)声源定位,是是我们任务一的主要研究主题题我们通过这一文献A survey of sound source localization with deep learning methods中的简要介绍了解到声源定位大多数场景下的主要任务其实是DOA,也就是direction of arrival关注于方位角与仰角的研究,并不注重于距离的研究传统的SSL方法是基于信号/信道模型和信号处理(SP)技术。尽管多年来它们在该领域的显着进步,但在可能存在噪声、混响和几个同时发射声源的困难但常见的场景中,它们表现不佳。在近几年,深度学习成果不断涌出,很多研究都证明DL方法在一些SSL场景下比传统方法更优秀,尽管如此,在过往对于SSL问题解决的综述中只有很少提及到DL方法,本文就是为综述DL在SSL方向的应用而作,总结近几年间使用的DL on SSL方法针对DL SSL方法,我们一般使用麦克风阵列获得的多通道输入信号进行特征提取后作为输入特征输入神经网络 最后得出DOA的预测在最新的一些研究中,特征提取模块往往被省略掉,多通道信号直接输入DNN麦克风阵列中,麦克风之间的距离相比于麦克风到声源的距离要近,虽然从信号波形上来看他们差不多但是在延迟与振幅方面都有或多或少的差距,这些差距主要来源于源到不同麦克风的不同传播路径,对于直接路径和在室内环境中组成混响的大量反射麦克风信号通常使用时频(TF)表示,使用短时傅里叶变换SSL的一大难点就是不同源头的声音在传播时,在时间轴上有了重合,其实就是同时有多个音源进行发声,如何准确分离他们也是一件很重要的任务,出现反射现象与嘈杂环境的时候,声源之间的位置关系较为复杂传统难点:多音源同时发声反射噪声传统方法通常对于情况进行假设后进行建模,在真实世界中并不都能起到作用而深度学习方法能够对于真实的数据进行适应,当然这也造成了DNN缺点:DNN方法在一般场景下的主要缺点就是不通用高效(受限于训练成本与所需数据量)深度学习的缺点就是如果给定配置发生变化 得出的结果也不满意方法分类TDoA当麦克风阵列形状已知时,DOA估计可以通过估计麦克风之间源的到达时间差(TDoA)来决定GCC-PHAT具有相位变换的广义互相关(CC)方法(GCC-PHAT)是处理2麦克风阵列时最常用的方法之一,它被是两个麦克风信号之间的交叉功率谱(CPS)的加权版本的逆傅里叶变换广义互相关函数表示的就是同一声源在时延 s 下两个麦克风信号之间的相关性。$X_i(f)$是麦克风信号经过傅里叶变换后的频域表示使用复共轭(*)是一种特殊的处理办法,只有这样才能保留交叉功率谱的相位差接下来我们进行PHAT加权 其形式就是公式主体部分,使用获得的交叉功率谱除以幅值通过寻找使得广义互相关函数最大的时延参数,即两个麦克风获取的信号相似度最高时,达到最好估计时间差的效果,这样能够获得最准确的时间差目前GCC方法已经扩展到了两个以上麦克风的情况这种方法本身具有一定的抗噪声与抗混响能力,但是在信噪比降低、混响增强时,该算法性能急剧下降SRP-PHATTDOA这种方法没有用到阵列整体的优势,缺乏稳健性。而基于可控响应功率(SRP)的波束形成技术,具有较强的稳健性、抗噪性,以及具有一定的空域滤波性能,能够提高信号的信噪比,增加探测距离。在确定声源位置时,一般采用最优化算法,最小二乘法容易陷入局部极值点,而基于自然选择法则的遗传算法(GA)模拟生物进化过程,具有并行计算的特点,是一种全局搜索算法,能够得到全局最优解。将基于可控响应功率的波束形成技术和遗传法算法应用于枪声定位系统中,并通过实际的试验数据对此方法进行了验证,从结果来看具有较高的精度。基于相位变换加权的可控响应功率的声源定位算法这种方法具有较强的鲁棒性 但是在低信噪比的环境下定位性能较差,计算量较大,不经常使用SRP-PHAT对阵型没有特定要求,因此也适用于分布式阵列,事实上很多基于分布式阵列的定位系统采用了该算法。这种方法就是在空间中一点做出所有麦克风对信号的GCCPHAT和,在整个声源空间中寻找使得SRP值最大的点即为声源位置估计MUSIC基于高分辨率谱估计的声源定位方法:通过分析每个元素信号之间的相关性,构造 出一个拟合矩阵,从而确定声源位置。MUSIC算法首先通过将阵列接收到的信号进行空间谱估计,得到信号在不同方向到达时的空间谱。然后,通过对这些空间谱进行分解,可以找到信号所在的方向。将阵列输出数据的协方差矩阵进行特征分解,从而得到与信号分量相对应的信号子空间和与信号分量相正交的噪声子空间。 利用这两个子空间的正交性,构造一个空间谱函数,该函数在信号源所在方向处具有 尖峰。通过搜索空间谱函数的峰值,可以得到信号源的方向估计。1、构建信号接收矩阵,将阵列接收到的信号按照时间在矩阵中排列,每一列对应一个传感器接收到的信号。2、利用接收信号矩阵计算协方差矩阵,并对其进行特征值分解,得到信号的空间谱。空间谱表示了信号在不同方向到达时的能量分布。协方差矩阵描述了各个传感器接收到信号之间的相关性和变化。对协方差矩阵进行特征值分解。特征值分解是一种将矩阵分解为特征向量和特征值的操作。在这里,我们得到的特征向量描述了信号在各个方向上的空间谱,而特征值表示了信号在这些方向上的能量。为什么通过特征分解能够得到各个方向上的空间谱,并且能够构成信号子空间与噪声子空间,3、利用空间谱进行DOA估计,通过对空间谱进行分析,可以找到信号的主要方向。在MUSIC算法中,通过选取空间谱中的极值点(通常是最小的N个特征值对应的特征向量),可以确定信号的方向到达。https://zhuanlan.zhihu.com/p/613304918
2024年06月02日
11 阅读
0 评论
0 点赞
2024-06-02
CLIP
CLIP论文精读CLIP是什么一个强大的无监督训练模型通过NLP来的监督信号得到迁移学习进行图片与文字的配对实现监督的信号,解决了需要打标签进行训练的限制,增强了模型的泛化能力CLIP结构CLIP的结构包含两个模型Text Encoder和Image Encoder,Text Encoder用于提取文本特征,Image Encoder用来提取图像特征CLIP训练CLIP的训练数据是图像-文本对,如图上方是对小狗的描述,而下方是这张图片,通过对文本的特征提取与对图像的特征提取进行对比学习,对于N个图像文字对,预测出$N^2$个相似度,这里的相似度直接结算文本特征和图像特征的余弦相似性,实际上真实对应的相似对是位于对角线上的元素,我们的目的就是最大化对角线上的元素而减小非对角线上的元素实现zero-shot分类首先先将分类标签扩充成句子后输入到 TextEncoder中,而进行分类时的标签并不需要是训时存在的标签 ,你完全可以新加一个背带裤的标签进行分类,训练与推理时都没有标签的限制,属实是将视觉与文字的语义相关性真正学习到了。使用clip可以辅助实现风格迁移,AI换脸换衣,图像检测 分割,视频检索论文部分采用有限制性的监督信号会限制模型的泛化性这一点毋庸置疑 ,要识别新的物体类别时候就有了困难所以CLIP的想法就是由语言生成监督信号 经过测试,CLIP在ImageNet上可以跟专门为了ImageNet训练出来的resnet50打成平手 达到了非常好的效果并且可以随着两个模型性能继续增长后可以达到不断的进步从文本出来的弱监督信号不实用,是因为数据量不足够与算力消耗大方法上实际上都差不多,但是数据量规模是其想成长的必要因素像VirTex,ICMLM,ConVIRT这些工作都进行过类似的尝试,但是都是只训练了几天的规模,并不足以达到很好的效果于是openAI团队为了证明这一点 收集了超级大规模的数据想要达到比较好的效果再加上大模型的加持,可以达到非常不错的效果,这就是CLIP(Contrastive Language-Image Pre-training)对于模型选择,作者团队也尝试了多种的尝试,发现CLIP的效果跟模型规模是有正相关的最终得到的效果是,CLIP在30多个数据集上基本都能与精心设计的模型打成平手甚至胜利,并且会有更好的泛化性使用CLIP的好处有很多,其中之一就是CLIP不需要再对数据进行标注,只需要获得文本—图像对就可以,像在社交平台上获得的图片跟他发布时的TAG就是一个很好的途径,这种数据往往比标注的数据更容易获取,另外,通过文本—图像对的这种数据集训练,使得其拥有了多模态的效果 在预训练过程中,作者团队采用了对比学习的方法,之所以使用这样的方法而不是用GPT就是因为语言的多样性导致对应关系有很多(例如一张图片可以从多个角度描述),所以我们只需要让图片与文本配对即可,通过这样就能达到很高的效率代码的实现在实现方面,通过论文所给伪代码# image_encoder - ResNet or Vision Transformer # text_encoder - CBOW or Text Transformer # I[n, h, w, c] - minibatch of aligned images # T[n, l] - minibatch of aligned texts # W_i[d_i, d_e] - learned proj of image to embed # W_t[d_t, d_e] - learned proj of text to embed # t - learned temperature parameter # 分别提取图像特征和文本特征 I_f = image_encoder(I) #[n, d_i] T_f = text_encoder(T) #[n, d_t] # 在得到特征时一般会尝试归一化 在归一化前,还涉及到了投射层,即np.dot(I_f, W_i),主要用来学习如何从单模态投射到多模态 # 对两个特征进行线性投射,得到相同维度的特征,并进行l2归一化 I_e = l2_normalize(np.dot(I_f, W_i), axis=1) T_e = l2_normalize(np.dot(T_f, W_t), axis=1) # 计算缩放的余弦相似度:[n, n] logits = np.dot(I_e, T_e.T) * np.exp(t) # 对称的对比学习损失:等价于N个类别的cross_entropy_loss labels = np.arange(n) # 对角线元素的labels loss_i = cross_entropy_loss(logits, labels, axis=0) loss_t = cross_entropy_loss(logits, labels, axis=1) loss = (loss_i + loss_t)/2步骤解释提取图像特征和文本特征:使用预训练的 image_encoder 和 text_encoder 分别提取图像 I 和文本 T 的特征,得到形状为 [n, d_i] 和 [n, d_t] 的特征向量。线性投射和归一化:对两个特征进行线性投射,分别用矩阵 W_i 和 W_t,得到相同维度的特征向量 I_e 和 T_e。对投射后的特征进行 l2 归一化,保证它们具有单位长度。计算缩放的余弦相似度:通过计算余弦相似度矩阵,得到形状为 [n, n] 的 logits 矩阵。这一步涉及将图像特征和文本特征进行相似度计算,并使用温度参数 t 进行缩放。对称的对比学习损失:创建标签 labels,其中包含了元素从 0 到 n-1。计算两个方向上的交叉熵损失:loss_i 是以图像为查询,文本为正样本的损失;loss_t 是以文本为查询,图像为正样本的损失。最终的损失是两个方向上损失的平均值,即 (loss_i + loss_t) / 2。这个损失函数的设计旨在通过最大化正样本之间的相似度、最小化负样本之间的相似度,来学习图像和文本之间的语义对应关系。这种对称性的设计可以帮助提升模型的泛化能力,使得图像和文本之间的表示更加一致和可靠。
2024年06月02日
42 阅读
2 评论
1 点赞
2024-06-02
图神经网络
图神经网络—GNN看了大佬的博客A Gentle Introduction to Graph Neural Networks图图用来表示一些实体间的关系——》点V Vertex 顶点/nodeE Edge 边/关系U Global 全局 (embedding) 比如一个图中是否含有环 就是一个全局信息V E U可以用向量来表示图分为有方向 与 无方向 两种实体间的关系不一定相互 比如用户博客的关注将图片变成图就是将每个像素点按照在图片上的位置进行排列,前后左右以及对角线直接相连的的结点都是本节点的”邻居“。将文本变成图就是将 各个单词进行串联常见的分子结构也是用图表示还有常见的图就是人物关系图图的表示图是一种比较具象化的数据结构,注重数据之间的关系通常我们使用向量来表示图先给点进行排序,然后在相应的位置上放入点中的数据,如 1 3 2表示三个点 第一个点中数据为1 第二个中为3 第三个为2那么相应的就有边的性质 假设有四条边 表示为 3 2 3 2意思是四条边蕴含的数据分别为3 2 3 2最后对应四条边的四个连接 如 [0,1] [1,2] [2,0] [2,3]这样的一个图表示的就是一个简单的图,并且我们也表示出了图所蕴含的信息使用图简单的GNN既然知道了如何表示图,那么我们来看如何使用图进行训练任务,最简单的就是信息传递,他分别对图的E V U的embedding进行了一次的MLP,从而保持图的结构,进行多次,就有了一个简单的图神经网络继续,我们可以使用图进行图信息的预测假设我们缺失图上的顶点信息,我们就可以将与此顶点相连的边还有全局信息进行信息传递,我们直接将边的embedding与全局的embedding进行求和,经过映射操作,那么我们可以直接将得到的值赋予给顶点信息,这也叫pooling对于边信息或者全局信息,我们直接采用对称的方式进行操作即可那么我们来看使用一张图中信息的流程,实际上就是我们对于一张图,将它进入E V U的三个MLP中直接进行输出,得到属性进行过处理的图(图进图出),然后将它进入全连接层,获得我们想要的结果但是这种简单的方式没有考虑到V E U三者之间的联系,并不能完整的利用图中的信息。
2024年06月02日
109 阅读
6 评论
0 点赞
2024-06-02
fast git
Gitgit命令获取git仓库git init将当前目录转换为Git仓库该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。 但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。git clone当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。$ git clone 克隆仓库指令 (指定名称)文件状态工作目录里的文件无非就是两种状态:已跟踪与未跟踪状态,已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后, 它们的状态可能是未修改,已修改或已放入暂存区。简而言之,已跟踪的文件就是 Git 已经知道的文件。当我们初次克隆某仓库的时候,仓库中的所有文件都是已跟踪文件未修改状态,仓库中的文件一旦发生修改,状态将更改为已修改,在工作时,我们可以将已修改文件放入暂存区,状态更改为暂存,然后我们可以一次性提交所有已经暂存的修改。上图就是文件的生命周期图。git status查看文件状态,状态信息中包含所在的分支以及当前所在分支与远程仓库中对应的分支是否存在偏离 如果文件发生了改变,则在下面则会出现Untracked files的列表,提醒我们没有追踪的文件git add使用命令 git add 开始跟踪一个文件。只要在 Changes to be committed 这行下面的,就说明是已暂存状态。 如果此时提交,那么该文件在你运行 git add 时的版本将被留存在后续的历史记录中。 你可能会想起之前我们使用 git init 后就运行了 git add 命令,开始跟踪当前目录下的文件。 git add 命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。git add是一个多功能的命令,可以使用他对已修改文件进行暂存如若在暂存后再次修改了该文件,则该文件会同时出现在暂存与未暂存区域,这时我们直接提交提交的是第一次暂存的版本,如若要使用当前的版本需要再次add后再提交将这个命令理解为“精确地将内容添加到下一次提交中”git ignore一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件的模式。范例: # 忽略所有的 .a 文件 *.a # 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件 !lib.a # 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO /TODO # 忽略任何目录下名为 build 的文件夹 build/ # 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt doc/*.txt # 忽略 doc/ 目录及其所有子目录下的 .pdf 文件 doc/**/*.pdfgit diff此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。 也就是修改之后还没有暂存起来的变化内容。若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --staged 命令。 这条命令将比对已暂存文件与最后一次提交的文件差异请注意,git diff 本身只显示尚未暂存的改动git commit提交命令,执行后会启动你选择的文本编辑器来输入提交说明。Note 启动的编辑器是通过 Shell 的环境变量 EDITOR 指定的,一般为 vim 或 emacs。 当然也可以按照 起步 介绍的方式, 使用 git config --global core.editor 命令设置你喜欢的编辑器。默认的提交消息包含最后一次运行 git status 的输出,放在注释行里,另外开头还有一个空行,供你输入提交说明。 你完全可以去掉这些注释行,不过留着也没关系,多少能帮你回想起这次更新的内容有哪些。另外,你也可以在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行提交后它会告诉你,当前是在哪个分支(master)提交的,本次提交的完整 SHA-1 校验和是什么(463dc4f),以及在本次提交中,有多少文件修订过,多少行添加和删改过。每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤git rmgit rm --cached README可以将指定文件从暂存区中移除,但是不会从本地删除,如果本地删除只需要直接 git rm-f即可,这是一种安全特性,用于防止误删尚未添加到快照的数据,这样的数据不能被 Git 恢复。git mvgit mv 被改文件名 文件名相当于执行三句$ mv README.md README $ git rm README.md $ git add README 如此分开操作,Git 也会意识到这是一次重命名,所以不管何种方式结果都一样。 两者唯一的区别在于,git mv 是一条命令而非三条命令,直接使用 git mv 方便得多。 不过在使用其他工具重命名文件时,记得在提交前 git rm 删除旧文件名,再 git add 添加新文件名。git log查看提交历史git log 有许多选项可以帮助你搜寻你所要找的提交, 下面我们会介绍几个最常用的选项。其中一个比较有用的选项是 -p 或 --patch ,它会显示每次提交所引入的差异(按 补丁 的格式输出)。 你也可以限制显示的日志条目数量,例如使用 -2 选项来只显示最近的两次提交,该选项除了显示基本信息之外,还附带了每次提交的变化。 当进行代码审查,或者快速浏览某个搭档的提交所带来的变化的时候,这个参数就非常有用了。 你也可以为 git log 附带一系列的总结性选项。 比如你想看到每次提交的简略统计信息,可以使用 --stat 选项,另一个非常有用的选项是 --pretty=。 这个选项可以使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用。 比如 oneline 会将每个提交放在一行显示,在浏览大量的提交时非常有用。 另外还有 short,full 和 fuller 选项,它们展示信息的格式基本一致,但是详尽程度不一。当 oneline 或 format 与另一个 log 选项 --graph 结合使用时尤其有用。 这个选项添加了一些 ASCII 字符串来形象地展示你的分支、合并历史:$ git log --pretty=format:"%h %s" --graph * 2d3acf9 ignore errors from SIGCHLD on trap * 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit |\ | * 420eac9 Added a method for getting the current branch. * | 30e367c timeout code and tests * | 5a09431 add timeout protection to grit * | e1193f8 support for heads with slashes in them |/ * d6016bc require time for xmlschema * 11d191e Merge branch 'defunkt' into local总结Table 2. git log 的常用选项 选项 说明 -p 按补丁格式显示每个提交引入的差异。 --stat 显示每次提交的文件修改统计信息。 --shortstat 只显示 --stat 中最后的行数修改添加移除统计。 --name-only 仅在提交信息后显示已修改的文件清单。 --name-status 显示新增、修改、删除的文件清单。 --abbrev-commit 仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。 --relative-date 使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。 --graph 在日志旁以 ASCII 图形显示分支与合并历史。 --pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。 --oneline --pretty=oneline --abbrev-commit 合用的简写。撤销操作git commit --amend这个命令可能用在我们提交信息错误或者有文件忘记提交时进行使用我们使用这个命令就可以再次进行提交,此时我们这次提交会将上次提交的基础上再次进行提交并且将修改信息加到本次提交上,也就是将提交补全,补全后之前提交将不再存在git reset xxxgit reset命令可以取消对某文件的暂存git checkout撤销修改,将文件退回为之前的样子请务必记得 git checkout -- 是一个危险的命令。 你对那个文件在本地的任何修改都会消失——Git 会用最近提交的版本覆盖掉它。 除非你确实清楚不想要对那个文件的本地修改了,否则请不要使用这个命令。在 Git 中任何 已提交 的东西几乎总是可以恢复的。 甚至那些被删除的分支中的提交或使用 --amend 选项覆盖的提交也可以恢复 (阅读 数据恢复 了解数据恢复)。 然而,任何你未提交的东西丢失后很可能再也找不到了。远程操作git remote add运行 git remote add 添加一个新的远程 Git 仓库,同时指定一个方便使用的简写git remote add jx xxxxxxxxgit fetch这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看git pushgit push 分支 服务器将本地分支内容推送到上游,当你的本地版本并不是最新时,这条命令将不起作用git remote rename改远程仓库名git remote remove删除远程仓库
2024年06月02日
9 阅读
0 评论
0 点赞
2024-06-02
threading多线程
threading在处理多并发问题时,我们通常使用多线程进行处理,Python 实现多线程编程需要借助于 threading 模块基本使用threading 模块中最核心的内容是 Thread 这个类每个对象都代表一个线程,平时我们直接运行的部分就是主线程Thread 的构造方法中,最重要的参数是 target我们使用target将线程的目标指定出来(一个函数)要让一个 Thread 对象启动,调用它的 start() 方法就可以了thread = threading.Thread(target=test,name='name') thread.start()threading.active_count表示目前已经运行了多少个线程threading.enumerate运行的线程有哪些threading.current_thread表示当前运行的线程是哪个join功能在start之后,在某处插入了.join(),则从此处开始至子线程中止都阻塞主线程,执行完当前任务后再继续进行主线程的任务Queue功能我们的线程无法得到返回值所以我们要使用的话我们就要先定义出一个队列def job(data,q): for i in range(len(data)): data[i] = data[i]**2 q.put(l) def multithreading(data): q = Queue() threads = [] data = [[1,2,3],[3,4,5],[4,4,4],[5,5,5]] for i in range(4): t = threading.Thread(target = job,args=(data[i],q)) t.start() threads.append(t) for thread in threads: thread.join() results = [] for _ in range(4): results.append(q.get())多线程的效率问题多线程的任务分配并不是平均分配使用GIL分配方式同一时间只有一个线程在进行,节省效率是因为读写可以与其他线程的运算同时进行LOCK锁的功能lock = threading.Lock() lock.acquire() |运行| lock.release()锁的意义就在于多个线程在对共享数据进行修改时,为了让数据同步做的锁定,让线程获得后进行即可详细查阅 http://www.runoob.com/python3/python3-multithreading.html
2024年06月02日
14 阅读
0 评论
0 点赞
1
2
3
4