- 博客(505)
- 资源 (1)
- 收藏
- 关注
原创 深度之眼PyTorch训练营(第二期)笔记目录(已完结)
文章目录简介目录简介本期训练营来自深度之眼,以下为训练营PyTorch简介中摘录:1)上手快:PyTorch代码更简洁易读,实现时间短,只要了解它和机器学习的基础概念,就可以上手使用2)易调试:由于PyTorch采用动态图机制,使得调试它就像调试python一样简单3)资源多:非常干净、统一,文档化非常好,也没有大量重复的函数,目前arXiv中最新的算法大多都用pytorch实现,可以迅...
2019-10-30 08:55:55
5491
5
原创 第七章 设计无锁并发数据结构
使用互斥锁、条件变量和期值来同步数据的算法和数据结构被称为阻塞的。通常,操作系统将完全挂起一个被阻塞的线程;不使用阻塞库函数的数据结构和算法被称为非阻塞的。然而,并非所有这些数据结构都是无锁的。阻塞 vs 非阻塞 vs 无锁阻塞(Blocking)—— 排队等叫号就像你去银行办业务,拿号后坐在椅子上干等,直到喇叭叫你的号。代码中的体现:使用 mutex.lock()、condition_variable.wait()、future.get()
2026-03-17 16:04:33
331
原创 第六章 设计基于锁的并发数据结构
要求栈的用户负责确保这一点。此外,通过在pop()函数中直接返回弹出的数据项,而不是通过分开的top()和pop()操作,可以进一步避免潜在的竞争条件。try_pop() 处理的是队列的头部,而 push() 处理的是尾部,两者不会冲突,因此可以避免使用全局互斥锁。对于列表中的每个节点 x,其中 x 不等于 tail,x->data 指向类型 T 的一个实例,x->next 指向列表中的下一个节点。如果遵循简单的线程安全准则,比如不返回引用,并在每个成员函数中放置一个简单的互斥锁,所有这些操作都是安全的。
2026-03-09 19:32:59
377
原创 第五章 C++内存模型与原子操作
如果存储操作被标记为memory_order_release、memory_order_acq_rel或memory_order_seq_cst,加载操作被标记为memory_order_consume、memory_order_acquire或memory_order_seq_cst,并且链中的每个操作都加载了前一个操作写入的值,那么这一连串的操作构成了一个释放序列(有约束)。std::atomic_flag 对象初始化后,只能执行析构函数、clear() 和 test_and_set() 成员函数。
2026-02-05 21:44:30
940
原创 第四章 同步并发操作
如以上代码所示,std::experimental::future 与 std::future 类似,只允许存储的值被检索一次。这段代码使用了std::experimental::when_all,可以避免这种等待和上下文切换,将需要等待的一组期值传递给 when_all,它返回一个新的期值,当集合中的所有期值都准备好时,这个新的期值就会变得可用,这个新的期值可以与延续(continuations)一起使用,来安排当所有期值都准备好时需要执行的额外工作。std::promise 提供了同样的功能。
2025-12-09 19:04:19
754
原创 第三章 在线程之间共享数据
但是,如果先锁定作为第一个参数传递的实例的互斥锁,然后再锁定作为第二个参数传递的实例的互斥锁,这可能会适得其反:只需要有两个线程尝试在相同的两个实例之间交换数据,但参数的顺序调换了,就会造成死锁!在另一个线程可以锁定互斥锁之前,必须释放所有锁,如果调用 lock() 三次,也必须调用 unlock() 三次,std::lock_guard<std::recursive_mutex> 和 std::unique_lock<std::recursive_mutex> 可以处理此问题。尽量在锁之外处理数据。
2025-12-02 10:54:55
806
原创 第一章 C++并发里的 Hello,World!
并发性指的是两个或更多个独立的活动同时发生。(同时走路和说话,或者每只手进行不同的动作;不同的人做不同的事情,一个人在看足球比赛的同时另一个人可以去游泳)在双核计算机中,有两个任务,分别使用绿色和红色表示,可以同时分别在两个核中运行,互不干扰。在单核机器:任务交替执行。但它们之间也会有一定的间隔(灰色条块);为了进行交替执行,系统每次从一项任务切换到另一项任务时都必须执行上下文切换,这需要花费时间。
2025-11-25 15:11:27
566
原创 C++多线程开发环境配置
必须选择带 “posix” 的版本,这是多线程支持的关键!解压到 C:\mingw64(路径不要有空格和中文)配置环境变量右键"此电脑" → 属性 → 高级系统设置 → 环境变量在 系统变量 中找到 Path → 编辑 → 新建 → 添加:验证安装。
2025-11-25 15:07:10
573
原创 20250919.慢病营养2
食物升血糖的速度1.用人体实验做出来的结果2.实验人数不会太多3.头一天晚上不吃东西,第二天早上食用一定量碳水来测定,一般食用50克碳水(不同重量食物碳水含量不一样),食用完毕后隔15/30/45/60分钟测定血糖获得血糖曲线 ,然后计算曲线覆盖面积,最后与特定食物(如葡萄糖)对应面积进行比较得到GI值。每个人结果会有差异。各个地区测的结果也不一样。数据仅供参考。要点:1.不是绝对准确值2.是身体“主观”反映3.GI规律:膳食纤维多的GI低,生食物的GI低(土豆、香蕉)
2025-09-20 16:20:31
782
原创 C2W4.Assignment.Word_Embedding
使用 numpy.random.rand 生成矩阵,这些矩阵的初始化值为均匀分布的随机值,范围在 0 和 1 之间。在连续词袋(CBOW)建模中,可根据一些上下文词(中心词周围的词)来预测中心词。注意:这里使用随机种子。请不要修改该种子,以便正确测试我们的解决方案。结果:Size of vocabulary: 5775。对所有上下文单词进行独热编码后,就可以使用。构建词典,存放单词与索引的相互映射。需要初始化两个矩阵和两个向量。结果并不理想,哪里有问题?例如,上下文的半大小为。
2024-12-16 09:26:09
688
原创 C2W4.LAB.Word_Embedding.Part2
图中描述的是一个简单的神经网络模型,通常用于处理词嵌入(Word Embedding)任务,如连续词袋模型(Continuous Bag of Words, CBOW)。如果再次运行这个单元,就会得到下一个值,依此类推,直到迭代器返回的值用完为止。,这个矩阵的第一列(3个元素)对应第一个单词的表征,第二列对应第二个单词,以此类推。你可以对它进行迭代(例如使用。是因为只进行一次迭代训练,如果在多个迭代中进行完整的训练,需要使用常规的。是 CBOW 模型的一个超参数,代表单词嵌入向量的大小以及隐藏层的大小。
2024-10-25 16:00:54
1219
原创 C2W4.LAB.Word_Embedding.Part1
训练示例(Training example):图中的 “I am happy because I am learning” 展示了一个训练示例,其中 “happy” 是中心词,而 “I”, “am”, “because”, “I”, “learning” 是上下文词。这里提供了一个辅助函数。表示模型的输出,它是通过将输入层的词向量与权重矩阵相乘,加上偏置,然后通过激活函数和softmax函数得到的。将以上步骤整合到一个方便的函数中,该函数的参数包括:要编码的单词、将单词映射到索引的字典,以及词汇量的大小。
2024-10-25 15:26:15
1128
原创 C2W3.Assignment.Language Models: Auto-Complete.Part2
当遇到的 n-gram 在训练数据中没有出现过,即n-gram 的计数为零时,此公式不起作用,等式 (2) 就无法求值(变成了零除以零)。后面还需要对公式2加上平滑项,公式2简单说,就是计算n-grams(分子),(n+1)-grams(分母)的序列应预测句子的第一个词。在计算 n-grams 的计数时,需预处理好句子,并在句子前加上。接下来,利用 n-gram 计数估算前 “n ”个单词的概率。要处理较长的句子,可以修改实现方法,取概率的对数之和。,这是便于将来tri-grams计算分母用的。
2024-07-26 16:48:31
985
原创 C2W3.Assignment.Language Models: Auto-Complete.Part1
当模型遇到了一个它在训练过程中从未见过的单词,那么它将没有输入单词来帮助它确定下一个要建议的单词。将所有标记词转换为小写,这样原文中大写的单词(例如句子开头的单词)就会与小写单词得到相同的处理。将每个单词列表添加到句子列表中。为了在预测过程中处理未知词,可以使用一个特殊的标记 “unk”来表示所有未知词。语言模型为单词序列分配概率,使更 “可能 ”的序列获得更高的分数。这里不会使用数据中出现的所有分词(单词)进行训练,只使用频率较高的单词。需要一个双 for 循环,一个用于句子,另一个用于句子中的标记。
2024-07-22 20:13:59
2039
原创 C2W3.LAB.N-grams+Language Model+OOV
这里使用的是Add-k 平滑法,它是一种用于自然语言处理中的语言模型平滑技术,它通过在每个n-gram的概率估计中添加一个常数k来避免概率为零的问题。它在是一种用于语言模型平滑的技术。1.定义基础模型:首先定义一个或多个基础的语言模型,这些模型可能是基于不同大小的n-gram构建的,例如unigram(1-gram)、bigram(2-gram)等。4.处理零概率问题:由于插值法结合了多个模型的预测,它通常可以避免零概率问题,因为即使某个模型给出了零概率,其他模型的非零概率贡献可以保证插值后的概率不为零。
2024-07-21 20:39:09
1174
原创 C2W2.Assignment.Parts-of-Speech Tagging (POS).Part3
Viterbi算法是一种在隐马尔可夫模型(Hidden Markov Model, HMM)中用于解码问题的强大技术,即在给定一系列观测的情况下,找出最可能的隐状态序列。计算第二个单词(‘tracks’)的词性标签是VBZ(动词、第三人称单数现在时)的概率。参照上面的三词示例,读取第 2 列的 best_paths,并将 z 填入位置 1。最后一项中的所有行(POS 标记),找出具有最大值的行(POS 标记)。的第 0 列之外,两个矩阵都将被初始化为 0。是包含单词与整数的键值对的字典。
2024-07-21 20:38:54
978
原创 C2W2.Assignment.Parts-of-Speech Tagging (POS).Part2
函数,其主要目的是创建一个发射矩阵 B,这个矩阵通常用于隐马尔可夫模型(HMM)中,表示在给定状态(在这里是词性标签)下观测到某个观测值(在这里是单词)的概率。函数主要目的是创建一个转移矩阵 A,这个矩阵通常用于隐马尔可夫模型(HMM)中,表示状态(在这里是词性标签)之间转移的概率。注意:以上的计算结果示例是经过平滑后的。每个单元格都给出了从一个词性标签到另一个词性标签的概率。马尔可夫模型中包含若干状态以及这些状态之间的转换概率。,使用这三个矩阵可以很容易的构造出A和B。在Part 1中已经计算了。
2024-07-20 21:51:06
857
原创 C2W2.Assignment.Parts-of-Speech Tagging (POS).Part1
的目的是遍历一个预处理后的词序列,根据观测/发射概率(emission probabilities)来预测每个词的词性,并与实际的词性标签进行比较,从而计算预测的准确率。该任务对搜索查询至关重要,识别专有名词、组织机构、股票代码或任何类似的东西,将大大提高从语音识别到搜索的各种能力。上面的词性标签是从训练集中提取出来的,里面包含有辅助词性标签,如: '–s–'表示句子的起始位置。用于计算每个词性标签与另一个词性标签相邻出现的次数。用于计算给定词性标签的条件下某个单词的出现概率。
2024-07-20 21:49:50
1489
2
原创 C2W2.LAB.Parts-of-Speech Tagging
如果设置为 True,则在执行求和操作后,结果数组的维度与原始数组保持一致,只是被求和的轴的维度被减少到1。要解决这个问题,可以简单粗暴地将每个新词归类为未知词,但也可以创建一个函数,尝试对每个未知词的类型进行分类,并为其分配一个相应的未知标记。否则返回 False。由于数据集提供了同一行中的每个单词和标签,而单词是否为已知取决于所使用的词汇,因此这两个元素应成为该函数的参数。如果不是,则应处理该行以返回正确的单词和标记对,如果单词未知,则应使用函数 assign_unk()标记未知单词具体未知类型。
2024-07-19 12:19:23
1161
原创 C2W1.Assignment.Autocorrect.Part2
在这里,给定一个字符串源[0…下图为表格/矩阵的初始化(根据公式4),每个格子/元素代表从原字符串source[0:i]到目标字符串target[0:j]所需要的最小编辑代价/距离。步骤1:使用前面完成的编辑功能,为提供的单词生成建议,生成建议需要遵循如下原则:具体编辑次数较少的词比编辑次数较多的词更有可能产生。这里,空列表 [] 被视为 False,而非空列表 [“a”,“b”] 被视为 True。由于 [“a”,“b”] 是 True,表达式的结果为 [“a”,“b”]。是该词在词汇表中出现的概率。
2024-07-19 08:58:40
1027
原创 C2W1.Assignment.Autocorrect.Part1
这里的结果是列表的列表(嵌套列表)它首先遍历第一个 replace_set 中的每个子列表,然后遍历每个子列表中的每个元素,将它们添加到新的列表中。因此,如果第一个 replace_set 包含 n 个子列表,每个子列表有 26 个元素,那么第二个 replace_set 将是一个包含 n * 26 个元素的单一列表。它首先遍历第一个 insert_l 中的每个子列表,然后遍历每个子列表中的每个元素,将它们添加到新的列表中。insert_l 的大小与第一个相同,但它是一个单一的列表,而不是嵌套的列表。
2024-07-18 16:40:53
1492
原创 C2W1.LAB.Vocabulary Creation+Candidates from String Edits
注意:除了splits和deletes操作,还有其他的编辑类型,例如:insert, replace, switch等,这里没有一一实现,留待各位补全。这样做的目的是有效删除被编辑的原始单词中每个可能的字母。经过上面的操作,得到了执行删除编辑后创建的候选字符串列表。在下面的示例词汇表中,你能想到创建候选词列表的方法吗?下一步是过滤该列表,以查找词汇表中的候选词。中的后半部分的每个字符串中删除一个字母。找出将一个单词分成两个部分的所有方法!当然也可以用list更加简洁。修改小语料库的text,使。
2024-07-18 09:57:46
1362
原创 C1W4.Assignment.Naive Machine Translation and LSH
3.单词没有办法训练,于是使用get_matrices函数将en_fr_train中的英文法文单词对一一拿出来,分别在英文词向量表达en_embeddings_subset和法文词向量表达fr_embeddings_subset中找到对应的词向量表达,分别放到X和Y中。1.所有英文和法文都有词向量表达,但是太大,我们不需要这么多,先切出我们需要用的英文词向量表达en_embeddings_subset和法文词向量表达fr_embeddings_subset。是嵌入的维数(300)。
2024-07-17 21:52:58
1083
原创 C1W4.LAB.Vector manipulation+Hash functions and multiplanes
多平面散列函数(Multi-plane Hashing,简称MPH)是一种哈希函数的设计方法,它通过将输入数据分割成多个部分,并在不同的平面上独立地对这些部分进行哈希处理,然后将结果组合起来生成最终的哈希值。在下面的代码中,我们将展示多平面原理的最基本形式。函数将生成一个以字典形式存储的哈希表,其中键包含哈希键,值提供输入列表中的哈希元素。上图中可以看到,定义平面的矢量并不是平面两边的边界。已经应用了前两种变换。注意:在Numpy中使用的是弧度不是角度,例如:以下代码定义一个旋转矩阵,该矩阵可将向量旋转。
2024-07-17 09:40:25
1083
原创 C1W3.Assignment: Hello Vectors
现在的词向量是300维的,难以使用可视化的方式显示这些词向量,因此我们使用PCA将向量投射到一个维度更小的空间中,并尽量保持原始信息不丢失。例如,“悲伤”、"快乐 "和 "喜悦 “都是描述情绪的词语,在绘制时应该相互靠近。由于原始的谷歌新闻单词嵌入数据集约为 3.64 G,有条件的同学可以自行下载该数据集,提取出将在本作业中分析的单词样本,并将其保存在名为word_embeddings_subset.p的 pickle 文件中。使用上面实现的函数计算向量之间的相似性,并利用这些相似性找出各国的首都。
2024-07-16 15:32:32
1347
原创 C1W3.LAB.Linear algebra in Python with NumPy
对于二维数组 nparray2 来说,np.linalg.norm(nparray2) 默认计算的是矩阵的 L2 范数,这实际上是矩阵的最大奇异值。在这个函数调用中,没有指定 axis 参数,所以它计算的是整个数组的全局均值,即所有元素的总和除以元素的总数。在线性代数中,矩阵的转置是一种将矩阵在其对角线上翻转的运算,转置运算将矩阵的行和列索引互换,产生另一个矩阵。如果没有指定范数的类型,np.linalg.norm 计算的是 L2 范数,也就是欧几里得范数,它是数组元素平方和的平方根。
2024-07-16 11:22:06
861
原创 C1W2.Assignment: Naive Bayes
注意,这里是根据训练数据计算先验值的,训练数据在正负标签之间平均分配(4000 条正向推文和 4000 条负向推文)。换句话说,如果我们没有任何具体信息,盲目地从人群集合中挑选一条推文,那么这条推文是正面还是负面的概率是多少?在utils.py中,还实现了一个查询辅助函数(lookup),该函数接收 freqs 词典、一个单词和一个标签(1 或 0),并返回该单词和标签元组在推文集合中出现的次数。这里要完成情感词频字典(freqs)的构建,字典的键是一个元组(单词、标签),值是相应的频率。
2024-07-15 21:32:18
1245
原创 C1W2.LAB.Visualizing Naive Bayes
它比在直角坐标平面上绘制点更好,因为在大数据集上,点会严重重叠,从而掩盖数据的真实分布。在下面的练习中,将使用朴素贝叶斯特征对推文数据集进行可视化检查,重点理解对数似然比=一对可输入机器学习算法的数字特征。以上公式对应的代码本次实验不做要求,但运行得到的结果放在:'bayes_features.csv’文件中。对于每条推文,我们都计算了该推文的正面可能性和负面可能性。下面给出可能性比率的分子和分母。的概念,作为直观表示朴素贝叶斯模型的工具。修改后,两个数据的分布开始重合。分析朴素贝叶斯的结果。
2024-07-15 09:51:02
983
原创 C1W1.Assignment: Logistic Regression
的计算方法是取向量 "y "和 "log(h) "的点积。由于 "y "和 "h "都是列向量(m,1),因此要将向量向左转置,这样行向量与列向量的矩阵乘法就能得到点积。) 而标签为 0 时,对数损失的第二项就会变成一个很大的负数,然后乘以总系数-1,将其转换为正损失值。它将输入的 "z "映射为一个介于 0 和 1 之间的值,因此可以将其视为一个概率。的维度为:(n+1, 1),其中 "n "为特征个数,还有一个元素为偏置项。) 而标签 "y "也是 1 时,该训练示例的损失为 0。
2024-07-14 14:39:36
1181
原创 C1W1.LAB.Preprocessing+Word frequencies+Logistic_regression_model
NLTK 的推特样本数据集分为正面推文和负面推文。其中包含 5000 条正面推文和 5000 条负面推文。这些类别之间的精确匹配并非巧合。这样做的目的是为了得到一个平衡的数据集。这并不能反映实时 Twitter 流中正面和负面类别的真实分布(正面大于负面)。这只是因为平衡数据集简化了情感分析所需的大多数计算方法的设计。plt.show()
2024-07-14 10:44:44
1146
原创 06.C2W1.Auto-correct
D[2,3] = pl → sta,表示pl到sta的最小距离,这里pl是单词play的前两个字母,sta是目标单词stay的前三个字母,也可以表示为:D[2,3] = source[:2] → target[:3],更通用的形式是。其实这些不同编辑操作得到的2是基于前面算出来的结果进行计算得到的,例如第一种操作中的插入s已经算过了就是1,然后是删除p也是1,最后加起来就是2,路径是紫色+一个删除;它通过将问题分解为更小的子问题,并将子问题的解存储起来(通常是在表格中),以避免重复计算,从而提高效率。
2024-07-07 22:13:07
1074
原创 05.C1W4.Machine Translation and Document Search
可以看到,不同组的平面划分得到结果也不一样,这种划分方法在紫色向量找朋友的时候没有与所有的其他向量进行比较,只比较了子集,因此只能称为:Approximate nearest (friendly) neighbors算法。假设我们将英法翻译得到词向量用紫色表示,然后使用了三组不同的随机平面进行划分,得到最紫色向量最邻近的结果也有三组,分别用三种颜色表示。在法语词向量空间中找到与转化结果最接近(相似)的词向量,最相似的单词就是翻译的候选单词,例如找到chat,就是法语中的cat。例如下图中的橙色和蓝色向量。
2024-07-05 12:52:25
1189
原创 04.C1W3.Vector Space Models
这里的Manipulating Words,是指对词向量的加减(平移向量),使得我们可以计算对应关系,例如:已有国家和首都的词向量空间,已知漂亮国首都是DC(漫威表示不服),求大毛的首都是什么。语料库中各个类型的文章单词数量不相同,这里的Agriculture和History文章单词数量基本相同,而Food文章单词较少。可视化可以让我们很直观的看到单词的相似性,当单词的向量表示通常是高维的,需要我们将其降维到2D空间便于绘图,这里先学其中一种降维写方式:PCA。这里n取值在1到词表大小之间。
2024-07-04 13:47:35
975
原创 03.C1W2.Sentiment Analysis with Naïve Bayes
概率与条件概率及其数学表达贝叶斯规则(应用于不同领域,包括 NLP)建立自己的 Naive-Bayes 推文分类器假设我们有一个推文语料库,里面包含正面和负面情感的推文:某个单词例如:happy,可能出现在正面或负面情感的推文中:下面我们用数学公式来表示上面的概率描述。AAA表示正面的推文,则正面的推文发生的概率可以表示为:P(A)=P(Positive)=Npos/NP(A)=P(Positive)=N_{pos}/NP(A)=P(Positive)=Npos/N以上图为例:P(A)=
2024-07-03 21:27:10
1392
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅