- 博客(26)
- 收藏
- 关注
原创 Vision Transformer【ViT】学习笔记
模型架构图整体介绍首先将图片切分成为9宫格,每一个小块为一个patch,再展平为1维向量,再经过一个线性层(MLP)投影成为我们规定的维度(对应于Transformer里面的将token向量化的过程)。由于图片切分之后分别输入到网络中,此时位置信息会被打乱,此时需要positional embedding对位置信息进行编码,再进行自注意力的计算。在Encoder的最后,每一个token都对应一个输出,应该用哪一个作为输出分类呢?借鉴bert,Extra learnable {class} em
2022-05-07 16:53:55 415
原创 Transformer学习笔记
模型架构图Transformer用于自然语言处理(NLP)中的机器翻译模型。Transformer是典型的编码器-解码器架构。encoder 将 (x1, x2, … , xn)(原始输入) 映射成 (z1, z2, …, zn)(机器可以理解的向量)例如:一个句子有 n 个词,xt 是第 t 个词,zt 是第 t 个词的向量表示。decoder 拿到 encoder 的输出,会生成一个长为 m 的序列(y1, y2, … , ym)。m和n可以一样长可以不一样。编码器和解码器的区别:编码
2022-05-06 19:07:37 3695
原创 希 尔排序
希尔排序希尔排序原则上是对插入排序的优化插入排序在大量元素基本有序的情况下,插入排序的工作量是比较小的,因为这种情况下,不需要进行频繁的比较和交换。例如,1、2、3、4、5,用插入排序排序时,每一个轮回的待插入的元素都比有序区的最后一个元素大,因此不需要进行交换,待插入的元素的位置就是排序后的位置。因此,我们可以将数列先进行预处理,让数列整体上有序,即“粗略调整”,以此来优化插入排序,这种方法就是希尔排序。下面用一个例子演示希尔排序的过程。首先对元素进行分组,第一次分组是两两分组,分组的跨度是
2022-01-06 16:31:43 320
原创 插 入排序
插入排序插入排序和玩扑克牌一样,每一次迭代都选去当前元素最合适插入的位置,每一次选都从高往低找这个合适的位置。首先选第一个元素为有序区第一轮,8>5,所以无需交换。第二轮,6<8,则交换,6>5,无需交换。每一轮结果如下:优化待插入的元素在未到达最终位置的时候,会交换很多次,这是一个缺点。此时可以将当前待插入的元素暂存起来,然后将有序区的元素逐一向后复制。例如,当前需要寻找待插入元素3的位置,可以用insertValue将3存储起来。上代码(优化之
2022-01-06 15:47:30 556
原创 选 择排序
选择排序选择排序是从无序数列中选择最小(大)的一个放到有序区的最后面相比冒泡排序方法而言,减少了大量的交换。上代码 public static void selectionsort(int[] array) { for (int i = 0; i < array.length - 1; i++) { int minIndex = i;//默认无序区第一个为最小值 for (int j = i + 1; j < arr
2022-01-06 15:24:09 353
原创 桶 排 序
桶排序和计数排序一样,都是线性时间的排序算法。每一个桶(bucket)代表一个区间范围,里面可以承载一个或多个元素。假设有一个非整数数列如下:4.5,0.84,3.25,2.18,0.5。桶排序的第1步,就是创建这些桶,并确定每一个桶的区间范围。具体需要建立多少个桶,如何确定桶的区间范围,有很多种不同的方式。我们这里创建的桶数量等于原始数列的元素数量,除最后一个桶只包含数列最大值外,前面各个桶的区间按照比例来确定。区间跨度 = (最大值-最小值)/ (桶的数量 - 1)第2步,遍历原始数列,
2021-12-29 16:02:14 989
原创 计 数排序
计数排序适用于整数,且最大值和最小值的相差不大的范围内的数列。线性复杂度的排序算法。例,有20个随机整数:9,3,5,4,9,1,2,7,8,1,3,6,5,3,4,0,10,9 ,7,9以上数列的取值范围为0-10,11个数字建立一个大小为11的统计数组每一个整数按照其值对号入座,同时,对应数组下标的元素进行加1操作。例如第1个整数是9,那么数组下标为9的元素加1。然后对每一个数字进行上面的操作之后得到以下数组:每一个下标位置的值代表数列中对应整数出现的次数。直接遍历数组,输出数组
2021-12-29 15:51:29 593
原创 堆 排 序
堆排序二叉堆的特性:最大堆的堆顶是整个堆中的最大元素;最小堆的堆顶是整个堆中的最小元素。以最大堆为例,如果删除一个最大堆的堆顶(并不是完全删除,而是跟末尾的节点交换位置),经过自我调整,第2大的元素就会被交换上来,成为最大堆的新堆顶。慢慢地进行这种删除,得到的序列就是一个从大到小的序列,而较大的一头先交换到了数组末尾一端,较小的则留在了数组头部一端。这样就实现了排序。堆排序算法的步骤:把无序数组构建成二叉堆。需要从小到大排序,则构建成最大堆;需要从大到小排序,则构建成最小堆。循环删除堆顶元素,替
2021-12-28 21:22:47 65
原创 优先队列(二叉堆的应用)
优先队列(二叉堆的应用)用最大堆来实现最大优先队列每一次入队操作就是堆的插入操作,每一次出队操作就是删除堆顶节点。上代码:public class PriorityQueue { private int[] array; private int size; public PriorityQueue(){ //队列初始长度32 array = new int[32]; } /** * 入队 * @para
2021-12-28 21:06:13 193
原创 二叉堆及其基本操作
二叉堆最大堆最大堆的任何一个父节点的值,都大于或等于它左、右孩子节点的值。最小堆最小堆的任何一个父节点的值,都小于或等于它左、右孩子节点的值。二叉堆的自我调整插入节点插入位置是完全二叉树的最后一个位置。然后慢慢上浮合适的位置,直到满足根节点都比孩子节点都小即可。删除节点删除的是处于堆顶的节点。把堆的最后一个节点10临时补到原本堆顶的位置。节点10和它的左、右孩子进行比较,和最小的一个交换即可。构建二叉堆把一个无序的完全二叉树调整为二叉堆,本质就是让所有非叶子
2021-12-28 21:00:13 285
原创 快速排序(二十世纪十大算法之一)
快速排序每一个轮回随机(或直接选第一个)选一个基准元素,让所有大于该基准元素移动到右边,所有小于该基准元素移动到左边,从而将数列拆分为两部分;继续对上述两部分子数列实施这种拆分,直到不可分为止。此种方法正是分治法的核心思想。在每一轮的比较和交换,需要将所有元素都遍历一遍,需要的时间复杂度是N;而这样的遍历是需要logN轮的,所以总的时间复杂度是O(NlogN)。需要完成整个过程,基准元素的选取和元素交换方式是重点。...
2021-12-28 19:48:06 299
原创 冒泡排序及其优化
冒泡排序相邻的两个元素比较大小,如果当前元素比右侧元素大的话就交换,否则不交换;总共排N-1个回合,每一个回合挑选出无序区中最大的元素;一个回合要比较N-1次,总共有N-1个回合,因此时间复杂度是N*N;最原始的版本(也是第一次学数据结构试图背下来的算法!) public static void sort(int array[]){ for(int i = 0; i < array.length - 1; i++) { for(
2021-12-26 20:12:14 97
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人