文档章节

Autoencoder

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:23
字数 919
阅读 6
收藏 0


本博客是从梁斌博士的博客上面复制过来的,本人利用 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

本文转载自:http://www.jianshu.com/p/fd322d56268b

共有 人打赏支持
AllenOR灵感
粉丝 11
博文 2635
码字总数 83001
作品 0
程序员
私信 提问
AI学习笔记——Autoencoders(自编码器)

Autoencoder 的基本概念 之前的文章介绍过机器学习中的监督学习和非监督学习,其中非监督学习简单来说就是学习人类没有标记过的数据。对于没有标记的数据最常见的应用就是通过聚类(Clusteri...

Hongtao洪滔
07/13
0
0
基于 Tensorflow 的栈式自编码器--TFSAE

TFSAE 是基于 Tensorflow 的 Stacked AutoEncoder (栈式自编码器)。可用于数据降维、特征融合。下图是 TFSAE 将 iris 数据集中的 4 维特征融合为 2 维特征的示例: Encoded Iris Data(2 feat...

CrawlScript
2017/08/29
102
0
TensorFlow人工智能入门教程之十四 自动编码机AutoEncoder 网络

好久没有更新了,最近 想在空余时间 之外 ,对以前创业人工智能平台进行封装,想做一个人工智能顶层框架,我是实战派,不是理论派,什么BP FF 什么 SGD 等等 一大堆优化 optimation 知道偏微...

zhuyuping
2016/06/05
2.8K
1
机器学习笔记-Deep Learning

林轩田机器学习技法关于特征学习系列,其中涉及到 , , , , , , - , 等。 机器学习笔记-Neural Network 机器学习笔记-Deep Learning 机器学习笔记-Radial Basis Function Network 机器...

robin_Xu_shuai
2017/12/18
0
0
深度学习算法实践13---去噪自动编码机(Denosing Autoencoder)

截至目前为止,我们所讨论的神经网络技术,感知器模型、BP网络、多层卷积神经网络(CNN),都可以视为前馈神经网络的变形,都会采用信号前向传播,误差反向传播修正连接权值,采用有监督学习...

最老程序员闫涛
2016/08/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

window下安装maven

1.下载软件包: 2.解压到当前的安装路径: D:\Maven3.5.3 3.添加环境变量: 新建一个名为:MAVEN_HOME 填写解压路径:D:\Maven3.5.3 打开path,添加:%MAVEN_HOME%\bin 确定即可。 4.验证环境...

狼王黄师傅
6分钟前
0
0
聊聊flink的FsCheckpointStorage

序 本文主要研究一下flink的FsCheckpointStorage CheckpointStorage flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/CheckpointStorage.java /** * CheckpointStor......

go4it
28分钟前
2
0
makefile 常用函数

Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员。今天我们来学习下makefile的常用函数。 《GNU make》h...

科陆李明
今天
17
0
Android 报错 Could not find com.android.tools.build:aapt2:3.2.1-4818971.

报错信息: Could not find com.android.tools.build:aapt2:3.2.1-4818971.Searched in the following locations: file:/C:/Users/96110/AppData/Local/Android/Sdk/extras/m2reposito......

lanyu96
今天
9
0
我的Linux系统九阴真经

我的Linux系统九阴真经 在今天,互联网的迅猛发展,科技技术也日新月异,各种编程技术也如雨后春笋一样,冒出尖来了。各种创业公司也百花齐放百家争鸣,特别是针对服务行业,新型互联网服务行...

linuxCool
今天
34
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部