资讯专栏INFORMATION COLUMN

Autoencoder

GitChat / 2536人阅读

摘要:简单来说是一个压缩编码器,也就是对的一坨东西通过变换,输出和一样的东西。例如是一个鸡,也是一个鸡,是一个鸭,也是一个鸭。学术一点说就是找到一个函数能够使得,叫做。加入实战微信群,实战群,算法微信群,算法群。

作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai
简书地址:https://www.jianshu.com/p/fd3...


自编码器 Autoencoder

稀疏自编码器 Sparse Autoencoder

降噪自编码器 Denoising Autoencoder

堆叠自编码器 Stacked Autoencoder


本博客是从梁斌博士的博客上面复制过来的,本人利用 Tensorflow 重新实现了博客中的代码

深度学习有一个重要的概念叫 autoencoder ,这是个什么东西呢,本文通过一个例子来普及这个术语。

简单来说 autoencoder 是一个压缩编码器,也就是对 input 的一坨东西通过变换,输出和 input 一样的东西。例如 input 是一个鸡, output 也是一个鸡, input 是一个鸭, output 也是一个鸭。学术一点说就是找到一个函数能够使得 Function(input) = input ,叫做 identity function 。如上图所示,即学习 Hw,b(x)=x 。

但这和深度学习有什么关系呢? 这就要说到压缩编码,我们都知道input需要有一种编码形式,如果我们能在函数内部找到一个更简洁的编码形式,那么这个变换过程就等价于学习到了一种压缩表示的函数,能够少量的存储形式来表示原本较复杂的但信息冗余较大的表示形式。

我们下面的代码中举了一个精彩的例子(这个例子是从同学的一次实验中直接受启发,我只是按照自己的理解实现了一把,例子非原创)。在这个例子中,input是4个不同的数字,分别是

    (0,0,0,1)可以看作1
    (0,0,1,0)可以看作2
    (0,1,0,0)可以看作3
    (1,0,0,0)可以看作4

因为所有的 input 只有这4种,因此其实用4个bit是不经济的,存在压缩表示的可能性,比如2个bit就可以表示这4个不同的数。

那么我们设计了输入层是 4+1 个神经元(4个神经元接受4bit编码的input,1个神经元是常数项,这个用来做先验的);隐藏层是 2+1 个神经元(因为我们实现已经知道2个bit就够了,所以2个隐藏层,具有足够的表达能力);输出层是 4 个神经元(为了能让输出和输入保持一致)。

通过数轮迭代,我们看到如下的情况:

    (0,0,0,1)->(0.99,0.09)->(0.06,0.00,0.01,0.91)
    (0,0,1,0)->(0.85,0.99)->(0.00,0.07,0.90,0.07)
    (0,1,0,0)->(0.01,0.67)->(0.06,0.87,0.11,0.00)
    (1,0,0,0)->(0.12,0.00)->(0.89,0.10,0.00,0.02)
    input_layer hidden_layer  output_layer

hidden层的编码恰好可以看作是:

     (0.99,0.09)  1,0
     (0.85,0.99)  1,1
     (0.01,0.67)  0,1
     (0.12,0.00)  0,0

也就是说输入的(0,0,0,1)可以被压缩表示成(1,0),最终4bit的信息,可以用2bit表示,当然还需要保持边的权重,但这些边权重只需要一份,在输入足够复杂的时候,压缩表示是有价值的。

那压缩表示有什么价值呢?比如一组广告,一条新闻,人看了挺好,压缩表示后,人看起来就不爽了,恰恰是人看着不爽了,机器就好处理了,下回再说。

实验代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tensorflow as tf 
import numpy as np 


def model(x, w1, w2, b1, b2):

    a = tf.matmul(x, w1)
    b = tf.add(a,b1)
    c = tf.sigmoid(b)
    hidden = tf.sigmoid(tf.add(tf.matmul(x, w1), b1))
    out = tf.nn.softmax(tf.add(tf.matmul(hidden, w2), b2))

    return out

x = tf.placeholder("float", [4, 4])

w1 = tf.Variable(tf.random_normal([4,2]), name = "w1")
w2 = tf.Variable(tf.random_normal([2,4]), name = "w2")
b1 = tf.Variable(tf.random_normal([2]), name = "b1")
b2 = tf.Variable(tf.random_normal([4]), name = "b2")


pred = model(x, w1, w2, b1, b2)
cost = tf.reduce_sum(tf.pow(tf.sub(pred, x), 2))
optimizer = tf.train.AdamOptimizer().minimize(cost)

with tf.Session() as sess:

    init = tf.initialize_all_variables()
    sess.run(init)

    input_data = np.array([[0,0,0,1],[0,0,1,0],[0,1,0,0],[1,0,0,0]], float)

    for i in xrange(10000):    
        sess.run(optimizer, feed_dict = {x: input_data})

    res = sess.run(pred, feed_dict = {x: input_data})
    index = np.argmax(res, 1)
    for i in xrange(4):
        tmp = np.zeros((4,))
        tmp[index[i]] = 1.
        print res[i]
        print tmp

Reference:

UFLDL

小白学Tensorflow之自编码Autoencoder


作者:chen_h
微信号 & QQ:862251340
简书地址:https://www.jianshu.com/p/fd3...

CoderPai 是一个专注于算法实战的平台,从基础的算法到人工智能算法都有设计。如果你对算法实战感兴趣,请快快关注我们吧。加入AI实战微信群,AI实战QQ群,ACM算法微信群,ACM算法QQ群。长按或者扫描如下二维码,关注 “CoderPai” 微信号(coderpai)


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41168.html

相关文章

  • Sparse Autoencoder

    摘要:稀疏编码是对网络的隐藏层的输出有了约束,即隐藏层神经元输出的平均值应尽量为。也就是说,大部分的隐藏层神经元都处于非状态。为了满足这一条件,隐藏层神经元的活跃度必须接近于。 作者:chen_h微信号 & QQ:862251340微信公众号:coderpai简书地址:https://www.jianshu.com/p/5f3... 自编码器 Autoencoder 稀疏自编码器 Spa...

    harryhappy 评论0 收藏0
  • Denoising Autoencoder

    摘要:降噪自编码器认为,设计一个能够恢复原始信号的自编码器未必是最好的,而能够对被污染破坏的原始数据进行编码解码,然后还能恢复真正的原始数据,这样的特征才是好的。该恢复信号尽可能的逼近未被污染的原数据。此时,监督训练的误差函数就从原来的变成了。 作者:chen_h微信号 & QQ:862251340微信公众号:coderpai简书地址:https://www.jianshu.com/p/f7...

    JerryC 评论0 收藏0
  • Deep learning:九(Sparse Autoencoder练习)

    摘要:实验基础其实实现该功能的主要步骤还是需要计算出网络的损失函数以及其偏导数,具体的公式可以参考前面的博文八。生成均匀分布的伪随机数。 前言:   现在来进入sparse autoencoder的一个实例练习,参考Ng的网页教程:Exercise:Sparse Autoencoder。 这个例子所要实现的内容大概如下:从给定的很多张自然图片中截取出大小为8*8的小patches图片共10000张...

    ?xiaoxiao, 评论0 收藏0
  • 人工智能术语表

    摘要:如果你对算法实战感兴趣,请快快关注我们吧。加入实战微信群,实战群,算法微信群,算法群。 作者:chen_h微信号 & QQ:862251340微信公众号:coderpai简书地址:https://www.jianshu.com/p/b5c... 介绍一些人工智能技术的术语,如果你还有术语补充,请访问 Github English Terminology 中文术语 neur...

    pingan8787 评论0 收藏0
  • Deep learning:四十二(Denoise Autoencoder简单理解)

    摘要:本篇博文主要是根据的那篇文章简单介绍下,然后通过个简单的实验来说明实际编程中该怎样应用。当然作者也从数学上给出了一定的解释。自顶向下的生成模型观点的解释。信息论观点的解释。 前言:   当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise Autoencoder(简称dAE),由Bengio在08年...

    gotham 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<