1. 程式人生 > >TensorFlow實現去噪自編碼器

TensorFlow實現去噪自編碼器

#去噪的自編碼器
import numpy as np
import sklearn.preprocessing as prep
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

#xavier是初始化器
def xavier_init(fan_in,fan_out,constant=1):
    low = -constant * np.sqrt((6.0 /fan_in +fan_out))
    hight = constant * np.sqrt(6.0 /(fan_in +fan_out))
    return tf.random_uniform([fan_in,fan_out],minval=low,maxval=hight,dtype=np.float32)

#定義一個類
class AdditiveGaussianNoiseAutoencoder(object):
    def __init__(self,n_input,n_hidden,transfer_function=tf.nn.softplus,optimizer=tf.train.AdamOptimizer,scale=0.1):
        self.n_input=n_input
        self.n_hidden=n_hidden
        self.trainfer=transfer_function
        self.scale=tf.placeholder(tf.float32)
        self.training_scale=scale
        network_weights = self._initialize_weights()
        self.weights=network_weights
        #定義網路的結構
        # x為輸入,我們為輸入建立一個維度為n_input的placeholder.
        self.x=tf.placeholder(tf.float32,[None,self.n_input])
        #我們建立一個能提取特徵的隱含層,我們先將隱含層加上噪聲然後與權重相乘,再加上偏量,然後通過啟用函式處理
        self.hidden=self.trainfer(tf.add(tf.matmul(self.x + scale * tf.random_normal((n_input,)),self.weights['w1']),self.weights['b1']))
        #我們在輸出層進行資料的復原。
        self.reconstruction = tf.add(tf.matmul(self.hidden,self.weights['w2']),self.weights['b2'])
        #定義自編碼器的損失函式,直接使用平方誤差作為cost,即用tf.subtract計算輸出self.reconstruction,self.x的差值,再用tf.pow計算差值的平方。
        #最後使用tf.reduce_sum求和得到平方誤差。
        self.cost=0.5 * tf.reduce_sum(tf.pow(tf.subtract(self.reconstruction,self.x),2.0))
        #使用優化器對cost進行優化。
        self.optimizer = optimizer.minimize(self.cost)

        init = tf.global_variables_initializer()
        self.sess = tf.Session()
        self.sess.run(init)

#這個是引數初始化的方程
    def _initialize_weights(self):
            all_weights = dict()
            all_weights['w1']=tf.Variable(xavier_init(self.n_input,self.n_hidden))
            all_weights['b1']=tf.Variable(tf.zeros([self.n_hidden],dtype=tf.float32))
            all_weights['w2']=tf.Variable(tf.zeros([self.n_hidden,self.n_input],dtype=tf.float32))
            all_weights['b2']=tf.Variable(tf.zeros([self.n_input],dtype=tf.float32))
            return all_weights
#定義一個計算損失的cost的及執行一步訓練的的函式partial_fit
    def partial_fit(self,x):
            cost ,opt= self.sess.run((self.cost,self.optimizer),feed_dict={self.x:x,self.scale:self.training_scale})
            return cost
#這個是返回cost的值,並不執行訓練的操作。
    def cale_total_coat(self,x):
            return self.sess.run(self.cost,feed_dict={self.x:x,self.scale:self.training_scale})
#返回的是自編碼器的隱含層的輸出的結果,它的目的是提供一個介面來獲取抽象後的特徵,隱含層的主要作用是學習出資料的高階特徵。
    def tarnsfrom(self,x):
            return self.sess.run(self.hidden,feed_dict={self.x:x,self.scale:self.training_scale})
#他將隱含層的輸出結果作為輸入,通過之後的重建層將提取到的高階特徵復原為原始資料。這個介面與transfrom介面正好將自編碼器拆分為兩個部分。這個是後半部分,將高階特徵復原為原始資料。
    def generate(self,hidden=None):
            if hidden is None:
                hidden = np.random.normal(size=self.weights['b1'])
            return self.sess.run(self.reconstruction,feed_dict={self.hidden:hidden})
#這個輸入的是原資料,輸出的是復原後的資料
    def reconstruct(self,x):
            return self.sess.run(self.reconstruct,feed_dict={self.x:x,self.scale:self.training_scale})

    def getWeights(self):
            return self.sess.run(self.weights['w1'])

    def getBiases(self):
            return self.sess.run(self.weights['b1'])

mnist=input_data.read_data_sets('MNIST_data',one_hot=True)

#這個函式的作用是通過訓練資料找到一個好的scale
def standard_scale(X_train,X_test):
    preprocessor= prep.StandardScaler().fit(X_train)
    X_train = preprocessor.transform(X_train)
    X_test = preprocessor.transform(X_test)
    return X_test,X_train

#這個函式的作用是隨機獲取block的資料,不放回的抽樣。
def get_random_block_from_data(data,batch_size):
    start_index =np.random.randint(0,len(data) - batch_size)
    return data[start_index:(start_index + batch_size)]

X_tarin ,X_test =standard_scale(mnist.train.images,mnist.train.images)

n_samples = int(mnist.train.num_examples)
training_epochs=20
batch_size=128
display_step = 1

autoencoder =AdditiveGaussianNoiseAutoencoder(n_input=784,n_hidden=200,transfer_function=tf.nn.softplus,optimizer=tf.train.AdamOptimizer(learning_rate=0.001),scale=0.01)


for epoch in range(training_epochs):
    avg_coat=0
    total_batch = int (n_samples  / batch_size)
    for i in range(total_batch):
        batch_xs=get_random_block_from_data(X_tarin,batch_size)

        coat=autoencoder.partial_fit(batch_xs)
        avg_coat+=coat / n_samples * batch_size

    if epoch % display_step ==0:
        print("Epoch:",'%04d' %(epoch + 1) , "cost=",'{:.9f}'.format(avg_coat))
print("Total coat:" + str(autoencoder.cale_total_coat(X_test)))

相關推薦

TensorFlow實現編碼

#去噪的自編碼器 import numpy as np import sklearn.preprocessing as prep import tensorflow as tf from tensorflow.examples.tutorials.mnist import i

卷積編碼專案實現

import numpy as np import tensorflow as tf import matplotlib.pyplot as plt from tensorflow.examples.tutorials.mnist import input_data mnist = input

Tensorflow——編碼

TensorFlow實現自編碼器 在深度學習中,自編碼器是一種非常有用的無監督學習模型。自編碼器(AutoEncoder),即可以用自身的高階特徵編碼自己。自編碼器也是一種神經網路,但它的輸入與輸出是一致的。自編碼器的思想就是藉助稀疏編碼,使用稀疏的一些高階

深度學習,如何用編碼預測原始資料?

去噪自編碼器(denoising autoencoder, DAE)是一類接受損壞資料作為輸入,並訓練來預測原始未被損壞資料作為輸出的自編碼器。 去噪自編碼器代價函式的計算圖。去噪自編碼器被訓練為從損壞的版本~x 重構乾淨資料點x。這可以通過最小化損失L = -log pd

keras簡單的編碼程式碼和各種型別編碼程式碼

start = time() from keras.models import Sequential from keras.layers import Dense, Dropout,Input fro

TensorFlow』讀書筆記_降編碼

沒有 tutorials oftp transfer 初始化 hot nis gauss ant 『TensorFlow』降噪自編碼器設計 之前學習過的代碼,又敲了一遍,新的收獲也還是有的,因為這次註釋寫的比較詳盡,所以再次記錄一下,具體的相關知識查閱之前寫的文章即可(見

基於tensorflow的棧式編碼實現

這周完全沒有想法要看棧式編碼器的,誰知誤入桃花源,就暫且把棧式自編碼器看了吧。由於手上有很多數值型的資料,僅僅是資料,沒有標籤,所以,迫切需要通過聚類抽出特徵。無意間看到別人家公司的推薦系統裡面用到sdae,於是,找了個ae程式,建了個sdae,跑一下自己的資料。希望sda

生成模型--降編碼(denoising autoencoder,DAE)

降噪自編碼器(denoising autoencoder,DAE)   這裡不是通過對損失函式施加懲罰項,而是通過改變損失函式的重構誤差項來學習一些有用資訊。   向輸入的訓練資料加入噪聲,並使自編碼器學會去除這種噪聲來獲得沒有被噪聲汙染過的真實輸入。因此,這就

DenoisingAutoencoder(影象自動編碼

本文主要介紹使用TensorFlow實現DenoisingAutoencoder(影象去噪自動編碼器)。 下面是示例程式碼: # 匯入相關模組 import numpy as np import sys import tensorflow as tf import matplotlib.

編碼

去噪自動編碼器 在訓練時採取部分損壞的輸入以恢復原始的未失真輸入。這種技術已被引入,具有良好的代表性的特定方法。[8]良好的表示是可以從損壞的輸入中穩健地獲得的表示,並且對於恢復相應的清潔輸入是有用的。該定義包含以下隱含假設: 較高級別的表示相對穩定且對輸入的

TensorFlow第十二步 編碼降維

# coding=utf-8 import os os.environ["TF_CPP_MIN_LOG_LEVEL"]='2' # 只顯示 warning 和 Error ###data (50000,784),(1000,784),(1000,784): impor

tensorflow學習筆記(三):實現編碼

sea start ear var logs cos soft 編碼 red 黃文堅的tensorflow實戰一書中的第四章,講述了tensorflow實現多層感知機。Hiton早年提出過自編碼器的非監督學習算法,書中的代碼給出了一個隱藏層的神經網絡,本人擴展到了多層,改進

tensorflow實現編碼

簡介 自編碼器是利用神經網路提取出影象中的高階特徵,同時可以利用高階特徵重構自己 如果向原圖中新增噪聲,則可以通過高階特徵的提取,對原始影象進行去噪 tensorflow實戰第四章內容 程式碼 import numpy as np import skl

編碼及其tensorflow實現

自編碼器理論 自編碼器(AutoEncoder)顧名思義,就是可以用自身的高階特徵編碼自己。自編碼器實際上也是一種神經網路,它的輸入和輸入的維度是一樣的。藉助稀疏編碼的思想,目標是使用稀疏的一些高階特徵重新組合來重構自己。早年在關於稀疏編碼(Sparse Coding)的研究中,通過對大

TensorFlow實現AutoEncoder編碼

一、概述 AutoEncoder大致是一個將資料的高維特徵進行壓縮降維編碼,再經過相反的解碼過程的一種學習方法。學習過程中通過解碼得到的最終結果與原資料進行比較,通過修正權重偏置引數降低損失函式,不斷提高對原資料的復原能力。學習完成後,前半段的編碼過程得到結果即可代表原

TensorFlow實戰】用Python實現編碼

程式碼: import numpy as np import sklearn.preprocessing as prep import tensorflow as tf from tensorflow.examples.tutorials.mnist impor

編碼(AutoEncoder)入門及TensorFlow實現

自編碼器(Autoencoder,AE),是一種利用反向傳播演算法使得輸出值等於輸入值的神經網路,它先將輸入壓縮成潛在空間表徵,然後通過這種表徵來重構輸出。自編碼器由兩部分組成:編碼器(encoder):這部分能將輸入壓縮成潛在空間表徵,可以用編碼函式h=f(x)表示。解碼器

TensorFlow』單隱藏層編碼設計

ase numpy loss 分享 examples sum write 對象 plt 計算圖設計 很簡單的實踐, 多了個隱藏層 沒有上節的高斯噪聲 網絡寫法由上節的面向對象改為了函數式編程, 其他沒有特別需要註意的,實現如下: import numpy as np

7 Recursive AutoEncoder結構遞迴編碼(tensorflow)不能呼叫GPU進行計算的問題(非機器配置,而是網路結構的問題)

一、原始碼下載 程式碼最初來源於Github:https://github.com/vijayvee/Recursive-neural-networks-TensorFlow,程式碼介紹如下:“This repository contains the implementation of a single h

VAE----變分編碼Keras實現

這篇部落格用來記錄我自己用keras實現(抄寫)VAE過程中,掉進的一個坑。。。。。。 最近這幾天在網上看了很多VAE的介紹,並且看了一下keras中的實現。自我感覺良好,就想按著官方的程式碼自己也去寫一遍。不寫不知道,一寫嚇一跳!!我跳進了一個很大坑中(笑哭),我在把程式碼寫完以後,開始訓