- 博客(53)
- 收藏
- 关注
原创 pytorch实现残差网络restnet50
残差网络块为: 首先有输入通道, 输出通道, 用一个变量接受输入的x, 只有另一条路对这个x进行卷积运算。
2022-05-11 22:31:28 2612 1
原创 pytorch对网络层的增,删, 改, 修改预训练模型结构
1.我们使用vgg11网络做示例, 看一下网络结构:加载本地的模型:vgg16 = models.vgg16(pretrained=False) #打印出预训练模型的参数vgg16.load_state_dict(torch.load('vgg16-397923af.pth'))加载库中的模型import torchimport torch.nn as nnfrom torchvision import modelsnet = models.vgg11(pretrained
2022-05-07 23:53:24 11828 10
原创 pytorch加载自己的图片数据集的两种方法
pytorch加载图片数据集有两种方法。1.ImageFolder 适合于分类数据集,并且每一个类别的图片在同一个文件夹, ImageFolder加载的数据集, 训练数据为文件件下的图片, 训练标签是对应的文件夹, 每个文件夹为一个类别在Flower_Orig_dataset文件夹下有flower_orig 和 sunflower这两个文件夹, 这两个文件夹下放着同一个类别的图片。 使用 ImageFolder 加载的图片, 就会返回图片信息和对应的label信息, 但是label信息是根据文件
2022-04-20 22:46:44 22078 10
原创 pytorch预测泰坦尼克号生还率 pytorch加载csv数据集
先看一眼我们拿到的数据: 在数据中有浮点数, 有字符串, 现在我们要做的就是制作满足pytorch条件的数据集。1.先加载数据集2.选出我们需要的行3.将字符串类型数据转换成浮点数型4.将数据集保存在新的excel文件中1.使用pd.read_excel()方法读取excel表格中的数据#读取到excel文件中的数据集path = r'D:\数据集\泰坦尼克号\泰坦尼克号.xls'all_df = pd.read_excel(path)2. 选择出我们训练所..
2022-04-20 21:45:01 1711 2
原创 并查集(Disjoint Set)也叫不相交集合
概念描述: 将编号分别为1.......N的N个对象划分为不相交集合, 在每个集合中,选择其中某一个元素代表所在集合。常见的两种操作:1. 合并两个集合2. 查找某元素属于哪个集合实现方法(1):用编号最小的元素标记所在集合;定义一个数组Set[ 1....N ], 其中Set[i]表示元素i所在的集合, 用下标1...N表示N个元素构建数组:当想知道下标3属于哪个集合, 返回 Set[3]=1 说明下标3这个元素属于1集合。合并两个集合, a, ...
2022-02-15 19:36:08 362
原创 Triplet损失(三元组损失)
Triplet损失, 意味着需要同时看三个图片, Anchor图片, Positive图片,Negative图片。(Anchor图片与Positive图片意味着是同一个人, Anchor图片与Negative图片意味着不是同一个人的图片)当Anchor图片与Positive图片对比时, 想让输出距离越小,当Anchor图片与Negative图片对比时, 想让输出距离更大一点。d(Anchor, Positive) = | f(Anchor) - f(Positive) |²d(
2022-01-30 19:45:51 4982
原创 One-Shot学习 (一次学习)
人脸识别: 你需要通过一张人脸样例去识别这个人,当深度学习只有一个样例时候,模型的表现并不好,所以使用One-Shot学习解决!One-Shot Learn:通过一个样本来进行学习,以能够判断这个人是不是已有数据中的人脸。在人脸识别中使用“similarity”function来处理人脸识别单一数据的问题。similarity function:d(img1, img2) = degree of difference between images.(两张图片的差异值)if d(img1
2022-01-30 18:52:35 4071
原创 YOLO算法
使用两个anchor box, 所以输出是3*3*2*8。首先将一张图片分成3*3的方框, 要构造训练集,需要遍历9个格子, y表示每一个格子的输出向量此时,第一个格子没有行人,汽车,摩托车, 所以第一个格子的两个pc值都为0。第八个格子: 输出值 y=[0??????? 1 bx by bh bw 0 1 0], anchor box 2与真实物体框的IoU值比anchor box 1与真实物体框的IoU值更大,那么车子就和向量的下半部分相关此处把图片划分成3*3的大小, 实际应...
2021-12-15 22:17:28 2075
原创 出栈顺序——
有一串数据 a, b, c,d, e.不可能的出栈顺序为: 因为是依次入栈, 所以前面元素不可能比后面元素先出栈。如 不可能b出栈后, c再出栈, 应该是c出栈后, b才有机会出栈。
2021-12-07 19:41:48 656
原创 二叉树的叶结点/ 树的深度计算
二叉树叶子结点的计算:二叉树叶子结点总数等于左子树的叶子结点 + 右子树的叶子结点,判断是不是叶子结点 , 如果是返回1 ,如果不是叶子结点,继续递归。线序计算二叉树结点个数:首先定义一个全局变量 leftNum, 如果是叶子结点,就让叶子结点计数器leftNum++;如果不是叶子结点,就递归子树,找子树的叶子结点,遇见叶子结点,计数器leftNum++;int BiTree::CountLeaf(node *bt){ if(bt->lchild==NULL &a.
2021-11-29 13:57:33 6537
原创 防止过拟合(Dropout, early-stopping, L1和L2正则化)
过拟合情况:在深度学习算法时,不仅要求在训练集上误差小,而且希望在新样本上的泛化能力强,许多机器学习算法都采用相关的策略来减小测试误差,这些策略被统称为正则化。当在测试集添加一点点的噪声,那么模型的准确率就会有很大影响过度拟合的根本原因: 1.权重参数太多, 2.样本数量不足正则化通过对算法的修改来减少泛化误差,目前深度学习中使用较多的策略有提前停止, Dropout,L1与L2正则化:正则化的作用:...
2021-11-16 16:10:52 1056
原创 梯度下降优化算(Momentum, AdaGrad, RMSprop, Adam)学习率退火
梯度下降算法在进行网络训练时,会遇到鞍点,局部极小值这些问题,要解决这个问题,就提出了动量(Momentum) 算法;1.指数加权平均:当没有使用加权平均时的结果噪音比较大, 如:Yt表示t时刻的真实值 St表示t加权平均后的值,β为权重值运算步骤: 就是用前一天结果的0.9倍 加上 今天结果的0.1倍作为今天的结果。以此类推加权平均的作用: 使最终的结果更加平滑,减少噪音。最终第100天的数据结果为:2. 动量算法(Momentum):...
2021-11-16 15:07:53 1551
原创 卷积神经网络( CNN )
卷积运算共享权重和偏置:每个隐层的神经元都有一个偏置和连接到它的局部感受野的5x5的权重,并且对这一层的所有神经元使用相同的权重和偏置。这一个隐层的所有神经元检测完全相同的特征,在输入图像的不同位置。这说明卷积网络可以很好地适应图片的平移不变性。共享权重和偏置.
2021-11-16 13:12:40 2927
原创 输入层-隐藏层-输出层的前馈反向传播
1. 输出层->隐藏层2.隐藏层:隐藏层中,J对神经元yi输出的值的导数等于 J对a的导数 乘 a对z的导数 乘 z对w的导数(这只是J对yi神经元输出的导数) ,因为做不到直接对yi输出求导, 则曲线救国, 因为输出a=sigmoid(z), 所以先求 J对a的, 再求a到z的, 再求z到w的, 链式求导得,J对yi输出的导数,这仅仅是对yi的输出导数, 若要求J对w的导数,根据J对输出求导, 输出a对z求导, z对w求导链式求导乘积才是输出层对隐藏层yi的w求导。...
2021-11-15 10:26:56 1734
原创 直接插入排序
方法类似于玩纸牌,基本思想是: 依次将待排序序列中的每一个记录插入到一个已经排好序的序列中,直到全部记录都排好序。排序过程:首先给定一个序列,序列是从i=1开始存储元素, 默认第一个元素是有序的.注意: 直接插入...
2021-11-12 15:36:52 885
原创 AOE网(带权有向无环图)
1. 用顶点表示事件, 用有向边表示活动,边上的权值表示活动的持续时间。 (事件:例如:完成外壳的生产, 活动:如生产外壳) 2. AOE网中没有入边的顶点称为源点,没有出边的顶点称为终点AOE网可以回答下列问题:1.完成整个工程至少需要多少时间 2. 为缩短完成工程...
2021-11-12 08:59:34 4011
原创 散列表的构建
散列表需要将关键码用散列技术进行存储,才可以进行散列查找,散列函数------除留余数法,开放定址法-----线性探测法(如果地址冲突,那就判断(a[i]+1)%p是否冲突,若不冲突,则放入数据, 若冲突,继续加1取余 )处理冲突的方法-----拉链法(链地址法)...
2021-11-11 22:53:26 1594
原创 二叉排序树
性质: 1. 若它的左子树不空,则左子树上所有结点的值均小于根节点的值 2. 如果它的右子树不空,则右子树上所有结点的值均大于根节点...
2021-11-11 22:26:33 775
原创 折半查找-
要求线性表中的记录必须是关键码有序,线性表必须采用顺序存储。思路:在有序表中,取中间记录作为比较对象, 若给定的值与中间记录的关键码相等,则查找成功,若给定的值小于中间记录的关键码,则在中间记录的左半区继续查找; 若给定的值大于中间记录的关键字,那就在中间记录的右半区查找, 不断重复,直到查找成功, 或者查找失败int Binart_Search(int a[], int n, int key){ int low, high,mid; //此数组从索引为1的位置开始查找 low ...
2021-11-10 16:24:23 1508
原创 AOV网--拓扑排序(必须是一个有向无环图)
特点: 1. AOV网用顶点表示活动,用弧表示活动之间优先关系, 2. AOV网中的弧表示活...
2021-11-10 15:38:23 2427
原创 最短路径(Floyd)
给定带权有向图 G=(V, E), 对任意顶点vi,vj 属于V,(i!=j) 求顶点vi到顶点vj的最短路径解决办法: 弗洛伊德提出的求每一对顶点之间的最短路径算法-----Floyd算法基本思想:对于
2021-11-06 16:02:18 796
原创 顺序表查找
顺序表查找是从末尾查找,但是一般的思路是判断数组元素和待查找元素k是否相等,之后再判断 是否越界(i>0), 需要两次判断,现在为了减少判断次数,则从索引 i=1开始存放数据,并且把待查找元素存储在索引i=0的位置, 之后开始遍历.代码实现:int SeqSearch(int r[], int n, int k){ //参数分别表示待查找数组,数组元素个数,待查找元素 r[0] = k; //设置哨兵,让待查找元素为 i=0的元素 i=n; ..
2021-11-05 10:03:34 1120
原创 Dijkstra算法(最短路径)
U为源点 S为未添加数组 邻接矩阵存放的是权值,创建dist[]数组,用来存放结点间的距离,首先将v结点加入U集合,之后更新dist[]数组的数值,再在U-S集合中找到一个权值最小的结点x,遍历x这一行,查看x到各个结点的距离,当x结点到m结点距离为5,此时用这个5去和dist[]数组到x的距离相加,如果相加得到的值比dist[]数组中的值小,则用这个值更新diist[]数组中到m中的权重值 ; 再次在dist[]数组中找最短路径**在dist数组中找最短路径是在未添加的数组值那查找,已经添加到源点的...
2021-10-31 17:53:15 16381 1
原创 图的一些常用术语.
顶点---------图中的每个数据元素,称为顶点. 没有结点的树称为空树,但是图中不能存在没有顶点的图.在图中任意两个顶点之间都有可能有关系,顶点之间的逻辑 关系用边表示.在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图,含有n个顶点的无向完全图有 (n * (n-1) / 2) 条边.在有向完全图中,如果任意两个顶点之间都存在互为相反的两条弧,称该图为有向完全图,含有n个顶点的有向完全图有 (n*(n-1))条边 假设有两个图G=(V,{E}) G`=(V`...
2021-10-30 10:00:24 191
原创 Kruskal算法--学习笔记
1.最小生成树是在图 (邻接矩阵) 中选择出一个权值累加和最小的树,所以自己首先需要构建一个图(邻接矩阵)。Kruskal和prim算法在存储结构上不同,因为Kruskal算法需要或者哪个是最短边,之前的存储方式需要遍历所有边才能知道哪个是最短边.问题1.如何判断被考察边的两个顶点是否位于两个连同分量? 答:根据所属的树是否有相同的根节点。...
2021-10-27 23:01:10 246
原创 最小生成树(Prim算法)笔记
引言:最小生成树是在图 (邻接矩阵) 中选择出一个权值累加和最小的树,所以自己首先需要构建一个图(邻接矩阵)。如: v0 --> v2 = ∞,说明v0到v2这两个结点没有边 v0-->v0=0,说明是自身结点 v1->v0=10,表示v1->v0结点的权重为10。思路:1给定以顶点v开始, 现在用v来初始化辅助数组shortEdge,2.给定其实结点v,从v结点开始生成树. 首先将v结点加入生成树.3.之后进入循环n-1次循环,因为n个顶点,v结点...
2021-10-27 21:30:10 2761
原创 简单选择排序
在一个数组中,让min=i,因为每次都网i插入,所以i前面是有序的第一个for循环是用来比较 n-1趟的,第二个for循环是从i开始往后的元素查找最小元素的下标, 当发现一个值比min的小,就更新min的值,这样没找到一个最小的,就给min,下次比较就和这个新的min值比较void selectSort(int r[], int n){ for(int i=0; i<n-1; i++){ //这个for循环是用来控制插入次数, int min = i; .
2021-10-24 19:05:05 1853
原创 快速排序学习笔记
每个子序列开始,以第一个元素作为中轴int partition(int a[], int first, int end){ int i = first; int j = end; while(i<j){ //这个循环是用来判断是否找到中轴 i<j说明没找到 while(i<j && a[i]<a[j]) //这个循环是,当右边的元素比中轴大时候,移动下标,不交换啊 j--; if(i<j){ //当j元素
2021-10-24 18:39:10 276
原创 冒泡排序优化
exchange-----用于记录最后一次交换的下标,从次位置以后所有记录均已有序bount-----是记录无序区的最后一个元素,则每趟排序从0~bound的范围进行判断什么时候冒泡结束呢-----在排序开始时,令exchange的初值为0,在以后的排序过程中,只要交换,exchange的值就会大于0,当不存在交换的时候,就不需要排序了void bubbleSort(int r[], int n]){ int exchange = n-1; //让exch
2021-10-24 17:20:16 1080
原创 BF(模式匹配)算法笔记
就是说,在主串中查找是否有一个子串和想要的串各个元素都形同算法思路:1. 利用循环,当主串(S)和字串(T)都不为空,则进行匹配2.1 如果S[i] = T[i],则比较下一个字符2.2 否则将i回溯,准备下一趟。3. 如果T(字串)中所有字符都比较完,说明在主串中找到了字串,则匹配成功.如果主串S中所有字符都比较完了,说明比较完主串,还是没有匹配到字串,则匹配失败int BF(string S,string T){ int i=0,j=0; wh.
2021-10-18 23:50:38 109
原创 Map常见操作合集
所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。map构造函数map<T1, T2> mapTT;//map默认构造函数: map赋值操作map& operator=(const map &mp);//重载等号操作符swap(mp);//交换两个集合容器map大小操作size();//返回容器中元素的数目empty();//判断容.
2021-10-18 23:09:40 1353
原创 set/multiset常用操作
所有元素都会根据元素的键值自动被排序。set的元素即是键值又是实值。Set不允许两个元素有相同的键值set构造函数set<T> st;//set默认构造函数:mulitset<T> mst; //multiset默认构造函数: set赋值操作set& operator=(const set &st);//重载等号操作符swap(st);//交换两个集合容器set大小操作size();//返回容器中元素的数目empty();//判断容器.
2021-10-18 23:00:55 136
原创 list容器
List容器是一个双向链表创建对象list<T> lstT;//list采用采用模板类实现,对象的默认构造形式:list(beg,end);//构造函数将[beg, end)区间中的元素拷贝给本身。list(n,elem);//构造函数将n个elem拷贝给本身。list(const list &lst);//拷贝构造函数list数据元素插入和删除操作push_back(elem);//在容器尾部加入一个元素pop_back();//删除容器中最后一个元素pus
2021-10-18 08:05:14 102
原创 Queue基本操作
queue没有迭代器所以queue不允许随机访问,不允许随机访问的都没有迭代器queue构造函数queue<T> queT;//queue采用模板类实现,queue对象的默认构造形式:queue存取、插入和删除操作push(elem);//往队尾添加元素pop();//从队头移除第一个元素back();//返回最后一个元素front();//返回第一个元素queue赋值操作queue& operator=(const queue &que);//重载
2021-10-18 08:01:04 843
原创 Stack基本使用
Stack所有元素的进出都必须符合”先进后出”的条件,只有stack顶端的元素,才有机会被外界取用。Stack不提供遍历功能,也不提供迭代器。stack没有迭代器 stack<int> st; //创建一个栈对象 st.push(i); //push(i)将i压入栈 st.top(); //top()取栈顶元素 st.pop(); //pop()将栈顶元素出栈 st.empty(); //true=1;false=0
2021-10-18 07:57:21 325
原创 deque常用操作
来搜deque操作的想必都知道什么是deque了吧,我就不在这里赘述了 。下面是常用操作deque<int> dq; //定义一个储存整型变量的双端队列dqdeque双端插入和删除操作push_back(elem);//在容器尾部添加一个数据push_front(elem);//在容器头部插入一个数据pop_back();//删除容器最后一个数据pop_front();//删除容器第一个数据deque数据存取at(idx);//返回索引idx所指的数据,如果idx越界,
2021-10-17 23:48:26 622
原创 vector的常用操作
//定义具有10个整型元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值vector<int>a(10);//返回a的最后一个元素a.back();//返回a的第一个元素a.front();//返回a的第i元素,当且仅当a存在a[i];//清空a中的元素a.clear();//判断a是否为空,空则返回true,非空则返回falsea.empty();//删除a向量的最后一个元素a.pop_back();//在a的最后一个向..
2021-10-17 23:38:59 224
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人