python中stacked_栈式自动编码器(Stacked AutoEncoder)
起源:自动编码器
单自动编码器,充其量也就是个强化补丁版PCA,只用一次好不过瘾。
仿照stacked RBM构成的DBN,提出Stacked AutoEncoder,为非监督学习在深度网络的应用又添了猛将。
这里就不得不提 “逐层初始化”(Layer-wise Pre-training),目的是通过逐层非监督学习的预训练,
来初始化深度网络的参数,替代传统的随机小值方法。预训练完毕后,利用训练参数,再进行监督学习训练。
Part I 原理
非监督学习网络训练方式和监督学习网络的方式是相反的。
在监督学习网络当中,各个Layer的参数W受制于输出层的误差函数,因而Layeri参数的梯度依赖于Layeri+1的梯度,形成了"一次迭代-更新全网络"反向传播。
但是在非监督学习中,各个Encoder的参数W只受制于当前层的输入,因而可以训练完Encoderi,把参数转给Layeri,利用优势参数传播到Layeri+1,再开始训练。
形成"全部迭代-更新单层"的新训练方式。这样,Layeri+1效益非常高,因为它吸收的是Layeri完全训练奉献出的精华Input。
Part II 代码与实现
栈式机在构造函数中,构造出各个Layer、Encoder,并且存起来。
Theano在构建栈式机中,易错点是Encoder、Layer的参数转移。
我们知道,Python的列表有深浅拷贝一说。Theano所有被shared标记的变量都是浅拷贝。
因而首先有这样的错误写法:
def __init__(self,rng,input,n_in,n_out,layerSize):
......for i inxrange(len(layerSize)):
......
da.W=hidenlayer.W
da.bout=hidenlayer.b
然后你在外部为da做grad求梯度的时候就报错了,提示说params和cost函数不符合。
这是因为cost函数的Tensor表达式在写cost函数时就确定了,这时候da这个对象刚好构造完,因而Tensor表达式中的da.W是构造随机值。
然后我们在da构造完了之后,手贱把da.W指向的内存改变了(浅拷贝相当于引用),这样算出的grad根本就不对。
其实这样写反了,又改成了这样
def __init__(self,rng,input,n_in,n_out,layerSize):
......for i inxrange(len(layerSize)):
......
hidenlayer.W=da.W
hidenlayer.b=da.bout
好吧,这样不会报错了,而且每训练一个Encoder,用get_value查看Layer的值确实改变了。但是,训练Encoderi+1的时候,怎么感觉没效果?
其实是真的没效果,因为Layeri的参数根本没有传播到Layeri+1去。
Theano采用Python、C双内存区设计,在C代码中训练完Encoderi时,参数并没有转到Layeri中。但是我们明明建立了浅拷贝啊?
原来updates函数在C内存区中,根本没有觉察到浅拷贝关系,因为它在Python内存区中。
正确做法是像教程这样,在da构造时建立浅拷贝关系,当编译成C代码之后,所有Python对象要在C内存区重新构造,自然就在C内存区触发了浅拷贝。
da=dA(rng,layerInput,InputSize,self.layerSize[i],hidenlayer.W,hidenlayer.b)
或者训练完Encoderi,强制把Encoderi参数注入到C内存区的Layeri里。
updateModel=function(inputs=[],outputs=[],updates=[(....)],
updateModel()
Theano的写法风格近似于函数式语言,对象、函数中全是数学模型。一旦构造完了之后,就无法显式赋值。
所以,在Python非构造函数里为对象赋值是愚蠢的,效果仅限于Python内存区。但是大部分计算都在C内存区,所以需要updates手动把值打进C内存区。
updates是沟通两区的桥梁,一旦发现Python内存区中有建立浅拷贝关系,就会把C内存区中值更新到Python内存区。(有利于Python中保存参数)
但是绝对不会自动把Python内存区值,更新到C内存区当中。(这点必须小心)
这种做法可以扩展到,监督训练完之后,参数的保存与导入。
python中stacked_栈式自动编码器(Stacked AutoEncoder)相关推荐
- 链表list(链式存储结构实现)_VOL.2 如何在python中实现链式存储结构
一.前言 链式存储作为一种重要的数据存储方式有着极强的数据组织能力.灵活型和动态性,在众多数据结构中应用非常广泛.所谓链式存储结构,就是采用分散的存储空间分别存储每一组数据再通过地址链接的形式将全部数 ...
- 堆叠自动编码器(Stacked AutoEncoder)
Deeplearning Algorithms tutorial 谷歌的人工智能位于全球前列,在图像识别.语音识别.无人驾驶等技术上都已经落地.而百度实质意义上扛起了国内的人工智能的大旗,覆盖无人驾驶 ...
- python底层是用什么语言实现的_我为何说Python是全栈式开发语言?
Python 的排名从去年开始就借助人工智能持续上升,如今它已经成为了第一名.但排在前四名的语言 Python.C.Java 和 C++都拥有广大的用户群体,而且他们的用户总量也十分相近.实际上,Di ...
- Python中的推导式
推导式 Compression 推导式 ( Compression )是Python语言的一大特色 相比于其他语言而言, 推导式使得Python能够编辑的进行循环,创建出特定的字典,列表等可迭代对象 ...
- python中的栈结构_Python可以实现栈的结构吗
栈(stack)又名堆栈,它是一种运算受限的线性表.在Python中可使用列表进行实现. 什么是栈? 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这 ...
- python中出栈的方法,python中栈的原理及实现方法示例
python中栈的原理及实现方法示例 本文实例讲述了python中栈的原理及实现方法.分享给大家供大家参考,具体如下: 栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素.访问元素.删除元 ...
- Python中列表推导式同filter和map的比较
symbols = "symbols" beyond_ascii = [ord(s) for s in symbols if ord(s) > 100]beyond_asci ...
- Python中使用推导式创建序列
推导式创建序列 推导式是从一个或者多个迭代器快速创建序列的一种方法.它可以将循环和条件判断结合,从而避免冗长的代码.推导式是典型的Python 风格. 列表推导式 列表推导式生成列表对象,语法如下: ...
- python中的栈结构_python中有栈吗
在英语词典中,堆(Stack)表示将对象放在另一个对象上. 在这个数据结构中分配内存的方式是一样的. 它以类似的方式存储数据元素,类似在厨房中一堆盘子:一个在另一个之上存放. 所以堆栈数据数据允许操作 ...
- python中的栈结构_对Python列表进行封装和二次开发实现自定义栈结构
设计自定义栈类,模拟入栈.出栈.判断栈是否为空.是否已满以及改变栈大小等操作. class Stack: #构造方法 def __init__(self, maxlen = 10): self._co ...
最新文章
- socket.io,io=Manager(source, opts)
- 计算机网络在线测试第二章,进行测验:-第2章-网络体系结构与网络协议测试.doc...
- 雨雪出行伴侣,优质PVC时尚鞋套,防滑/防水更耐磨
- .sh文件是什么语言_FastDFS分布式文件系统的搭建安装
- 新加坡教育(20181101)
- Unreal Engine 4 中的 UI 优化技巧
- IntelJIdea 如何修改控制台字体大小和主题
- 创造or变革:卡萨帝为何能重塑高端品质生活?
- 20145305 《网络对抗》注入Shellcode并执行Return-to-libc 攻击实验
- 计算机VFP基础知识,VFP基础教程章数据库系统基础知识4
- 八大常用渗透测试工具
- 3---IO流练习题库
- 【云驻共创】初探数通网络开放可编程
- Android UI设计经验分享,掌握设计技巧,让你的应用独树一帜
- Nutch安装第四天,进入正题,Nutch2.4的配置和编译
- Java并发编程(总结最全面的面试题)
- Ubuntu+Windows双系统远程重启互相切换
- python之pandas初级使用案例(2)对数据的访问和操作
- top-level object
- python函数**什么意思_python中函数的参数是什么意思
热门文章
- Atitit.搜索引擎内容来源解决之道
- paip.python错误解决15
- 兴业证券:主动偏股型基金评价体系
- Voleon Group:一家『纯』用机器学习策略的对冲基金
- (转)金丘股份CEO左鹏:用区块链做ABS,实现消费金融ABS创新
- 开放、创新、合作,共赢多样性计算新时代
- 预告:阿里云存储+企业出海全球化网络新品发布会 | 凌云时刻
- 什么技术才值得你长期投入? | 凌云时刻
- java前端导入excel_Java之导入Excel Vue框架前端篇
- 【基础教程】信噪比+香农公式【1748期】