2025-05-13 thbcm 阅读(330)
下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解
导语
日子真是…
发现不知不觉又好多天没发文章了。
恰巧看到一个关于遗传算法的很有意思的应用,利用遗传算法拟合图像 ,于是过来分享一波。
让我们愉快地开始吧~~~
相关文件
百度网盘下载链接: 💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
" target="_blank">💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
密码: ec77
开发工具
Python版本: 3.6.4
相关模块:
PIL模块;
以及一些python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
参考资料
50个半透明多边形重现蒙娜丽莎:
http://alteredqualia.com/visualization/evolve/
科学松鼠会《遗传算法》:
http://songshuhui.net/archives/10462
原理简介
改编参考资料中的故事:
很久很久以前,海岸边生活着一群扇贝,它们衣食不愁,有房有车。但好景不长,人类的到来打破了它们原本无忧无虑的生活。
每隔一段时间,人类就会挖走它们之中的一部分。不过,这些人不喜欢贝壳花纹长得像哈士奇的扇贝 ,所以他们总是选择那些长得比较不像哈士奇的扇贝 。
这种状况持续了好几万年。这个时候,神奇的事情发生了:所有的扇贝贝壳上都印着哈士奇 !
遗传算法——元启发式算法之一:
首先致敬一波达尔文?
简单而言,遗传算法模拟了大自然中种群在选择压力下的演化过程,从而得到了对应问题的近似解。
具体而言,就是生物体长什么样子很大程度上是由染色体上的基因决定的。如果我们利用n个多边形组成一只哈士奇的话,我们同样也可以认为哈士奇长什么样子由这些多边形的具体位置和颜色决定,也就是说这些多边形可以被看作是哈士奇的“基因”。
当然,需要注意的是,这个算法得到的只是问题的近似解 而非精确解,且存在基因过早同一化 等问题。
来自 http://xkcd.com/534/ 的冷笑话:
算法设计:
遗传算法只是一个框架,对于具体问题当然需要设计具体的算法。
时间关系,本次算法设计一切从简。
Step1:
随机生成100幅与原始图像大小相同的噪声图像。
Step2:
种群变异(变异概率50%),即在100幅生成的图像上加一些随机噪声。
Step3:
计算与原始图像的差异度。计算公式为:
Step4:
保留与原始图像差异度较低的生成图像,并让它们交叉融合生成新的图像以使得种群的数量保持不变。
Step5:
循环执行Step2-4。
具体实现过程详见相关文件中的源代码。
使用演示
在cmd窗口运行Genetic.py 文件即可。
部分参数解释:
以chrome浏览器图标(大小为30×30)为例:
【图像较大的话时间花销比较大T_T】
可以看到还是有那么点意思的。
有兴趣的同学可以多跑几轮,看看几万轮之后的结果是什么,时间关系我就不继续跑了。
更多
参考资料中的第一个链接是一个遗传算法拟合蒙娜丽莎的在线测试系统。
其最终的结果为:
当然还有其他图案的:
emmm,比我的结果好很多的样子。
有空再优化我自己写的东西吧~~~
2025-05-13 thbcm 阅读(413)
导语
利用Python+OpenCV实现猫脸检测。
使用的是OpenCV内置的Viola-Jones目标检测框架来实现猫脸检测,感觉挺有意思的。
让我们愉快地开始吧~~~
相关文件
百度网盘下载链接: 💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
" target="_blank">💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
密码: v55f
开发工具
Python版本: 3.6.4
相关模块:
cv2模块;
以及一些Python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理简介
为了进一步提高公众号的文章质量,我决定来简单地讲一讲Haar分类器,也就是Viola-Jones识别器。
详细的原理说明可参考相关文件中的两篇论文:
Rapid Object Detection using a Boosted Cascade of Simple Features;
Robust Real-Time Face Detection.
(1)Haar-like特征
Haar-like矩形特征是用于物体检测的数字图像特征,由两个或者多个相邻的黑白矩形组合而成,矩形的特征值是白色矩形的灰度值之和减去黑色矩形的灰度值之和。一般地,我们认为矩形特征对一些简单的图形结构(线段、边缘)等较为敏感:
具体到猫脸检测而言,我们认为把这样的矩形放到一个非猫脸区域后获得的特征值与放到一个猫脸区域后获得的特征值是不同的 。
利用上述基于特征的检测算法,不仅能够编码特定区域的状态,而且效率高于基于像素的检测算法。
(2)积分图
下面我们来考虑一下如何计算矩形的特征值。对图像中的任意一点A(x, y),定义该点的积分图为其左上角的所有像素值之和,即:
因此,要计算矩形模板的特征值,也就是计算两个区域之间的像素和之差,只需要用特征区域端点的积分图来进行简单的加减运算就可以了:
(3)Haar分类器
Haar分类器是一个监督学习分类器,要进行目标检测,首先要对图像进行直方图均衡化和归一化处理,然后检测里面是否包含要检测的物体。
流程框架图为(Haar分类器本质上由Haar特征提取器、离散强分类器以及强分类级联器组成 ):
Haar分类器使用Adaboost算法,但是把它组织为了筛选式的级联分类器,在任意一级计算中,一旦获得输入内容不在检测类中的结论,便终止计算,只有通过所有级别的分类器,才可认为检测到了目标物体, 以此来提高检测效率。
关于AdaBoost算法,我就不展开介绍了,有兴趣的同学可以自己查找相关资料进行学习。以后有时间我再对其进行详细的介绍。
(4)适用范围
适用于“基本刚性”的物体检测 ,如脸、汽车、人体和自行车等等。
(5)总结
Viola-Jones目标检测框架的核心思想是通过滑动窗口扫描图像(多尺度的扫描),然后将每个窗口的Haar特征值输入到筛选式的级联分类器中来判断该窗口内是否含有目标物体以实现目标检测。
具体实现
OpenCV中内置了基于Viola-Jones目标检测框架的Haar分类器,并提供了猫脸检测预训练好的模型。因此实现起来十分简单。
具体实现过程详见相关文件中的源代码。
效果演示
使用方式:
修改源代码中的图片名为自己需要检测的图片:
在cmd窗口运行 DetectCatFace.py 文件即可。
效果:
原图1:
检测结果1:
原图2:
检测结果2(并不能很好地区分狗狗和猫咪):
That’all~
更多
代码截止2018-06-28 测试无误。
之后会陆续推出基于深度学习的目标检测算法案例,它们的检测效果还是非常棒的~
2025-05-13 thbcm 阅读(313)
下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解
导语
偶遇了一篇文章:
“Mapping Your Music Collection ”
https://www.christianpeccei.com/musicmap/
感觉颇有缘分,似有命中注定之感,于是想着用一些简单的音频处理、机器学习和可视化技术,简单地分析一下自己的音乐收藏。当然我对乐理知识一无所知,所以分析将不涉及任何与乐理知识相关的内容,纯属“瞎玩”性质的分析。T_T
那么就让我们愉快地开始吧~~~
相关文件
百度网盘下载链接: 💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
" target="_blank">💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
密码: nxpt
相关工具
Python版本: 3.6.4
相关模块:
numpy模块;
sklearn模块;
matplotlib模块;
以及一些Python自带的模块。
mpg123:
1.25.10
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块;
将相关文件中提供的mpg123.zip 文件解压后添加到环境变量中,例如:
开始分拆
方便起见,所有的音乐文件均先转为.wav格式后再做分析。
从最简单的开始吧!让我们先来看看不同歌手的声音波形图:
周杰伦:
感觉波形图好混乱,似乎是数据量太大引起的,于是我打算换一个策略,只画出每首歌曲前10秒的波形图来作比较,毕竟良好的开端是成功的一半?
周杰伦:
许嵩:
陈奕迅:
Interesting…
好像还是挺有意思的,但并看不出什么端倪来的样子,同一个歌手唱的歌的波形结构之间的差异和不同歌手唱的歌的波形结构之间的差异仿佛都挺大的。虽然并没有规定说同一个歌手唱的歌的波形结构之间的差异一定很小,不同歌手唱的歌的波形结构之间的差异一定很大。
好吧,有些混乱,还是随意点的好。那么我们来尝试性地提取一下歌曲的特征吧。我们打算提取的歌曲特征有:
① 歌曲波形的统计矩,包括均值、标准差、偏态和峰态,同时,我们通过平滑窗(递增平滑,长度分别为1,10,100,1000)来获取这些特征在不同时间尺度上的表现;
② 为了体现信号的短时变化,我们可以计算一下波形一阶差分幅度的统计矩,同样也通过平滑窗来获取这些特征(均值、标准差、偏态和峰态)在不同时间尺度上的表现;
③ 最后,我们计算一下波形的频域特征,这里我们只计算歌曲在不同频段(将整个频段均分为10份)的能量占比,不过直接对歌曲的波形数据作快速傅里叶变换的话其计算量过于庞大了,因此先让波形数据通过长度为5的平滑窗再对其作快速傅里叶变换。
综上所述,我们已经获得了歌曲的42个特征值。下面我们尝试利用这些特征值对我这几天下载的43首歌曲进行k均值聚类。首先,为了便于结果的可视化,我们利用PCA对数据进行降维(42维特征到2维特征),为了方便起见,我们直接调库(s klearn )实现,结果打印如下:
OK,接下来我们就可以对降维后的数据进行聚类了,这里我们将自己实现一下k均值聚类算法而不是简单地调库,最终的聚类结果如下图所示(k=4):
接下来我们尝试先对歌曲的42个特征值进行归一化处理,然后再进行上面的PCA和聚类操作,同时令k=3,最终的聚类结果如下图所示:
Emmm,好像效果更差了。
不过我发现我喜欢了8年的歌“尾戒”竟然一枝独秀了!还是很棒的,哈哈~~~
当然,这里有一个问题,歌曲的42个特征值是人工选取的,也许并不很好的表现出歌曲特征,且这些特征之间的相关系数是不为0的,也就是存在冗余特征。
https://www.christianpeccei.com/musicmap/一文利用了遗传算法从42个特征值中筛选出了18个特征值作为歌曲最终的特征向量,其结果如下:
懒得复现了,直接用他的结论重新进行聚类 ,结果如下(k=3):
Emmm,好像半斤八两。
那就这样吧,就当学点基础的音频处理、机器学习和可视化技术了。
所有源代码和素材均在相关文件中提供了, End。
2025-05-13 thbcm 阅读(333)
下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解
导语
利用简单的机器学习算法实现垃圾邮件识别。
让我们愉快地开始吧~
相关文件
百度网盘下载链接: 💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
" target="_blank">💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
密码: qa49
数据集源于网络,侵歉删。
开发工具
Python版本: 3.6.4
相关模块:
scikit-learn模块;
jieba模块;
numpy模块;
以及一些Python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
逐步实现
(1)划分数据集
网上用于垃圾邮件识别的数据集大多是英文邮件,所以为了表示诚意,我花了点时间找了一份中文邮件的数据集。数据集划分如下:
训练数据集:
7063封正常邮件(data/normal文件夹下);
7775封垃圾邮件(data/spam文件夹下)。
测试数据集:
共392封邮件(data/test文件夹下)。
(2)创建词典
数据集里的邮件内容一般是这样的:
首先,我们利用正则表达式过滤掉非中文字符,然后再用jieba分词库对语句进行分词,并清除一些停用词,最后再利用上述结果创建词典,词典格式为:
{“词1”: 词1词频, “词2”: 词2词频…}
这些内容的具体实现均在“utils.py” 文件中体现,在主程序中(train.py )调用即可:
最终结果保存在“results.pkl” 文件内。
大功告成了么?当然没有!!!
现在的词典里有52113个词,显然太多了,有些词只出现了一两次,后续特征提取的时候一直空占着一个维度显然是不明智的做法。因此,我们只保留词频最高的4000个词作为最终创建的词典:
最终结果保存在“wordsDict.pkl” 文件内。
(3)特征提取
词典准备好之后,我们就可以把每封信的内容转换为词向量了,显然其维度为4000,每一维代表一个高频词在该封信中出现的频率,最后,我们将这些词向量合并为一个大的特征向量矩阵,其大小为:
(7063+7775)×4000
即前7063行为正常邮件的特征向量,其余为垃圾邮件的特征向量。
上述内容的具体实现仍然在“utils.py” 文件中体现,在主程序中调用如下:
最终结果保存在 “fvs_%d_%d.npy” 文件内,其中第一个格式符代表正常邮件的数量,第二个格式符代表垃圾邮件的数量。
(4)训练分类器
我们使用scikit-learn机器学习库来训练分类器,模型选择朴素贝叶斯分类器和SVM(支持向量机):
(5)性能测试
利用测试数据集对模型进行测试:
结果如下:
可以发现两个模型的性能是差不多的(SVM略胜于朴素贝叶斯),但SVM更倾向于向垃圾邮件的判定。
That’s all~
完整源代码请参见相关文件。
更多
没有具体介绍模型原理,因为后续可能会出一个系列,比较完整详细地介绍一下机器学习里的常用算法。所以,就先这样吧~
2025-05-13 thbcm 阅读(300)
下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解
导语
利用Python搭建简单的深度强化学习网络(DQN)玩CartPole这个小游戏。。。
这是来自PyTorch官方教程的一个简单实例。
感觉还是挺有意思的~~~
直接进入正题吧~~~
内容较长,做好心理准备~~~
相关文件
百度网盘下载链接: 💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
" target="_blank">💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
密码: xf7x
参考文献
官方英文教程链接:
http://pytorch.org/tutorials/intermediate/reinforcement_q_learning.html
另外:
对英文文献阅读有困难的同学也不必担心,我已经把这个教程翻译为中文放到了相关文件中。
同时,我也在微信公众号“Charles的皮卡丘 ”底部菜单栏“资料共享 ”→“整理汇总 ”中分享了(即强化学习实例1 )。
“整理汇总 ”中也有翻译自官方文档的PyTorch60分钟快速入门教程,以及我自己结合一些讲座和tutorials整理的强化学习基础教程。
开发工具
系统: Windows10
Python版本: 3.6.4
相关模块:
gym模块;
numpy模块;
matplotlib模块;
PIL模块;
torch模块;
torchvision模块;
以及一些Python自带的模块。
其中PyTorch版本为:
0.3.0
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
补充说明:
PyTorch暂时不支持直接pip安装。
有两个选择:
(1)安装anaconda3后在anaconda3的环境下安装(直接pip安装即可);
(2)使用编译好的whl文件安装,下载链接为:
💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
#list/path=%2Fpytorch
原理介绍
(1)增强学习
为了便于大家更好地理解,我决定从增强学习开始讲起, 当然只讲其主要思想,不作深入讨论。
在AI领域,我们一般使用Agent 来表示一个具备行为能力的物体,例如最近比较火的无人车。那么增强学习考虑的问题就是Agent和环境environment之间交互的任务 。比如假设我们有一只AI皮卡丘:
现在我们要让这只皮卡丘去捡左上角的饭团。那么皮卡丘周围的物体包括饭团就是环境,皮卡丘通过外部的比如摄像头来感知环境(不妨假设皮卡丘的眼睛就是一对摄像头),然后皮卡丘需要输出一系列的动作来实现捡起饭团这个任务。
当然你也可以让皮卡丘去完成其他任务。
不过,不管是什么样的任务,都包含了一系列的动作action 、观察observation 还有反馈值Reward 。
所谓的Reward就是Agent执行了动作与环境进行交互后,环境会发生变化,变化的好与坏就是Reward来表示的。比如上面的例子:
如果皮卡丘离饭团变近了,那么Reward就应该是正的,否则就应该是负的。
接下来这里用了Observation观察一词而不是环境那是因为Agent不一定能得到环境的所有信息,比如皮卡丘上的摄像头就只能得到某个特定角度的画面。因此,只能用Observation来表示Agent获取的感知信息。事实上,人与环境交互也是如此。
在每个时间点,Agent都会从可以选择的动作集合A中选择一个action执行。这个动作集合可以是连续的也可以是离散的,动作集合的数量将直接影响整个任务的求解难度。
那么知道了整个过程,任务的目标就出来了,那就是要能获得尽可能多的Reward。没有目标,控制也就无从谈起,因此,获取Reward就是一个量化的标准,Reward越多,就表示执行地越好。每个时间片,Agent都是根据当前的观察来确定下一步的动作。每次的观察就作为Agent的所处状态state 。因此,状态state和动作Action存在映射关系,也就是一个state可以对应一个action,或者对应不同动作的概率(常常用概率表示)。那么state到action的过程就称之为一个策略Policy 。当然,也可以是之前的一系列的状态动作集合到action的映射。
综上所述,增强学习的任务就是找到一个最优的策略policy从而使reward最多。
当然,我们一开始并不知道最优的策略是什么,因此往往从随机的策略开始,使用随机的策略进行试验,就可以得到一系列的状态、动作和反馈。也就是一系列的样本Sample 。增强学习的算法就是需要根据这些样本来改进policy,从而使得得到的样本的reward更好。正是这种让reward越来越好特性,该算法才被称为增强学习。
(2)Q-Learning
由于增强学习的样本是一个时间序列,因此将增强学习的问题模型化,就引入了马尔科夫决策过程。
简单的说,就是我们可以假设:
Agent的下一个状态仅取决于当前的状态和当前的动作。注意这里的状态是完全可观察的全部的环境状态。也就是说,只要我们有一个初始状态,后继状态就是全部确定的(绝大多数的增强学习都可以模型化为马尔科夫决策问题。 )
当然现实情况环境一般不完全可观察,然后有一些随机性,那么只能进行估计。
既然一个状态对应一个动作,或者动作概率,而有了动作,下一个状态也就确定了。这就意味着每个状态可以用一个确定的值来进行描述。可以由此判断一个状态是好的状态还是不好的状态。比如之前的皮卡丘往左上角走肯定是好的状态,往右下角走肯定是不好的状态。那么状态的好坏其实等价于对未来回报的期望。因此我们可以引入回报Return来表示某个时间的状态将具备的回报。另外我们再引入一个概念估值函数 ,用估值函数来表示一个状态未来的潜在价值,也就是变成了皮卡丘向左上角看感觉那边是饭团然后左上角的估值就高了。也就是说估值函数是回报的期望值。定义出估值函数接下来就是如何求解的问题了 。
这部分我决定一带而过而不是放上一堆公式来吓人。
实际上,求解估值函数只需要从定义出发进行简单的推导即可。最后可以证明估值函数是可以通过迭代 来进行计算的。
考虑到每个状态之后都有多种动作可以选择,每个动作之下的状态又都不一样,我们更关心某个状态下的不同动作的估值。即根据每个动作的估值来选择最好的一个去执行,这就是动作估值函数Q 。需要注意的是这里的reward是执行完动作之后得到的reward,而之前的reward是state对应的reward即多种动作对应的reward的期望值。
显然,现在我们要求解的是最优动作估值函数 。这可以利用估值迭代的方法进行求解,其核心思想是每次根据新得到的reward和原来的Q值来更新现在的Q值。Q-Learning的思想完全根据估值迭代得到。
但是实际情况下,我们没有办法遍历所有的状态还有所有的动作,我们只能得到有限的样本,于是Q-Learning提出了一种类似梯度下降的方法来减少估值误差,即每次朝着目标迈进一小步,最后可以收敛到最优的Q值。
(3)DQN
说白了就是用一个深度神经网络来作为Q值的网络。
(4)最后来看我们的CartPole小游戏
我们需要控制下面的cart移动使连接在上面的杆保持垂直不倒。这个任务简化到只有两个离散动作,即向左或者向右用力。
如果杆子过于倾斜,或者cart移出一个范围,那么游戏结束。
具体的建模和实现过程可以参考我翻译的官方文档。
这里我只讲下主要思路。
一开始,我们什么也不知道,也就是DQN网络中的超参数是完全随机的。实践是检验真理的唯一标准,我们需要实践,因此我们将根据当前的状态选择下一步的action,action的选择方式为:
① 利用DQN网络选择一个action(当然此时的DQN网络没啥子用,因为它所有的超参数都是随机生成的);
② 随机选择一个action。
为什么要有随机选择呢?简单而言就是为了探索新世界,如果我们一味地跟着模型走,而没有创新,显然我们永远也不可能进步。
选择了action之后,我们就可以得到environment反馈的reward。同时我们也进入了新的state。
如果新的状态并没有使游戏over,那么我们就继续。
如果游戏over了,那么我们就重新开始。
在这个过程中,我们DQN网络是一直在更新的,更新的目标当然是要使得在不同的state下采取的action获得最佳的reward。
这样,除了第一次DQN是在瞎选外,之后的选择还是有一定的经验根据的。
随着一次又一次的行动,我们的模型最终会变得越来越优秀,毕竟失败是成功之母嘛,吸取经验教训还是很重要的吧~~~
That’s ALL。
使用演示
一般的CartPole(即完全随机行动):
我们可以发现它毫无章法,很快就Over了。
DQN玩CartPole(参照官网写的):
刚开始训练时:
训练一段时间后:
这是我根据官网教程写的源码,做了比较详细的备注~~~
我们可以看到随着训练次数的增加,其存活下来的时间也呈上升趋势。
另外:
源代码中也提供了一份来自某YouTube主的源码,他精简了官网的源代码,供有需要者参考。
更多
T_T文章部分内容来源自我整理的DQN入门资料(资料基本都来自于国外相关学科的大佬讲座和一些tutorials)。
就这样吧,如果有什么不对的地方也可以给我留言,我会更正的~~~
2025-05-13 thbcm 阅读(328)
下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解
导语
昨天在看GitHub上深度学习方面stars较高的开源项目,于是发现了这个有趣的内容:
使用深度强化学习破解Flappy Bird游戏(深度Q-学习)。
相关文件
百度网盘下载链接: 💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
" target="_blank">💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
密码: tqus
参考文献
内容主要参考自GitHub开源项目:
Using Deep Q-Network to Learn How To Play Flappy Bird
链接:
https://github.com/yenchenlin/DeepLearningFlappyBird
原理简介
此项目参考了深度增强学习中的深度Q学习算法,并表明了此学习算法可以推广到破解Flappy Bird游戏当中。也就是说,项目是利用了Q-learning的变体进行训练的,其输入是原始像素输出是估计之后行动的数值函数。
PS:
若对深度强化学习感兴趣,公众号相关文件中也提供了一篇名为Demystifying Deep Reinforcement Learning的论文供大家学习,这也是原作者强烈推荐的论文。
网络架构:
在此之前的预处理为:
(1)灰度化图像;
(2)图像大小调整为80×80;
(3)每4帧画面堆叠成一个80x80x4输入数组。
网络最终输出结果为2×1的矩阵,用以决定小鸟是否行动。(也就是是否按屏幕咯~~~)
测试环境
电脑系统: Win10
Python版本: 3.5.4
Python相关第三方库:
TensorFlow_GPU版本: 1.4.0
Pygame版本: 1.9.3
OpenCV-Python版本: 3.3.0
具体配置细节请参考相关网络文档!!!
运行演示
命令行窗口进入DeepLearningFlappyBird 文件夹输入py -3.5 deep_q_network.py 回车运行即可:
结果如下:
更多参考文献
(1) Mnih Volodymyr, Koray Kavukcuoglu, David Silver, Andrei A. Rusu, Joel Veness, Marc G. Bellemare, Alex Graves, Martin Riedmiller, Andreas K. Fidjeland, Georg Ostrovski, Stig Petersen, Charles Beattie, Amir Sadik, Ioannis Antonoglou, Helen King, Dharshan Kumaran, Daan Wierstra, Shane Legg, and Demis Hassabis. Human-level Control through Deep Reinforcement Learning. Nature, 529-33, 2015.
(2) Volodymyr Mnih, Koray Kavukcuoglu, David Silver, Alex Graves, Ioannis Antonoglou, Daan Wierstra, and Martin Riedmiller. Playing Atari with Deep Reinforcement Learning. NIPS, Deep Learning workshop.
(3)Kevin Chen. Deep Reinforcement Learning for Flappy Bird Report | Youtube result.
链接:
https://youtu.be/9WKBzTUsPKc
(4)https://github.com/sourabhv/FlapPyBird
(5) https://github.com/asrivat1/DeepLearningVideoGames
2025-05-13 thbcm 阅读(322)
下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解
导语
好几天没推文的罪恶感让我决定今天来水一篇文章。
和之前“Python玩CartPole ”那篇推文一样,这也是来自于PyTorch官方教程的一个简单实例。
为了展示我的诚意,我依旧会由浅入深地讲解本文使用到的基本模型:Seq2Seq以及Attention机制 。
内容依旧会很长~~~
希望对初入NLP/DeepLearning的童鞋有所帮助~
废话不多说,直接进入正题~~~
相关文件
百度网盘下载链接: 💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
" target="_blank">💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
密码: qvhd
参考文献
官方英文教程链接:
http://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html
另外:
对英文文献阅读有困难的同学也不必担心,我已经把这个教程翻译为中文放到了相关文件中。
开发工具
系统: Windows10
Python版本: 3.6.4
相关模块:
torch模块;
numpy模块;
matplotlib模块;
以及一些Python自带的模块。
其中PyTorch版本为:
0.3.0
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
补充说明:
PyTorch暂时不支持直接pip安装。
有两个选择:
(1)安装anaconda3后在anaconda3的环境下安装(直接pip安装即可);
(2)使用编译好的whl文件安装,下载链接为:
💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
#list/path=%2Fpytorch
原理介绍
PS:
部分内容参考了相关网络博客和书籍。
(1)单层网络
单层网络的结构类似下图:
输入的x 经过变换wx+b 和激活函数f 得到输出y 。
相信对机器学习/深度学习有初步了解的同学都知道,这其实就是单层感知机嘛~~~
为了方便起见,我们把它画成这样(请忽视我拙劣的绘图水平):
x 为输入向量,y 为输出向量,箭头表示一次变换,也就是y =f(Wx +b )。
(2)经典RNN
在实际中,我们会遇到很多序列形的数据:
X1,X2,X3,X4…
例如我们的机器翻译模型,X1可以看作是第一个单词,X2可以看作是第二个单词,以此类推。
原始的神经网络并不能很好地处理序列形的数据,于是救世主RNN出现了,它引入了隐状态h 的概念,利用h对序列形的数据提取特征,接着再转换为输出。下面详细说明一下其计算过程(下图中的h0为初始隐藏状态,为简单起见,我们假设它是根据具体模型而设置的一个合理值 ):
其中:
再重申一遍,所有的字母均为向量,箭头代表对向量做一次变换。
h2的计算与h1类似,并且每一步使用的参数P、Q、b都是一样的,也就是说每个步骤的参数共享:
其中:
以此类推(记住参数都是一样的!!! ),该计算可以无限地持续下去(不限于图中的长度4!!! )。
那么RNN的输出又如何得到呢?
RNN的输出值是通过h进行计算的:
其中:
类似地,有y2、y3、y4…:
当然,和前面一样,这里的参数W和c也是共享的 。
以上就是最经典的RNN结构,我们可以发现其存在一个致命的缺点:
输入和输出序列必须是等长的!
这个缺点导致了经典RNN的适用范围并没有想象中的那么大。
(3)改进经典RNN
情况1(输入为N,输出为1):
假设我们的问题要求我们输入的是一个序列,输出的是一个单独的数值。那么我们只在最后一个h上进行输出变换就可以了:
情况2(输入为1,输出为N):
当输入只是单一数值而非序列时该怎么办呢?
我们可以只在序列开始进行输入计算:
当然你也可以把输入信息x作为每个阶段的输入:
情况3(输入为N,输出为M):
这是RNN最重要的一个变种,这种结构也被称为:
Encoder-Decoder模型 ,或者说Seq2Seq模型 。
我们的机器翻译模型就是以它为基础的。
Seq2Seq结构先将输入数据编码成一个上下文量c :
其中:
即上下文量c可以直接等于最后一个隐藏状态,也可以是对最后的隐藏状态做一个变换V 得到,当然也可以是对所有的隐藏状态做一个变换V得到等等。
上述RNN结构一般称为Encoder 。
得到c之后,我们需要另外一个RNN网络对其进行解码操作,即Decoder 。你可以把这个c当作初始状态h’0输入到Decoder中:
当然你也可以把c当作Decoder每一步的输入:
算了,补充说明一下吧:
缺少输入的部分(比如某些蓝色的方块没有x输入)你完全可以把x作为0处理然后再代入经典RNN所列出的公式中计算输出,其他的也类似。
(4)Attention机制
在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征c后再进行解码,当输入序列较长时,c很可能无法胜任存储输入序列所有信息的任务。
Attention机制很好地解决了上述问题。它在Decoder每一步输入不同的c:
其中,c根据Encoder中的h生成:
aij代表Encoder中第j阶段的hj和Decoder中第i阶段的相关性。
那么这些权重aij该如何确定呢?aij自然也是从模型中学得的,我们一般认为它与Encoder的第j个阶段的隐状态和Decoder的第i-1阶段的隐状态有关。
比如我们要计算a1j:
然后我们需要计算a2j:
以此类推 。
(5)最后任务:法语翻译成英语
有了前面的铺垫,相信大家都能看懂官网的教程。
在这里我们仅做简单的介绍,详细的建模和实现过程可以参考我翻译的官方文档。
Encoder网络为:
Decoder网络为:
其中,encoder最后一个隐藏状态作为decoder的初始隐藏状态。attention机制的权重计算类似(4) 中所述。GRU网络的结构为:
GRU网络结构在此就不作详细的介绍了,篇幅太长的话估计没人看得下去吧,就先这样了~~~
在相关文件中我也提供了4篇相关的论文供感兴趣者阅读与研究。(T_T纯英文的~~~)
结果展示
在cmd窗口运行Translation.py 文件即可。
误差曲线:
训练过程中cmd窗口的输出:
模型测试:
作为对比:
和最后一个测试结果一模一样有木有!!!
当然,有些翻译结果就不怎么理想了。因为模型和训练数据过于简单了(T_T这里就不举例了)~~~
最后四句话的attention图:
That’s all~~~
更多
感兴趣的同学可以进一步修改模型来获得更好的结果,当然也可以找找其他数据集制作诸如中翻英之类的模型~~~
2025-05-13 thbcm 阅读(345)
下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解
导语
T_T没有科研梦想的人半夜过来水篇文章~~~
让Python学会写写歌,创创作~~~
纯属娱乐~~~
改编自PyTorch官网的一个教程,不过我用TF写的,然后生成英文变成了生成中文~~~
Let’s Go~~~
相关文件
百度网盘下载链接: 💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
" target="_blank">💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
密码: 3dmx
开发工具
Python版本: 3.6.4
相关模块:
tensorflow-gpu模块;
numpy模块;
以及一些Python自带的模块。
其中TensorFlow-GPU版本为:
1.6.0
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理简介
关于RNN的介绍,请参考我之前的文章:
Python实现简单的机器翻译模型 (点击蓝字进入)
这里我们使用Char RNN模型进行训练。
即Seq2Seq模型中的特殊情况输入与输出等长。
也就是类似下图的样子(图源网络):
具体实现过程详见相关文件中的源代码。
使用演示
在cmd窗口运行Char_RNN.py 文件并根据提示输入相关信息即可。
训练相关的参数请在config.py 文件中调整:
训练所用的数据路径以及生成新文本所用的预热数据请在Char_RNN.py 文件中调整:
训练演示视频:
因为时间太长了,我只录了训练的前面一部分。
最终训练结果如下图所示:
结果展示
因为时间和资源有限。
这里只展示周杰伦的所有歌词作为样本进行训练之后测试的结果。
当然你完全可以找其他文本作为训练语料来生成风格各异的“文章” ,“歌词” 等等~~~
结果如下:
(预热歌词为:是曾与你躲过雨的屋檐 )
好吧我并不知道它在说啥T_T
一个失败的案例T_T
大概是模型太low了。而且训练数据是我从网上直接下载的,也没有预处理过T_T。中间竟然突然冒出一个括号我也是颓了T_T
更多
随便玩玩的T_T~~~
有兴趣的同学可以试着换更复杂的模型~~~
然后训练的语料最好处理一下~~~
好久没写TF了,代码可能写的有点糟糕T_T
就这样吧~~~
2025-05-13 thbcm 阅读(297)
导语
本文将在此基础上介绍LSTM网络。最后举一个类似“Python学写作 ”的例子来实现文本生成,如生成诗歌、小说等等。
让我们愉快地开始吧~~~
参考文献
Understanding LSTM Networks:
http://colah.github.io/posts/2015-08-Understanding-LSTMs/
相关文件
百度网盘下载链接: 💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
" target="_blank">💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
密码: gmpi
开发工具
Python版本: 3.6.4
相关模块:
tensorflow-gpu模块;
numpy模块;
以及一些Python自带的模块。
其中TensorFlow-GPU版本为:
1.7.0
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
另外,TensorFlow-GPU的环境搭建请自行参考相关的网络教程,注意版本和驱动严格对应即可。
原理介绍
一. RNNs
人们的思维总是具有延续性的,比如当你阅读这篇文章时,你对每个词的理解都会依赖于你前面看到的一些词,而不是把你前面看的内容全部抛弃,再去理解每个词。而传统的神经网络(CNN)无法做到这一点,因此有了循环神经网络(RNNs)。
在RNNs中,存在循环操作,使得它们能够保留之前学习到的内容:
在上图网络结构中,对于矩形块A 的那部分,通过输入Xt (t时刻的特征向量),它会输出一个结果ht (t时刻的状态或者输出),网络中的循环结构使得当前状态作为下一时刻输入的一部分。
将RNNs在时间步上进行展开,就可以得到下图:
也就是“Python实现简单的机器翻译模型 ”一文中所使用的RNNs链状的结构。显然,这样的结构是有利于处理序列相关问题的。近年来,其在语音识别、语言翻译等等领域都取得了巨大的成功。
而RNNs的成功,主要归功于LSTMs这种特殊RNNs结构的使用,而非普通的RNNs结构。
二. LSTMs
全称为Long Short Term Memory networks.
即长短期记忆网络。
普通RNNs的局限性在于当我们所要预测的内容和相关信息之间的间隔很大时,普通RNNs很难去把它们关联起来:
尽管从理论上来讲,只要参数合适,还是可以解决长时期依赖关系无法很好联系这一问题的,但具体实现起来似乎并不容易,至少目前为止是不容易的。
幸运的是,LSTMs能够很好地解决这一问题。它被设计的初衷就是为了能够记住长时期内的信息。
循环神经网络是由相同结构的神经网络模块进行复制而形成的。在标准的RNNs中,神经网络模块的结构非常简单,比如可以由单一的tanh层构成:
LSTMs也有类似的结构,不过神经网络模块的结构变得相对复杂了一些:
接下来,我们来详细介绍一下这个结构。首先,我们来定义一下用到的符号:
粉红色的圈:
代表向量加之类的逐点操作;
黄色矩形框:
代表神经网络层;
普通的线:
用于携带并传递向量;
合并的线:
代表对两条线上所携带的向量进行合并;
分开的线:
代表将线上所携带的向量复制后传给两个地方。
2.1 LSTMs的核心思想
假设一个绿色的框就是一个cell。
向量通过结构图最上面的那条贯穿cell的水平线穿过整个cell,而cell仅对其做了少量的线性操作:
显然,这样的结构能够很轻松地让信息从整个cell中穿过而不发生变化。
当然,只有一条水平线是无法实现添加或者删除信息的,也就是实现让信息有选择地通过cell,这需要通过一种叫做门(gates)的结构来实现。
门结构主要由一个sigmoid神经网络层和一个逐点相乘的操作来实现:
sigmoid层输出的向量每个元素都是介于0和1之间的实数,表示此时通过的信息的权重,当其为0时表示“此时不让任何信息通过”,为1时表示“此时让所有信息通过”。每个LSTM都有三个这样的门结构,来实现保护和控制信息。
2.2 逐步理解LSTM
遗忘门(forget gate layer):
首先,LSTM需要决定哪些信息需要丢弃,哪些信息需要保留。这是通过一个叫做遗忘门的sigmoid层来实现的。它的输入是ht-1 和xt ,输出是一个数值都在0到1之间的向量,表示Ct-1 中各部分信息的权重,0表示不让该部分信息通过,1表示让该部分信息全部通过。
具体而言,比如在语言模型中,我们要根据所有的上下文信息来预测下一个词。在这种情况下,每个cell的状态中都应该包含了当前主语的性别信息。这样,接下来我们才能够正确地使用代词。但是,当我们开始描述一个新的主语时,就应该把之前的主语性别给丢弃了才对。
传入门(input gate layer):
其次,LSTM将决定让哪些新的信息加入到cell的状态中来。该实现分两个步骤进行:
① 用一个tanh层生成一个备选向量,用于表示获得的所有可添加信息;
② 用一个叫做传入门的sigmoid层来决定步骤①中获得的可添加信息各自的权重。
具体而言,比如在语言模型中,我们需要把新主语的性别信息添加到cell状态中,来替换掉之前的主语性别信息。
有了遗忘门和传入门,我们就能够更新cell的状态了,即把Ct-1 更新为Ct 。
还是以语言模型为例,假设我们的模型刚输出了一个代词,接下来可能要输出一个动词,那么这个动词应该采用单数形式还是复数形式呢?显然,我们需要把代词相关的信息和当前的预测信息都加入到cell的状态中来,才能够进行正确的预测。
具体计算方式如下图所示:
输出门(Output):
最后,我们需要决定输出值。输出值的计算方式为:
① 使用sigmoid层来决定/计算出Ct 中的哪部分信息会被输出;
② 利用tanh层将Ct 的取值压缩到-1到1之间;
③ 将tanh层的输出和sigmoid层的输出相乘即为最终的输出结果。
三. LSTMs的变种
① 将cell的状态作为门结构输入的一部分。
② 将遗忘门与传入门耦合,即不再分开决定要遗忘和添加的信息。
③ GRU
GRU模型“简化”了LSTM模型的设计,其中rt 由LSTM中的遗忘门和传入门合并而得,称为重置门;zt 为更新门,作用相当于LSTM中的输出门。
实际应用
为了贯彻理论与实践相结合的理念,本文将举一个简单的小例子,该例子使用的模型与“Python学写作 ”类似,本文不再作多余的介绍。
具体实现过程详见相关文件中的源代码。
使用演示
模型训练:
在cmd窗口运行‘train.py’ 文件即可:
如有需要,可自行修改相关参数:
模型使用:
在cmd窗口运行“generate.py ”文件即可。
注意模型参数需和train.py 文件中的模型参数一致:
结果展示
生成英文文本:
以莎士比亚的作品为训练素材获得的结果:
生成中文文本:
以周杰伦的作品为训练素材获得的结果:
更多
代码截止2018-06-24 测试无误。
模型比较简单,有兴趣的朋友可以在此基础上进行优化,当然RNN的作用可不仅仅是文本生成哦~
以后有机会再举其他例子吧~~~
2025-05-13 thbcm 阅读(341)
下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解
导语
T_T之前似乎发过类似的文章,那时候是用Keras实现的,现在用的PyTorch,而且那时候发的内容感觉有些水,于是我决定。。。
好吧我确实只是为了写点PyTorch练手然后顺便过来水一篇美文~~~
利用Python实现图像风格的迁移!!!
不喜欢过程同学的依旧可以直接下拉到最后看结果~
Let’s Go!
参考资料
链接:
http://pytorch.org/tutorials/advanced/neural_style_tutorial.html#
是的,这又是来自于PyTorch官网的一个教程。
在相关文件中我依旧提供了我翻译好的版本~~~
以及涉及到的论文~~~
相关文件
网盘下载链接: 💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
" target="_blank">💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
密码: tv5i
开发工具
Python版本: 3.6.4
相关模块:
torch模块;
PIL模块;
matplotlib模块;
torchvision模块;
以及一些Python自带的模块。
torch版本:
0.3.0
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
补充说明:
PyTorch暂时不支持直接pip安装。
有两个选择:
(1)安装anaconda3后在anaconda3的环境下安装(直接pip安装即可);
(2)使用编译好的whl文件安装,下载链接为:
💡 温馨提示: 使用手机网盘APP转存,即可🎁 订阅更新本资源。后续更新都会直接推送至您的网盘,并收到APP订阅通知,无需再次寻找链接!
#list/path=%2Fpytorch
额外说明
T_T相关文件中提供了所需的预训练模型,若嫌弃官网的下载速度,可以下载我的。
下载之后放到类似下图路径的文件夹中:
原理简介
作为一个纯正的非艺术生,抱歉我真的没法解释什么叫图像的艺术风格。反正齐白石和梵高的画肯定不是一个style的就是了。
那么我来尝试解释一下风格迁移吧:
风格迁移的实质是保留原画内容的基础上,用另外一种style来呈现原画。
那么如何量化呢?
简单而言大概是这样的:
利用CNN逐层提取图像的特征(层越靠后提取出的特征越高级和稳定,即更能表现图片的高级语义信息),并且将某一层或某几层输出的Gram矩阵 作为损失函数,来衡量两幅图像之间的内容/风格差异(T_T就是两幅图像分别经过相同的卷积神经网络,比较某一层或者某几层输出的Gram矩阵的差异)。
Gram矩阵是啥???
具体而言,其计算方式为:
我们都知道,一张图片在某个卷积层的输出特征为一个形如(batch_size, channels, width, height) 的四阶张量,显然batch_size为1。
我们将类似下图的特征:
转换为(batch_size*channels, width*height) 大小的矩阵,这个矩阵和它的转置相乘就可以得到一个大小为(batch_size*channels, batch_size*channels) 的矩阵,这个矩阵即为Gram矩阵。
其实这就算是定义了图像风格和图像内容这两个概念了,接下来我们就可以实现风格迁移了。
其流程大概是这样的:
具体的实现细节详见源代码吧~~~
相关文件中也有官网教程的个人翻译版以及相关的论文供感兴趣者参考。
使用方式
修改下图所示处的图片路径为自己的图片路径:
在cmd窗口运行Neural_Transfer.py 文件即可。
由于资源和时间有限,下面展示的结果我都只跑了几百轮左右,图像大小为256*256。
梵高笔下的皮卡丘
原图像:
生成的图像:
梵高笔下的老北京
原图像:
生成的图像:
毕加索笔下的爱因斯坦
原图像:
生成的图像:
齐白石笔下的西湖
原图像:
生成的图像:
更多
利用其他库实现的图像风格迁移:
1.基于python深度学习库DeepPy的实现:
https://github.com/andersbll/neural_artistic_style
2.基于python深度学习库Caffe的实现:
https://github.com/fzliu/style-transfer
3.基于python深度学习库TensorFlow的实现:
https://github.com/log0/neural-style-painting
感兴趣的朋友自己去实现一下吧~~~