k-近邻算法
开篇k-近邻算法是比较简单的一种机器学习算法,其核心思想可以用一句话来概括:近朱者赤,近墨者黑。
在具体介绍该算法之前,先通过一个栗子对该算法做一个感性上的认识。
Python爱好者 or C爱好者 ?
上图中,每一个形状(三角形,圆形)都代表了一个人。总共有两种形状,说明这些人总共可以分为两类:Python爱好者、C爱好者。
三角形一共有7个,代表喜欢写Python的总共有7人;
圆形一共有6个,代表喜欢写C语言的总共有6人。
现在,突然来了一个不知道是喜欢写Python还是C语言(并且只可能属于其中之一)的人—–五角星,要求你来判定这个人所属的类别。
emm…
你可能会说,那看看图上距离这个人(五角星)最近的几个人所属类别就可以了啊!比如就看距离这个人最近的3个人:其中有两个人喜欢写Python,而只有一个人喜欢写C语言(如下图所示)
按照少数服从多数的原则,将这个新来的人(五角星)归类到三角形(Python爱好者)类别就搞定啦!
最终 ...
从模型演化的角度看待国家的发展
时代在发展,社会也在不断地前进。得益于中国特色社会主义,近些年来,我们的生活也发生了翻天覆地的变化,这不仅仅体现在我们的衣食住行,更体现在精神与文化层面。科技日益发达,大国之间的竞争的焦点也渐渐转移到科学技术上来,尤其是进入21世纪以后,深度学习技术的突飞猛进,人工智能技术迅速发展,并且随着算力的不断提升,以前不可能实现的实验,现在都可交由计算机来实现。依托其强大的运算能力和重复特性,如今的人工智能已经有了许多不错的落地成果。我们国家也在大力倡导发展大数据与人工智能,为促进新时代科技强国打下坚实的基础,这也正是我选择跨考进入计算机专业并准备在机器学习、人工智能方向深耕的原因之一。
中国特色社会主义结合了马克思主义与中国的实际国情,在先辈们前仆后继的不断摸索中,才有了今天来之不易的幸福生活,才给了发展高新科技的前提条件。生于20世纪与21世纪的交叉点的我们,更应该珍惜这来之不易的生活,同时也要根据自身条件,努力为社会主义的建设添砖加瓦,贡献自己的力量。于我而言,作为一名计算机专业并对机器学习技术非常热爱的研究生,更要努力学习相关知识。从小的说,是为了自己,往大了说,真心希望自己可以学有所 ...
遗传算法的Python实现
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465import numpy as npimport matplotlib.pyplot as pltDNA_SIZE=10POP_SIZE=100CROSS_RATE=0.8MUTATION_RATE=0.003N_GENERATIONS=200X_BOUND=[0,5]#定义目标函数def F(x): return np.sin(10*x)*x+np.cos(2*x)*x#计算适应度,并使其大于0def get_fitness(pred): return pred+1e-3-np.min(pred)#将二进制串的DNA转为10进制数并限制范围在0到5之间def translateDNA(population): return population.dot(2**np.arange(DNA_SIZE)[::-1])/float(2* ...
手写kmeans算法
开篇在本系列的前面几期中,我们介绍了包含决策树及其相关算法在内的一系列有监督学习算法。本期不妨换换口味,学习一种比较简单的无监督学习算法: k-means.
k-means 算法理论讲解你可能已经听说过这个算法,没有也不要紧,它的原理并不复杂,让我们来看看~
给你一批样本的数据,就像这样:其中不同的id代表不同样本,共10个样本。x和y是两个特征,每一个样本都有且只有这两个特征。
现在希望你能够对这些样本进行分类。
我们知道,在属于有监督学习的分类问题中,训练数据往往会包含类别标签。而上面这份数据本身是不含标签的,所以这并不是一个分类问题。
既然不知道类别标签,你又让我对这些样本进行分类,那如何聚类?又要聚成几类呢?
其实,在k-means中,最终聚成几类是由我们自己决定的;这里的类别标签通常用数字表示,如0,1,2等;当我们指定好类别总数后,每一个样本被归到哪一类,就需要聚类算法自己去学习了。
k-means算法学习将相似的样本聚在一起,称为一个类别(也称为一个”簇”),而将不相似的样本划分到不同的类别(“簇”)中。
这里的相似程度,通常是用样本之间的距离来度量的,比如最常用的欧氏距 ...
BrainF语言解释器的Python实现
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960def interp(code): data=[0 for _ in range(30000)] pc=0 ptr=0 st=[]#list模拟stack while(pc<len(code)): c=code[pc] print("正在处理字符'{}'".format(c)) if c=='<': ptr-=1 elif c=='>': ptr+=1 elif c=='+': data[ptr]+=1 ...
折腾Insightface-PyTorch的辛酸历程
2020年11月25号:配置环境(python3.5),运行prepare_data.py,成功提取训练集数据到imgs文件夹;但在提取测试集时报错,原因是python3.5及其之前的版本中的Path()都不继承自str类,于是手动给路径包裹了str(),成功提取除二进制格式保存的文件分别至单独的文件夹(blp后缀,不知道这是什么,先放着);
2020年11月26号:运行python train.py失败,从gihub issue了解到作者用了python3.6,于是重新配环境,试错,期间遇到了各种包装不上以及其他问题(发现作者还用了mxnet用于提取数据);
2020年11月27号:继续配环境,好像是配好了(python3.6),虽然还会报numpy的错误:ModuleNotFoundError: No module named 'numpy.core._multiarray_umath',但是并不影响模型的训练;
于是开始运行train.py,会报RuntimeError: cuda runtime error (2) : out of memory at / ...
计算机视觉任务
分类
一图一标签
语义分割
像素级分类
那怎么做语义分割呢?
滑动窗口在一开始,人们想到了滑动窗口
如上图所示,滑动窗口的思路是:对图中的每一个像素点,以该像素点为中心,取一个区域(手动指定窗口大小),对该区域利用卷积神经网络做分类,区域所属类别即为该区域对应像素点的所属类别。
尽管这是完全能用的吧,但由于一张图中的像素点个数有时候会特别多(比如高分辨率图片),此时,采用滑动窗口会带来较大的运算量,所以有了下面的全卷积网络方法。
全卷积使用全卷积做语义分割的思路如下图所示
对于一张输入的图片,使用padding保证在卷积过程中得到特征图尺寸与输入图片尺寸一致,做多次卷积;在最后一次卷积时,使用C个卷积核以保证最后输出的通道数为C,这里的C是全部类别的个数;最后,对于每一个像素点,分别计算该像素点在通道维度上的取值(由于通道数等于类别数等于C,所以此时会有C个值)与标准答案(形式见下面的补充)之间的交叉熵,再把全部像素点计算得到的交叉熵相加,就得到了总的损失,接下来反向回传就可以更新参数,优化模型了。
【补充】这里每一个像素点所属类别的标准答案是一个数,将其做one-hot操作 ...
ResNet
Why ResNet ?
当神经网络层数变深时,模型性能可能会不增反降。
举个例子,对于某数据集,考虑以下情况:
在测试集上,100层的网络性能低于20层的网络
在训练集上,100层的网络性能低于20层的网络
单单看前者,猜想出现过拟合的可能性较大。因为100层的网络能够拟合更加复杂的函数,对训练集的拟合效果也会更好,但可能导致在测试集上表现并不好(100层网络可能仅仅是记住了训练集的每一个样本的特征及其训练标签,而在面对新的没有见过的样本(比如测试样本)时,就无能为力了)。
然而,再看后者,在训练集上都不达标了,这显然不是过拟合,并且网络越深性能越差,一定是某些其他地方出了问题!
没错,在100层网络的训练过程中,网络的正、反向信息流动不顺畅,从而导致网络没有充分被训练,这正是上面的例子中现象产生的原因!
**残差网络(ResNet)**的提出解决了这一问题,它通过从当前层(不妨记作Current Layer)直接向经过某个网络块(不妨记作F_Block)后得到的后面的层(不妨记作Layer)之间加一条线,使得Current Layer的信息可以直接传给Layer。这样,即使F ...
CycleGAN
导入相关包123456789101112import tensorflow as tfimport tensorflow_addons as tfafrom tensorflow.keras.layers import Dropout, Concatenate,BatchNormalization,LeakyReLU,UpSampling2D, Conv2Dfrom tensorflow.keras.optimizers import Adamimport matplotlib.pyplot as pltimport sysimport osfrom skimage.transform import resizeimport imageiofrom glob import globimport numpy as nptf.keras.backend.set_floatx('float64')
读取数据1234567891011121314151617181920212223242526272829303132333435363738394041424344454 ...
SRGAN
通过采样等方式获取高清图片的低分辨率版本,两者形成一一映射的关系,作为准备好的数据集。
不同于之前的GAN的输入为noise,SRGAN 的输入为低分辨率图片,希望通过对抗的方式学习如何生成低分辨率图片的超清版本。
主要改动的地方除了生成器和判别器的架构外,就是损失函数了:判别器的损失函数无需改动,而生成器的损失函数在原来的基础上,需要再增加两项,一个是真实图片与生成图片的均方误差,另一个是真实图片与生成图片经过vgg19提取得到的特征之间的均方误差(论文中把这两个合起来叫做内容损失,而之前生成器的损失叫做对抗损失,内容损失+对抗损失=感知损失)。
代码导入相关函数1234567import tensorflow as tfimport matplotlib.pyplot as pltimport numpy as npfrom tensorflow.keras import layersimport scipy#需要执行 pip install scipy==1.2.1 来给scipy降级from glob import globimport datetime
准备数据12345 ...