Autoencoder

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



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

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

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

但这和深度学习有什么关系呢? 这就要说到压缩编码,咱们都知道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个不一样的数。dom

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

经过数轮迭代,咱们看到以下的状况:函数

(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)
这里写图片描述


这里写图片描述

相关文章
相关标签/搜索