- 博客(69)
- 收藏
- 关注
原创 学习Se-net和Sk-net 附网络简单代码(pytorch)
所以这里我们首先需要抽象提取出每一个通道的整体特征参数,这里根据论文的测试,选用的全局平均池化,它将维度从(1,64,255,255)可以变化为(1,64,1,1)然后通过全连接->激活->全连接->sigmoid的连接获得每一个通道的权重参数。这个过程也可以是其他网络的操作过程。以下只给出一个网络本身的定义,代码还是很好理解的,在 super里定义清楚每一层的输入输出量就可以了,这里指的注意的是他有一个reduction量,他是用来调节线性层负责度的参数,在综合性能和复杂度的基础上选择16作为默认值。
2023-05-17 20:33:51
2286
原创 剑指 Offer II 031. 最近最少使用缓存
put():如果存在key就修改值,同时移动,这里和put差不多。如果不存在就new一个新节点,并且插入链尾,size++,如果size超过了capacity就删除链头节点。第二个操作是put,修改对应key的值,如果不存在就new一个,如果超过上限就去掉第一个(使用率最低的)。这里等于是构建一个双向链表,链表的值的部分是一个哈希表,他的作用是可以使用哈希表很快的找到链表的指定节点。get():判断是否已经有这个值,如果有这个值,就返回对应的value,并且将这个节点移动到最后。①删除某个位置的节点。
2023-05-05 11:14:13
208
原创 MMediting1.X进行视频超分训练和测试(BasicVsr++)
这里值得说的是REDS数据集,在mmediting里面它将原数据的训练和验证两个部分的数据进行了拼贴,然后通过一个参数文件(这些按照官方文件给的参数文件生成代码进行生成就好了)控制那一段数据是训练,哪一段是验证数据,这样可以便于后面的测试。在保存的测试结果里面,我们可以看到日志,参数配置,和图片最后超分的结果,这里给出同一帧位置图像处理前后图片的分辨率,可以看到第一张图为原图片,第二张图为超分之后的结果,可以看出来明显第二张细节更清晰了。按照官方给出的标准测试指令进行测试,下图就是测试的结果了。
2023-05-04 22:04:55
1376
1
原创 剑指 Offer II 029. 排序的循环链表
主要是考虑插入情况,如果插入的数在两个数中间,就直接插入,如果没有这种情况,那么这个数一定是大于最大值或者小于最小值的情况下,那么它一定是插入最大最小值节点中间的。当然第一步要找到最大值的节点。其次考虑边界情况,如果整个链表中没有一个节点,那么直接插入,next指向自己。如果链表中只有一个节点,那么插入后互相连接就行了。
2023-05-04 10:29:48
127
原创 剑指 Offer II 028. 展平多级双向链表
展平的规律是一个节点的子链展平后之后将插入该节点和它的下一个节点之间。也就是我们如果查到一个节点有子链,那么我们需要知道子链的最后一个节点,这样再把最后一个节点的next指向主链的next,再修改prev的值,就能实现插入子链的操作了。因为子链还可能有子链,所以我们要用遍历的方式。
2023-05-04 09:44:41
48
原创 剑指 Offer II 026. 重排链表
插入链表是最复杂的一步,因为当你修改一个结点的next的时候,会覆盖掉后面的所有元素,所以最重要的就是提前保存后面的元素,并在移动中循环起来这一过程。这里新增两个指针,一个为temp它的作用是保存主链中的下一个元素,一个为pre的它作用是保存副链中的下一个元素。因为快指针有可能最后一次不能移动2步,所以移动一步后就要判断是否为空,不为空继续移动,移动后也有可能为空或者不为空这两种情况,所以循环的条件就是快指针为空,或者让快指针下一步为空,这样就能保证循环条件符合要求了。这里使用递归的方式,直接反转。
2023-04-26 11:04:17
134
原创 剑指 Offer II 020. 回文子字符串的个数
(1)如果一个回文字符串是奇数长度,则回文中心是一个数,相反是两个数,所以我们要统一奇数和偶数的情况,一个位置上的数它可能是奇数的回文中心,也可以和它的下一位数构成一个偶数回文中心,所以我们要分别对本位和本位+下一位进行讨论。每一次讨论时都是从中心开始左移和右移指针去判断是否为回文子串,所以讨论的代码时不变的。这样我们就可以写出一个函数专门去讨论是否为回文,主函数负责传送字符串和回文中心的位置。
2023-04-21 09:29:50
81
原创 剑指 Offer II 019. 最多删除一个字符得到回文
这个思路是必然的,不会存在从中间删除等可能性,一定是当第一次出现字符串的时候就开始删除。所以我们需要有一个flag去判断我们进行的是第几次删除,还需要有两个变量记录我们的第一次删除的位置,从而,在第一次删除后并不是回文的情况下,回到开始的情况,删除另一侧。当然这个题,我们还可以在判断的过程中,考虑递归,因为删除字符后,还是对子串进行回文判断,可以用递归的思维。①删除左字符(左指针右移),继续判断剩余是否是回文。②删除右字符(右指针左移),继续判断是否为回文。(1)判断是不是回文用的还是双指针的办法。
2023-04-19 15:07:06
110
原创 剑指 Offer II 018. 有效的回文
两边的指针如果遇到不是字符的数就移动,然后进行比较,这里需要处理的是,如果字符是偶数和奇数的时候,怎么去设定终止条件,这里的终止条件最好写为left=right,这样偶数和奇数就不影响结果了。使用isalpha()函数判断字符是否是字母,使用tolower()函数强制将字符改为小写,使用sgood.rbegin(), sgood.rend()扭转字符串,然后将新字符串和老字符串进行比较,比较偷懒的做法。
2023-04-19 10:55:26
70
原创 剑指 Offer II 017. 含有所有字符的最短字符串
如何判断是否所有字符都出现呢,因为我们有短串的字符长度,所以我可以用长度作为变量来统计是否所有字符都出现,也就是说出现一次,长度-1,这样当长度为0的时候,表示所有字符都出现了。如果,”A“这个字符第一次出现的时候,对应哈希表的值为1,当值大于0的时候表示该字符第一次出现,就可以把值变为0,同时长度-1。②如果对应这个值为0就代表如果我再移动,剩下的子串就不包含这个字符了,也就是不再是符合要求的子串了,这个时候就可以计算长度了。②其他情况,这里就对应该字符是重复字符,对应的哈希表的值必须++,然后再右移。
2023-04-19 09:59:55
170
原创 剑指 Offer II 014. 字符串中的变位词 剑指 Offer II 015. 字符串中的所有变位词
这里的滑动窗口的核心思路是,先截取长串中的第一个长度为短串的子串,然后右指针右移++,左指针右移–,分别代表加入一个新数和减少一个旧数,这样就能找到子串了。
2023-04-17 18:03:45
72
原创 剑指 Offer II 010. 和为 k 的子数组
我们用前缀和去做,遍历一次数据,将前N个数字的和作为key保存在哈希表里面,如果有重复则value+1。让哈希表的第一个键为(0,1)也很重要,这表示刚好我们遍历的第N个数的前N项和就是等于k的。时间复杂度太高了,运行超时了。:时间复杂度o(n^3):时间复杂度o(n^2):时间复杂度o(n)
2023-04-12 10:55:28
73
原创 剑指 Offer II 009. 乘积小于 K 的子数组
因为这个题会遇到需要遍历子串,所以第一时间想到的应该是滑动窗口。这题的滑动窗口唯一的不同是计算子串的数量,因为和求最大最小子串不一样,这个题要求所有的子串数量,所以需要找规律来获得子串数量。也就是:以下这个代码行比较难理解,为什么此时对应的就是需要的子串。
2023-04-12 09:34:07
54
原创 剑指 Offer II 008. 和大于等于 target 的最短子数组
这里得主要代码思路就是右指针不停在走,一直到第一次满足条件。之后左指针走,并逐步删除左边的元素,知道不满足条件后,右指针向右走,这样就能达到遍历符合要求的子串的效果了。sums保存的是累计和,比如sums[2]表示nums前两个数据的和。lower_bound是现成的库和函数来为我们实现这里二分查找大于等于某个数的第一个位置的功能。(1)因为这道题要遍历子串来获得对应得子串长度,所以考虑。时间复杂度:O(nlogn),时间复杂度:O(n),空间复杂度:O(1)。空间复杂度:O(n)。
2023-04-11 18:20:35
55
原创 【OrientedRepPoints】Oriented RepPoints for Aerial Object Detection核心点概括
对于航拍图像中密集分布和任意朝向的目标,由于缺乏直接监督,学习高质量的点对于自适应地捕获几何特征是十分重要的。为此,本文提出一种评估和分配方法来度量学习点的质量,可以在训练阶段将自适应点的代表性样本分配为正样本。:选择正样本的IoU阈值,引入了匹配性度量来评估基于角度锚框的空间对齐程度,它使用了对齐敏感损失来加强分类和方向定位的相关性。(4)采用凸包表示来学习不规则的形状和排布,通过可学习的特征自适应来避免特征混叠。:本文提出的基于点集的方法是对非轴向对齐的航拍目标来提取关键特征。
2023-04-10 20:38:17
771
原创 剑指 Offer II 006. 排序数组中两个数字之和
(2)二分优化:时间复杂度o(logn),空间复杂度(nlogn)(3)哈希表:时间复杂度o(n),空间复杂度(n)(4)双指针:时间复杂度o(n),空间复杂度(1)(1)暴力求解:时间复杂度o(n^2)
2023-04-10 17:53:54
53
原创 剑指 Offer II 005. 单词长度的最大乘积
在具体比较字符串的操作中,使用哈希表,将第一个字符串的数据放进哈希表,用遍历第二个字符串的所有字符,有在哈希表里查到就返回,不再考虑。(2)位运算求解的思路是,因为只有26个字母,可以通过将一个字符串转换成2进制,然后通过二进制的位运算来判断是否有重复的字母,如果用与运算来比较2个字符串的二进制,如果为0则代表没有一位是重复的,也就是没有重复的字母,否则一定有地方是相同的,这样就能判断是否有重复字母了。(1)哈希表暴力求解。
2023-04-06 10:29:27
83
原创 剑指 Offer II 004. 只出现一次的数字
(1)运用哈希表,遍历nums中的所有数据,把数值当作key,没出现一次,其对应key的value+1,遍历完成后,再循环一次哈希表,如果value等于1就输出它的key,就是要求的数据了。(2)位运算的思路是遍历32次,每一次代表int的一个位数,将所有数的对应位加起来,如果这一位能够被3整除(也就是对应位是0或者3)代表一次出现的数这一位为0,如果不能被整除就为1。(2)位运算:时间复杂度o(nlogc),空间复杂度o(1)(1)哈希表:时间复杂度o(n),空间复杂度o(n)
2023-04-05 16:28:34
56
原创 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数
(2)如果一个正整数i是一个偶数,那么如果将它二进制数右移一位,就等于求得了它i/2。一个数i如果它是偶数,它的二进制数中1的次数等于i/2的二进制数中1的个数。如果数是奇数,那么它会多1。所以如果我们逐步从0开始,就能逐步得出结果了。这个方法也有点像经验法找规律。(1)可以使用暴力破解法,对于每一个数,因为它的二进制位数是一定的,再遍历32次,统计1的次数,就可以统计出每一个整数的二进制中的1的次数了。i >> 1等于就是求i/2,i&1就是求它是偶数还是奇数,这里很巧。
2023-04-04 15:09:10
58
原创 剑指 Offer II 002. 二进制加法
采用了一个很巧妙的carry,就这一个变量就能决定本位和是否进位。判断a,b当前位是否为1,为1的话carry就+1,这样两个1carry就为2,对2来取余来决定本位是1还是0。最后再写一个自己写的代码,思路是一样的,就是对数据反转的时候,我选择了直接对差位的数据进行补0,在求本位和进位的时候也比较麻烦,选择了逐步判断,这样太浪费时间和空间了。这样相加之后再反转,就和原本的值是一样的。(1)因为如果给的是大数,直接转换成十进制会出现 数据溢出的情况,所以我们要直接对字符串进行处理。最后计算完再反转数据。
2023-04-04 10:30:24
78
原创 剑指 Offer II 001. 整数除法
每一次计算的结束条件是value大于等于0并且下一次累加后不能小于等于被除数。中间用一个变量去存储加的次数,作为商的值,再用一个变量累加每次的商值,作为最终商值。(2)正整形数据的最大数据是2^31-1而负整形数据是2的31次方,所以如果我们直接将负数转变为正数来求是会发生越界现象的。首先有处理边界情况,也就是INT_MIN/-1这种情况,然后我们根据原本数据的正负来确定最后数据的正负,并将数据转变为两个负数。(1)将减法求商变成倍数来求商,可以从o(n)变成o(logn)(2)考虑数据溢出的问题。
2023-04-03 19:22:33
39
原创 剑指 Offer 17. 打印从1到最大的n位数
用start这个变量去删除多的0,因为一个位置上的数最多只有0-9,所以采用一个循环,先确定最高位,通过递归dfs(x+1,len)可以再来遍历下一位的0-9,这样把每个数都放在字符串里面。printNumbers函数主要是通过传递n,来确定所有打印的数据依次是几位的,也是分治的思想,也就是若n=5,那么第一次循环i=1就是打印一位的数,第二次循环i=2打印的就是两位的数。(2)在考虑大数的情况下,需要考虑大数越界的情况,因为整形的数据都是有界限的,所以一般用string来储存大数。
2023-03-31 10:36:07
80
原创 剑指 Offer 29. 顺时针打印矩阵
边界压缩法,整个遍历满足从左至右,从上至下,从右至左,从下至上这个顺序循环遍历,每一次到位后,对应边界都要收缩,结束条件是读完所有数据,也可以按照边界去划定结束条件。要注意的是要先判断矩阵是不是为空,不然获取不了矩阵的长度和宽度。时间复杂度为o(mn),空间复杂度为o(1)。
2023-03-31 09:57:22
42
原创 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
首先数组不为空才能执行这样的算法,其次数组如果只有一个元素,直接返回数组。结束条件是i+1=j或者i==j也就是对应数组长度为奇数和偶数两种情况。(2)一遍遍历数组, 奇数就让新数组左边放这个数,再让左指针++,偶数让右边放这个数,再让右指针++。遍历数组,将偶数和奇数的数分别保留在一个数组里,最后将偶数数组拼贴在奇数数组后就可以完成。思路是左指针遍历奇数,右指针遍历偶数,当左指针的值为奇数,右指针为偶数的时候,交换值。(1)开创一个和nums相同的大小的数组。要学会下面这种遍历数组的方法。
2023-03-30 11:22:45
47
原创 剑指 Offer【数组】 03. 旋转数组的最小数字
设最小值为旋转点,旋转点左边的数都大于旋转点,右边的数都小于旋转点,所以设立左,右,中三个位置,比较右和中值得大小,如果中大就代表旋转点不在左侧,同理可以得到其他得情况,通过移动左右位置继续判断旋转中心,当左右位置相同时,就代表找到了最小值的位置。由于旋转数组和本题原数组是升序的特性,只要数组出现后一个数小于前一个数,那么后一个数一定是数组的最小值,采用遍历的方法,分别比较前一个和后一个数进行比较就能找到最小值。在一个数组中查询最大最小值一般采用二分法,即控制两个指针,从两边逼近。
2023-03-30 09:47:35
38
原创 剑指 Offer【数组】 03. 数组中重复的数字
遍历中,第一次遇到数字 x 时,将其交换至索引 x=x 处;而当第二次遇到数字 x 时,一定有 nums[x] = x ,此时即可得到一组重复数字。这道题值得注意的是,要注意空间复杂度和时间复杂度,要和面试官进行交流,询问是要追求空间还是追求时间,还要询问原数组是否可以修改。:时间复杂度为o(nlogn),空间复杂度为o(1),不修改原数据。这道题本身是寻找数字,这样就可以直接考虑哈希表来做。:时间复杂度为o(n),空间复杂度为o(1),修改了原数据。:时间复杂度和空间复杂度都为o(n),不修改原数据。
2023-03-29 21:05:20
76
原创 LeetCode_C++_4.寻找两个正序数组的中位数
这里大致的思路是,分别找到两个数组中的中间的某个元素,他们两个的前面的元素,有些一定不是中位数,可以删除,再将新的数据进行类似操作,就可以夹逼出处于中间的数。这里的思路比较抽象,他是寻找两个数组中的分割线,根据不同的数组长度可以找到分割线的规律和对应的中位数长度,再考虑特殊数组下的边界条件,就能找到中位数。这种思路明显速度太慢的,不能满足时间复杂度为o(log(m+n)) 的目的。首先这样的二分查找建立在有序数组的基础上。(2)采用二分法进行查找中位数。
2023-03-29 10:53:40
137
原创 LeetCode_C++_3.无重复字符的最长子串
在滑动窗口的代码中,如果我们遇到字符串为pwwkew因为有两个连续的W我们希望的是让左指针直接来的第二个W,根据代码我们可以先让左指针直接跨越右指针来到右边,再让右指针移动过去。通过代码就是让左指针指的W的指变为-1,这样就可以让右指针指的对象的值不为0,继续移动。使用哈希表可以通过将左边的元素不停的消除来达到目的。核心的滑动窗的代码是不变的,但是我们需要。
2023-03-28 21:00:18
69
原创 LeetCode_C++_2.两数相加
1.在涉及到要进位的加法的时候,本位等于sum%10(取余),进位可以用一个bool变量来表示,当sum>10 变量为true,否则为false。2.链表的长度用一个变量去表示,用指针去移动,指针不为空变量就++,直到为NULL。3.用指针去维护链表的数据。三个链表是同时移动的。4.补位,通过比较长度,将少的那一个链表后面补0。1.加法进位的问题。2.链表的长度求解。
2023-03-28 15:41:59
87
原创 LeetCode_C++_1.两数之和
两遍哈希表的思路是,先把数组变成哈希表,再在其中查找,需要用到2个循环,如果在插入的时候就进行判断,就可以只用一遍哈希表。而且这样的好处是,一定不会和自己做比较。因为实际上是要通过数组元素,最后输出下标,所以可以将元素和下标构成哈希表,这样可以直接对一个元素的另一半元素进行查找。使用哈希表可以大量节省时间,但是所占用的空间明显变多。: 数组,目标值**
2023-03-28 15:06:16
82
原创 Transformer基本代码实现(输入部分实现)
我们想要将绝对位置矩阵变成(句子长度,词维度)的大小,这需要有一个变换矩阵div_term。绝对位置矩阵的大小为(0,句子长度)它的值为连续自然数,在使用unsqueeze方法拓宽矩阵的维度,使得它变成一个(句子长度,1)的矩阵。要和embedding进行输出,我们就要对矩阵进行升维,最后将编码注册成模型buffer,因为这个矩阵没有参数,不需要后续更新,从一开始就可以固定了。还需要对数据进行一些处理,将这个三位张量的第二维也就是句子的最大长度的那一维将切片到与输入的X的第二维相同。还要适配句子长度等。
2023-03-27 21:31:17
454
原创 Transformer模型架构解析
Add&Norm模块首先将Attention后的向量和初始未经Attention的向量做加法,然后经过一个layer norm模块,最后输出的还是一个4x3的数据(即矩阵大小不变,在这个模块里也有可以训练的参数)。输入起始Token----->预测第一个单词(与第一个单词做交叉熵损失)----->Token和第一个单词一起----->预测第二个单词(与第二个单词做交叉熵损失)----->……和(-1.0574,-0.1188),(-0.5713,-0.2351),(-0.225,-0.4327)
2023-03-21 20:48:01
247
原创 Attetion机制在LSTM中的使用(Seq2Seq)(Attetion主要做了什么)
在翻译系统中使用LSTM,假如使用其来分析一个句子,如果这个句子被拆分成3个词向量,那么在LSTM中,会输出3个h矩阵。具体来说,Attention就是要确定哪一个词对于这一句话的生成(翻译)等最重要,这对于处理长句子是非常有用处的。这里将三个h矩阵输入Attetion模块中去计算,会输出一个context vector矩阵。Attention机制就是注意力机制。
2023-03-20 21:27:35
143
原创 RNN和LSTM(BI-LSTIM)介绍
对于序列建模的任务来说,每一个时刻的未来信息和历史信息同等重要,标准的LSTM模型按其顺序并不能捕获未来的信息。简而言之,在计算下一次的信息的时候,会将上一次计算的信息加入这一次的计算,这就是循环的意思。σ的输出在0到1之间,可以看到ft与c(t-1)做逐位乘法,这样如果ft对应的位置为0,那么细胞层对应位置的信息也会被清楚,这样就达到遗忘的目的。在pytorch中公式有差别,但是思想是类似的,将相同的网络拼贴起来就是大致的总网络结构了,总之LSTM记住需要长时间记忆的,忘记不重要的信息。
2023-03-20 20:01:16
904
原创 Disasters_on_social_media
对于这个题目,有用的数据只有text(新闻内容),choose_one(是否和灾难等有联系)。为了便于后续的机器学习还要把不能被识别的choose_one转换为简单编码的形式。社交媒体上有些讨论是关于灾难,疾病,暴乱的,有些只是开玩笑或者是电影情节,我们该如何让机器能分辨出这两种讨论呢?通过这种分词,直接将数据分成list的形式。采用正则化的方法,删除掉文本内不要的部分。
2023-03-14 16:34:35
166
原创 Bag of Words Meets Bags of Popcorn(W2V)影评分析
Word2vec的主要的作用就是减少了词向量的维度,同时解决了one-hot情况下向量稀疏度过大的问题(0太多了)。所以将得到的1x1000的向量经过一个1000x50的未知参数矩阵w1后得到1x50维度大小的矩阵,这样就缩小了原本向量的大小。使用W2V,在上述的代码中,我们仅仅是使用语料将每个词的词向量表示出来,而我们最终的目的是得到影评结果,也就是通过分析一句话,所以,我们需要获得一句话的向量,这里简单的将一句话所有词的词向量叠加后求均值,作为一句话的句向量处理。成都[0,1,0,0,0……
2023-03-13 19:45:11
104
原创 Bag of Words Meets Bags of Popcorn(词袋)影评分析
评论的情绪是二元的,即IMDB评分< 5的情绪得分为0,评分>=7的情绪得分为1。他可以展现一篇预料出现的词语种类和数量,它本身比较简单,也有稀疏性和语义性的问题,但是比较适合初步了解NLP。取自于https://www.kaggle.com/c/word2vec-nlp-tutorial/data,Kaggle中的一个赛题。对于我们分析情感是没有用,所以也要去掉。接下来我们需要创建特征模型,并进行训练,这里要指出的是,词袋模型并没有涉及到词向量等内容。查看出现次数较多的词语的出现次数。
2023-03-12 20:49:06
302
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人