自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

AndyJ的学习之旅

一个人工智能小白的进修历程

  • 博客(48)
  • 收藏
  • 关注

原创 深度学习之Sigmoid 和 Softmax的异同点

sigmoid 函数函数的基本性质:1、定义域:(−∞,+∞)2、值域:(−1,1)3、函数在定义域内为连续和光滑函数4、处处可导,导数为:f′(x)=f(x)(1−f(x))softmax函数相同点都可以做二分类,求的都是 cross entropy loss(交叉熵损失)不同点sigmoid将一个real value映射到(0,1)的区间,用来做二分类。softmax 把一个 k 维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4…

2020-06-27 17:07:44 1210

原创 动态规划之背包问题详解

0-1 背包问题给你一个可装载重量为 W 的背包和 N 个物品,每个物品有重量和价值两个属性。其中第 i 个物品的重量为 wt[i],价值为 val[i],现在让你用这个背包装物品,最多能装的价值是多少?例如N = 3, W = 4wt = [2, 1, 3]val = [4, 2, 3]算法返回 6,选择前两件物品装进背包,总重量 3 小于 W,可以获得最大价值 6。物品不可以分割,要么装进包里,要么不装,不能说切成两块装一半。这就是 0-1 背包这个名词的来历。动规标准套路第一步要明

2020-06-27 11:55:12 664

原创 数组之最长子序列(连续,递增)问题

动态规划解法定义:dp[i] 表示以 nums[i] 这个数结尾的最长递增子序列的长度。根据这个定义,我们就可以推出 base case:dp[i] 初始值为 1,因为以 nums[i] 结尾的最长递增子序列起码要包含它自己。class Solution: def lengthOfLIS(self, nums: List[int]) -> int: res = 0 n = len(nums) if n == 0: .

2020-06-27 11:53:21 394

原创 贪心思想之玩跳跃游戏

Jump Game I有关动态规划的问题,大多是让你求最值的,比如最长子序列,最小编辑距离,最长公共子串等等等。这就是规律,因为动态规划本身就是运筹学里的一种求最值的算法。那么贪心算法作为特殊的动态规划也是一样,也一定是让你求个最值。这道题表面上不是求最值,但是可以改一改:请问通过题目中的跳跃规则,最多能跳多远?如果能够越过最后一格,返回 true,否则返回 false。def canJump(nums): n = len(nums) fastest = 0 for i in range(n

2020-06-27 11:52:22 109

原创 动态规划之计算编辑距离

解析:对于每对儿字符 s1[i] 和 s2[j],可以有四种操作:if s1[i] == s2[j]: 啥都别做(skip) i, j 同时向前移动else: 三选一: 插入(insert) 删除(delete) 替换(replace)递归代码def minidistance(s1, s2): def dp(i, j): if i == -1: return j + 1 if j == -1: retu.

2020-06-27 11:49:54 159

原创 链表之K个一组翻转链表

利用递归性质,可以得到大致的算法流程:1、先反转以 head 开头的 k 个元素。2、将第 k + 1 个元素作为 head 递归调用 reverseKGroup 函数3、将上述两个过程的结果连接起来。整体思路就是这样了,最后一点值得注意的是,递归函数都有个 base case,对于这个问题是什么呢?题目说了,如果最后的元素不足 k 个,就保持不变。这就是 base caseclass Solution: def reverseKGroup(self, head: ListN.

2020-06-27 11:49:01 167

原创 快慢指针之判断回⽂单链表

因为回⽂串是对称的, 所以正着读和倒着读应该是⼀样的, 这⼀特点是解决回⽂串问题的关键.这道题的关键在于, 单链表⽆法倒着遍历, ⽆法使⽤双指针技巧。 那么最简单的办法就是, 把原始链表反转存⼊⼀条新的链表, 然后⽐较这两条链表是否相同。1、 先通过「双指针技巧」 中的快慢指针来找到链表的中点:slow = fast = headwhile fast and fast.next: slow = slow.next fast = fast.next.next# slow2、 如果 fast

2020-06-27 11:46:12 235

原创 双指针之寻找最⻓回⽂⼦串

解析:回⽂串就是正着读和反着读都⼀样的字符串。回⽂串的的⻓度可能是奇数, 也可能是偶数, 这就添加了回⽂串问题的难度, 解决该类问题的核⼼是双指针。有一个很有趣的思路:既然回文串是一个正着反着读都一样的字符串,那么如果我们把 s 反转,称为 s’,然后在 s 和 s’ 中寻找最长公共子串,这样应该就能找到最长回文子串。比如说字符串 abacd,反过来是 dcaba,它的最长公共子串是 aba,也就是最长回文子串。但是这个思路是错误的,比如说字符串 aacxycaa,反转之后是 aacyxcaa,最

2020-06-27 11:45:00 275

原创 快慢指针之去除有序数组的重复元素

对于数组来说,在尾部插入、删除元素是比较高效的,时间复杂度是 O(1),但是如果在中间或者开头插入、删除元素,就会涉及数据的搬移,时间复杂度为 O(N),效率较低。所以对于一般处理数组的算法问题,我们要尽可能只对数组尾部的元素进行操作,以避免额外的时间复杂度。由于数组已经排序,所以重复的元素一定连在一起,找出它们并不难,但如果毎找到一个重复元素就立即删除它,就是在数组中间进行删除操作,整个时间复杂度是会达到 O(N^2)。而且题目要求我们原地修改,也就是说不能用辅助数组,空间复杂度得是 O(1)对于

2020-06-27 11:44:10 625

原创 双指针之接雨水问题详解

思路:仅仅对于位置i, 能装下多少⽔呢?

2020-06-27 11:40:56 226

原创 数组之寻找消失的元素

给定一个包含0,1,2,3,…,n中n个数的序列,找出0, …, n中没有出现在序列中的那个数。解析:给⼀个⻓度为 n 的数组, 其索引应该在 [0,n) , 但是现在你要装进去 n + 1 个元素 [0,n] , 那么肯定有⼀个元素装不下嘛, 请你找出这个缺失的元素方法一:把这个数组排个序, 然后遍历⼀遍,不就很容易找到缺失的那个元素了吗?时间复杂度是 O(NlogN)方法二:借助数据结构的特性, ⽤⼀个 HashSet 把数组⾥出现的数字都储存下来, 再遍历 [0,n] 之间的数字, 去

2020-06-27 11:38:14 461

原创 二分法之快速模幂算法

LeetCode 372 题 Super Pow,让你进行巨大的幂运算,然后求余数。要求你的算法返回幂运算 a^b 的计算结果与 1337 取模(mod,也就是余数)后的结果。就是你先得计算幂 a^b,但是这个 b 会非常大,所以 b 是用数组的形式表示的。已知(a * b) % k = (a % k)(b % k) % k完整代码class Solution: def superPow(self, a: int, b: List[int]) -> int: de

2020-06-20 16:24:02 341

原创 数学之高效寻找素数

求[2,n]中有几个素数素数定义:只能被1和本身整除def isPrime(n): #判断是否为素数 for i in range(2, int(sqrt(n)): if n % i == 0: # 有其他的因子 return False return Truedef countPrime(n): dp = [True for _ in range(n + 1)] for i in range(2, n + 1): if isPrime(i): j = 2 * i

2020-06-20 16:07:08 126

原创 深度学习之dropout的作用

概要dropout可以作为训练神经网络的一种trick选择,在每个训练批次中,以某种概率忽略一定数量的神经元.可以明显地减少过拟合现象.详解dropout可以减少特征检测器(隐层节点)间的相互作用.检测器相互作用是指某些检测器依赖其他检测器才能发挥作用.简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定概率p停止工作.这样可以使模型泛化能力更强.因为它不会太依赖某些局部的特征.经过dropout屏蔽掉某些神经元之后,还需要对输出向量y1,…y100进行缩放,也就是乘以1/(1-p)如果

2020-06-16 12:59:36 6812

原创 数据结构之算法复杂度

算法复杂度分为时间复杂度和空间复杂度。时间复杂度是指执行这个算法所需要的计算工作量;空间复杂度是指执行这个算法所需要的内存空间。时间和空间(即寄存器)都是计算机资源的重要体现,而算法的复杂性就是体现在运行该算法时的计算机所需的资源多少。时间复杂度:算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好地反映出算法的优劣与否;算法执行时间需要依据该算法编制的程序在计算机上执行运行时所消耗的时间来度量,度量方法有两种,事后统计方法和事前分析估算方法,因为事后统计方法

2020-06-13 20:51:32 432

原创 Linux之screen基本操作指令

新建一个叫yourname的sessionscreen -S yourname 列出当前所有的sessionscreen -ls回到yourname这个sessionscreen -r yourname远程detach某个sessionscreen -d yourname 结束当前session并回到yourname这个sessionscreen -d -r yournamekill screenscreen -X -S yourname quit...

2020-06-13 20:10:33 142

原创 python之pdb 调试指令

pdb调试命令完整命令简写命令描述argsa打印当前函数的参数breakb设置断点clearcl清除断点condition无设置条件断点continuec或者cont继续运行,知道遇到断点或者脚本结束disable无禁用断点enable无启用断点helph查看pdb帮助ignore无忽略断点jumpj跳转到指定行数运行listl列出脚本清单nextn执行下条语句,遇到函数

2020-06-13 20:08:21 279

原创 Linux之ubuntu 环境变量

环境变量的作用域用于当前终端打开一个终端,输入添加环境变量的语句export CLASS_PATH=./JAVA_HOME/lib:$JAVA_HOME/jre/lib终端所添加的环境变量是临时的,只适用于当前终端,关闭当前终端或在另一个终端中,添加的环境变量无效用于当前用户如果只需要添加的环境变量对当前用户有效,可以写入用户主目录下的.bashrc文件vim ~/.bashrc添加语句export CLASS_PATH=./JAVA_HOME/lib:$JAVA_HOME/jre

2020-06-13 19:59:26 185

原创 Linux之ubuntu 设置用户权限chmod

同时指定三类用户的权限 chmod [xyz] file其中x,y,z分别指定User、Group、Other的权限;用三位二进制数表示 ” r , w , x”(注意顺序)三种权限,其中 0 代表没有该权限,1 代表有该权限,如 100 则表示,有 ‘r”权限,无 “w x”权限;再将这个三位的二进制数转为十进制,则是 x (或y,z)的值例如sudo chmod 774 /code/readme.txtUser : 7 = 111 表示具有 ” r , w , x” 权限Group :

2020-06-13 19:53:28 1255

原创 Linux之ubuntu 文件操作

linux下如何创建一个.txt类型的文件的方法:1、vi 文件名.txt2、touch 文件名.txt统计当前文件夹下的文件个数:ls -l | grep "^-" | wc -l软连接:ln –s 源文件 目标文件查找当前目录下所有包含"**"的文件grep -r "**"...

2020-06-13 19:48:57 277

原创 Linux之cuda相关

查看cuda 版本cat /usr/local/cuda/version.txt查看cudnn 版本cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2nvcc: command not found除了在/.bashrc中配置LD_LIBRARY_PATH路径以外,还需要配置PATH路径,完整配置如下:export LD_LIBRARY_PATH=/usr/local/cuda/libexport PATH=$PATH:/u

2020-06-13 19:46:00 119

原创 Linux之conda虚拟环境

1、查看当前conda的版本.conda -V2、conda查看包和虚拟环境。conda list # 查看安装了哪些包。conda env list 或 conda info -e # 查看当前存在哪些虚拟环境conda update conda #检查更新当前conda3、创建python虚拟环境。使用 conda create -n your_env_name python=X.X(2.7、3.6等)命令创建python版本为X.X、名字为your_env_name的虚拟环境。you

2020-06-13 19:43:29 497

原创 目标检测之Yolov3 darknet训练自己的数据集

1配置darknet环境参考官网 darknetgit clone https://github.com/pjreddie/darknetcd darknet更改Makefile, 令GPU=1,CUDNN=1,OPENCV=1ARCH= -gencode arch=compute_30,code=sm_30 \ -gencode arch=compute_35,code=sm_35 \ -gencode arch=compute_50,code=[sm_50,com

2020-06-13 19:36:23 536

原创 高频算法之经典算法题

各种排序算法快速排序二分法(带左右边界)旋转数组top k数组找第k个元素(二叉搜索树)大数据找中位数(桶排序)  - https://www.jianshu.com/p/204ed43aec0c  - https://www.cnblogs.com/kongzimengzixiaozhuzi/p/12982104.html拓扑排序(BFS)搜索旋转排序数组 (leetcode 33)大数求和快速幂合并k个有序链表数独 / N皇后鸡蛋掉落/双蛋问题编辑距离(dp数组/递归)

2020-06-13 19:11:45 171

转载 机器学习之常见面试题

机器学习常见面试题1.比较Boosting和Bagging的异同二者都是集成学习算法,都是将多个弱学习器组合成强学习器的方法。Bagging:从原始数据集中每一轮有放回地抽取训练集,训练得到k个弱学习器,将这k个弱学习器以投票的方式得到最终的分类结果。Boosting:每一轮根据上一轮的分类结果动态调整每个样本在分类器中的权重,训练得到k个弱分类器,他们都有各自的权重,通过加权组合的方式得到最终的分类结果。2.无监督学习中存在过拟合吗?存在。我们可以使用无监督学习的某些指标或人为地去评估模型性能

2020-06-13 19:05:08 600 1

原创 Pytorch之动手学习深度学习(PyTorch)

dive into DL PyTorchbasic knowledgemain toolstorch.utils.data模块提供了有关数据处理的工具,torch.nn模块定义了大量神经网络的层,torch.nn.init模块定义了各种初始化方法,torch.optim模块提供了模型参数初始化的各种方法softmax回归适用于分类问题。它使用softmax运算输出类别的概率分布。s...

2020-06-13 19:03:23 1290

原创 深度学习之CNN可视化

CNN可视化过程我们现在可以明白,CNN的浅层的filters一般会检测“边缘”、“颜色”等最初级的特征,之后,filters可以识别出各种“纹理纹路”,到深层的时候,filters可以检测出类似“麻花”、“蜘蛛”等等由前面的基础特征组成的图案。沿着 “将激活值与输入图片对应”这种思路(我的猜测),利用 Deconvnet这种结构,将激活值沿着CNN反向映射到输入空间,并重构输入图像,从而更加清晰明白地知道filters到底识别出了什么具体的方法,其实是将原来的CNN的顺序完全反过来,但是组件不变(

2020-06-13 19:00:43 761

原创 深度学习之经典CNN模型

1、LeNet-5论文这个可以说是CNN的开山之作,由Yann LeCun在1998年提出,可以实现对手写数字、字母的识别。结构如下:Input(32×32)–>CONV(6 filters)–>AvgPOOL–>CONV(16 filters)–>AvgPOOL–>FC(120)–>FC(84)–>FC(10)2、AlexNet论文AlexNet于2012年由Alex Krizhevsky, Ilya Sutskever 和 Geoffrey Hin

2020-06-13 19:00:11 1059

原创 深度学习之初识CNN

1. 引子————边界检测可以通过设计特定的filter,让它去跟图片做卷积,就可以识别出图片中的某些特征,比如边界。CNN(convolutional neural network),主要就是通过一个个的filter,不断地提取特征,从局部的特征到总体的特征,从而进行图像识别等等功能。每个filter中的各个数字就是参数,我们可以通过大量的数据,来让机器自己去“学习”这些参数。这就是CNN的原理。2. CNN基本概念1).padding 填白采用padding的方法。每次卷积前,先给图片周

2020-06-13 18:59:33 268

原创 深度学习之参数调节

我们平时一直都在说“调参、调参”,但实际上,不是调“参数”,而是调“超参数”1.参数(Parameter)参数是我们训练神经网络 最终要学习的目标,最基本的就是神经网络的权重 W和bias b,我们训练的目的,就是要找到一套好的模型参数,用于预测未知的结果。这些参数我们是不用调的,是模型来训练的过程中自动更新生成的。2.超参数(HyperParameter)超参数是我们控制我们模型结构、功能、效率等的 调节旋钮learning rateepochs(迭代次数,也可称为 num of iterat

2020-06-13 18:55:02 1233

原创 深度学习之激活函数

激活函数神经网络的每一层基本都是在一个线性运算后面来一个非线性激活函数(Activation function),再把值传给下一层的为啥要有非线性的激活函数(non-linear activation function)n个线性函数嵌套起来,还是线性函数:y=a1(a2x+b2)+b1=a1a2x+a1b2+b1=cx+d这样,n层的神经网络,就相当于一个简单的Logistic regression了。因此,我们必须采用一个非线性的激活函数,让每一层都有意义,让每一层都有其特定的功能!1.

2020-06-13 18:52:51 1148

原创 深度学习之优化算法

1.Gradient Decent把所有的训练样本丢进去训练一次之后,把W和b更新一次,然后重复这个过程,具体重复多少次就看我们的“迭代次数”是多少。“把所有训练样本过一遍”为一个epoch2. Mini-batch GD我们训练的时候,跑完一个mini-batch就把W和b更新一次,这样的的话,在一个epoch中,我们就已经把参数更新了多次了!虽然每一步没有batch GD的一步走的准,但是我多步加起来,怎么样也比你走一步的效果好的多,因此可以加快训练速度,更快到达最值点。对于不同的mini-b

2020-06-13 18:50:55 228

原创 深度学习之神经网络参数初始化

神经网络参数初始化神经网络的参数主要是权重(weights):W, 和偏置项(bias):b1) 0初始化不管是哪个神经元,它的前向传播和反向传播的算法都是一样的,如果初始值也一样的话,不管训练多久,它们最终都一样,都无法打破对称(fail to break the symmetry),那每一层就相当于只有一个神经元,最终L层神经网络就相当于一个线性的网络,如Logistic regression因此,我们决不能把所有参数初始化为0,同样也不能初始化为任何相同的值,因为我们必须“打破对称性”!2

2020-06-13 18:50:19 705

原创 深度学习之正则化

1、Bias(偏差) & Variance(方差)bias就是衡量训练集和我们的最小误差的差距variance是指你的验证集和你训练集的效果的差别,而不是某个绝对的值。2、如何解决bias和variance的问题如果你的模型训练结果是high bias,我们一般用以下几种方法来改进:1)尝试使用更复杂更大的网络结构(增加单元数、增加层数,或者更改结构)2)训练更长的时间(增加迭代次)数因为high bias意味着我们训练的还不够,连训练集的内容都无法很好的识别。所以这种情况下不用去想

2020-06-13 18:49:27 213

原创 二分查找之开平方根

查找二分查找def binary_find(num_list, x): num_list = sorted(num_list) left, right = 0, len(num_list) while(left<right): mid = (left+right)/2 if num_list[mid] > x: right = mid elif num_list[mid] < x:

2020-06-13 17:48:28 222

原创 机器学习之ID3、C4.5、CART、RF、boosting、Adaboost、GBDT、xgboost模型

决策树决策树是一个有监督的分类模型,其本质是选择一个能带来最大信息增益的特征值进行树的分割,直到到达结束条件或者叶子结点纯度到达一定阈值。按照分割指标和分割方法,决策树的经典模型可以分为ID3、C4.5以及CARTID3:以信息增益为准则来选择最优划分属性信息增益的计算要基于信息熵(度量样本集合纯度的指标)信息熵越小,数据集X的纯度越大因此,假设于数据集D上建立决策树,数据有K个类别:公式(1)中:表示第k类样本的数据占数据集D样本总数的比例公式(2)表示的是以特征A作为分割的属性,

2020-06-09 23:31:51 535 1

转载 操作系统之死锁

什么是死锁?所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。产生死锁的原因?a. 竞争资源系统中的资源可以分为两类:可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺,CPU和主存均属于可剥夺性资源;另一类资源是不可剥夺资源,当系统把这类资源分配给某进

2020-06-05 16:04:23 117

原创 操作系统之中断

中断的概念中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。中断是一种使CPU中止正在执行的程序而转去处理特殊事件的操作,这些引起中断的事件称为中断源,它们可能是来自外设的输入输出请求,也可能是计算机的一些异常事故或其它内部原因。中断的作用并行操作硬件故障报警与处理支持多道程序并发运行,提高计算机系统的运行效率支持实时处理功能术语按中断源进行分类:发出中断请求的设备称为中断源。按中断源的不

2020-06-05 15:54:37 559

原创 算法进阶之滑动窗口解题套路

滑动窗口/* 滑动窗口算法框架 */void slidingWindow(string s, string t) { unordered_map<char, int> need, window; for (char c : t) need[c]++; int left = 0, right = 0; int valid = 0; while (right < s.size()) { // c 是将移入窗口的字符

2020-06-05 15:39:58 300

原创 算法进阶之双指针

双指针双指针技巧分为两类,一类是「快慢指针」,一类是「左右指针」。前者解决主要解决链表中的问题,比如典型的判定链表中是否包含环;后者主要解决数组(或者字符串)中的问题,比如二分查找。快慢指针的常见算法判定链表中是否含有环单链表的特点是每个节点只知道下一个节点,所以一个指针的话无法判断链表中是否含有环的。如果链表中不含环,那么这个指针最终会遇到空指针 null 表示链表到头了,这还好说,可以判断该链表不含环。但是如果链表中含有环,那么这个指针就会陷入死循环,因为环形数组中没有 null 指针作为尾

2020-06-05 15:39:27 158

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除