『TensorFlow』單&雙隱藏層自編碼器設計


計算圖設計

很簡單的實踐,

  • 多了個隱藏層
  • 沒有上節的高斯噪聲
  • 網絡寫法由上節的面向對象改為了函數式編程,

其他沒有特別需要注意的,實現如下:

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

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

learning_rate = 0.01                          # 學習率
training_epochs = 20                          # 訓練輪數,1輪等於n_samples/batch_size
batch_size = 128                              # batch容量
display_step = 1                              # 展示間隔
example_to_show = 10                          # 展示圖像數目

n_hidden_units = 256
n_input_units = 784
n_output_units = n_input_units

def WeightsVariable(n_in, n_out, name_str):
    return tf.Variable(tf.random_normal([n_in, n_out]), dtype=tf.float32, name=name_str)

def biasesVariable(n_out, name_str):
    return tf.Variable(tf.random_normal([n_out]), dtype=tf.float32, name=name_str)

def encoder(x_origin, activate_func=tf.nn.sigmoid):
    with tf.name_scope('Layer'):
        Weights = WeightsVariable(n_input_units, n_hidden_units, 'Weights')
        biases = biasesVariable(n_hidden_units, 'biases')
        x_code = activate_func(tf.add(tf.matmul(x_origin, Weights), biases))
    return x_code

def decode(x_code, activate_func=tf.nn.sigmoid):
    with tf.name_scope('Layer'):
        Weights = WeightsVariable(n_hidden_units, n_output_units, 'Weights')
        biases = biasesVariable(n_output_units, 'biases')
        x_decode = activate_func(tf.add(tf.matmul(x_code, Weights), biases))
    return x_decode

with tf.Graph().as_default():
    with tf.name_scope('Input'):
        X_input = tf.placeholder(tf.float32, [None, n_input_units])
    with tf.name_scope('Encode'):
        X_code = encoder(X_input)
    with tf.name_scope('decode'):
        X_decode = decode(X_code)
    with tf.name_scope('loss'):
        loss = tf.reduce_mean(tf.pow(X_input - X_decode, 2))
    with tf.name_scope('train'):
        Optimizer = tf.train.RMSPropOptimizer(learning_rate)
        train = Optimizer.minimize(loss)

    init = tf.global_variables_initializer()

    # 因為使用了tf.Graph.as_default()上下文環境
    # 所以下面的記錄必須放在上下文里面,否則記錄下來的圖是空的(get不到上面的default)
    writer = tf.summary.FileWriter(logdir='logs', graph=tf.get_default_graph())
    writer.flush()

 計算圖:

訓練程序

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

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

learning_rate = 0.01  # 學習率
training_epochs = 20  # 訓練輪數,1輪等於n_samples/batch_size
batch_size = 128  # batch容量
display_step = 1  # 展示間隔
example_to_show = 10  # 展示圖像數目

n_hidden_units = 256
n_input_units = 784
n_output_units = n_input_units


def WeightsVariable(n_in, n_out, name_str):
    return tf.Variable(tf.random_normal([n_in, n_out]), dtype=tf.float32, name=name_str)


def biasesVariable(n_out, name_str):
    return tf.Variable(tf.random_normal([n_out]), dtype=tf.float32, name=name_str)


def encoder(x_origin, activate_func=tf.nn.sigmoid):
    with tf.name_scope('Layer'):
        Weights = WeightsVariable(n_input_units, n_hidden_units, 'Weights')
        biases = biasesVariable(n_hidden_units, 'biases')
        x_code = activate_func(tf.add(tf.matmul(x_origin, Weights), biases))
    return x_code


def decode(x_code, activate_func=tf.nn.sigmoid):
    with tf.name_scope('Layer'):
        Weights = WeightsVariable(n_hidden_units, n_output_units, 'Weights')
        biases = biasesVariable(n_output_units, 'biases')
        x_decode = activate_func(tf.add(tf.matmul(x_code, Weights), biases))
    return x_decode


with tf.Graph().as_default():
    with tf.name_scope('Input'):
        X_input = tf.placeholder(tf.float32, [None, n_input_units])
    with tf.name_scope('Encode'):
        X_code = encoder(X_input)
    with tf.name_scope('decode'):
        X_decode = decode(X_code)
    with tf.name_scope('loss'):
        loss = tf.reduce_mean(tf.pow(X_input - X_decode, 2))
    with tf.name_scope('train'):
        Optimizer = tf.train.RMSPropOptimizer(learning_rate)
        train = Optimizer.minimize(loss)

    init = tf.global_variables_initializer()

    # 因為使用了tf.Graph.as_default()上下文環境
    # 所以下面的記錄必須放在上下文里面,否則記錄下來的圖是空的(get不到上面的default)
    writer = tf.summary.FileWriter(logdir='logs', graph=tf.get_default_graph())
    writer.flush()

    mnist = input_data.read_data_sets('../Mnist_data/', one_hot=True)

    with tf.Session() as sess:
        sess.run(init)
        total_batch = int(mnist.train.num_examples / batch_size)
        for epoch in range(training_epochs):
            for i in range(total_batch):
                batch_xs, batch_ys = mnist.train.next_batch(batch_size)
                _, Loss = sess.run([train, loss], feed_dict={X_input: batch_xs})
                Loss = sess.run(loss, feed_dict={X_input: batch_xs})
            if epoch % display_step == 0:
                print('Epoch: %04d' % (epoch + 1), 'loss= ', '{:.9f}'.format(Loss))
        writer.close()
        print('訓練完畢!')

        '''比較輸入和輸出的圖像'''
        # 輸出圖像獲取
        reconstructions = sess.run(X_decode, feed_dict={X_input: mnist.test.images[:example_to_show]})
        # 畫布建立
        f, a = plt.subplots(2, 10, figsize=(10, 2))
        for i in range(example_to_show):
            a[0][i].imshow(np.reshape(mnist.test.images[i], (28, 28)))
            a[1][i].imshow(np.reshape(reconstructions[i], (28, 28)))
        f.show()  # 渲染圖像
        plt.draw()  # 刷新圖像
        # plt.waitforbuttonpress()

 debug一上午的收獲:接受sess.run輸出的變量名不要和tensor節點的變量名重復,會出錯的... ...好低級的錯誤。mmdz

比較圖像一部分之前沒做過,介紹了matplotlib.pyplot的花式用法,

  原來plt.subplots()是會返回 畫布句柄 & 子圖集合 句柄的,子圖集合句柄可以像數組一樣調用子圖

   pyplot是有show()和draw()兩個方法的,show是展示出畫布,draw會刷新原圖,可以交互的修改畫布

   waitforbuttonpress()監聽鍵盤按鍵如果用戶按的是鍵盤,返回True,如果是其他(如鼠標單擊),則返回False

另,發現用surface寫程序其實還挺帶感... ...

輸出圖像如下:

                

雙隱藏層版本

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

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

batch_size = 128  # batch容量
display_step = 1  # 展示間隔
learning_rate = 0.01  # 學習率
training_epochs = 20  # 訓練輪數,1輪等於n_samples/batch_size
example_to_show = 10  # 展示圖像數目

n_hidden1_units = 256  # 第一隱藏層
n_hidden2_units = 128  # 第二隱藏層
n_input_units = 784
n_output_units = n_input_units


def WeightsVariable(n_in, n_out, name_str):
    return tf.Variable(tf.random_normal([n_in, n_out]), dtype=tf.float32, name=name_str)


def biasesVariable(n_out, name_str):
    return tf.Variable(tf.random_normal([n_out]), dtype=tf.float32, name=name_str)


def encoder(x_origin, activate_func=tf.nn.sigmoid):
    with tf.name_scope('Layer1'):
        Weights = WeightsVariable(n_input_units, n_hidden1_units, 'Weights')
        biases = biasesVariable(n_hidden1_units, 'biases')
        x_code1 = activate_func(tf.add(tf.matmul(x_origin, Weights), biases))
    with tf.name_scope('Layer2'):
        Weights = WeightsVariable(n_hidden1_units, n_hidden2_units, 'Weights')
        biases = biasesVariable(n_hidden2_units, 'biases')
        x_code2 = activate_func(tf.add(tf.matmul(x_code1, Weights), biases))
    return x_code2


def decode(x_code, activate_func=tf.nn.sigmoid):
    with tf.name_scope('Layer1'):
        Weights = WeightsVariable(n_hidden2_units, n_hidden1_units, 'Weights')
        biases = biasesVariable(n_hidden1_units, 'biases')
        x_decode1 = activate_func(tf.add(tf.matmul(x_code, Weights), biases))
    with tf.name_scope('Layer2'):
        Weights = WeightsVariable(n_hidden1_units, n_output_units, 'Weights')
        biases = biasesVariable(n_output_units, 'biases')
        x_decode2 = activate_func(tf.add(tf.matmul(x_decode1, Weights), biases))
    return x_decode2


with tf.Graph().as_default():
    with tf.name_scope('Input'):
        X_input = tf.placeholder(tf.float32, [None, n_input_units])
    with tf.name_scope('Encode'):
        X_code = encoder(X_input)
    with tf.name_scope('decode'):
        X_decode = decode(X_code)
    with tf.name_scope('loss'):
        loss = tf.reduce_mean(tf.pow(X_input - X_decode, 2))
    with tf.name_scope('train'):
        Optimizer = tf.train.RMSPropOptimizer(learning_rate)
        train = Optimizer.minimize(loss)

    init = tf.global_variables_initializer()

    # 因為使用了tf.Graph.as_default()上下文環境
    # 所以下面的記錄必須放在上下文里面,否則記錄下來的圖是空的(get不到上面的default)
    writer = tf.summary.FileWriter(logdir='logs', graph=tf.get_default_graph())
    writer.flush()

    mnist = input_data.read_data_sets('../Mnist_data/', one_hot=True)

    with tf.Session() as sess:
        sess.run(init)
        total_batch = int(mnist.train.num_examples / batch_size)
        for epoch in range(training_epochs):
            for i in range(total_batch):
                batch_xs, batch_ys = mnist.train.next_batch(batch_size)
                _, Loss = sess.run([train, loss], feed_dict={X_input: batch_xs})
                Loss = sess.run(loss, feed_dict={X_input: batch_xs})
            if epoch % display_step == 0:
                print('Epoch: %04d' % (epoch + 1), 'loss= ', '{:.9f}'.format(Loss))
        writer.close()
        print('訓練完畢!')

        '''比較輸入和輸出的圖像'''
        # 輸出圖像獲取
        reconstructions = sess.run(X_decode, feed_dict={X_input: mnist.test.images[:example_to_show]})
        # 畫布建立
        f, a = plt.subplots(2, 10, figsize=(10, 2))
        for i in range(example_to_show):
            a[0][i].imshow(np.reshape(mnist.test.images[i], (28, 28)))
            a[1][i].imshow(np.reshape(reconstructions[i], (28, 28)))
        f.show()  # 渲染圖像
        plt.draw()  # 刷新圖像
        # plt.waitforbuttonpress()

 輸出圖像如下:


由於壓縮到128個節點損失信息過多,所以結果不如之前單層的好。

有意思的是我們把256的那層改成128(也就是雙128)后,結果反而比上面的要好:

但是仍然比不上單隱藏層,數據比較簡單時候復雜網絡效果可能不那么好(loss值我沒有截取,但實際上是這樣,雖然不同網絡loss直接比較沒什么意義),當然,也有可能是復雜網絡沒收斂的結果。

可視化雙隱藏層自編碼器

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

batch_size = 128  # batch容量
display_step = 1  # 展示間隔
learning_rate = 0.01  # 學習率
training_epochs = 20  # 訓練輪數,1輪等於n_samples/batch_size
example_to_show = 10  # 展示圖像數目

n_hidden1_units = 256  # 第一隱藏層
n_hidden2_units = 128  # 第二隱藏層
n_input_units = 784
n_output_units = n_input_units

def variable_summaries(var): #<---
    """
    可視化變量全部相關參數
    :param var: 
    :return: 
    """
    with tf.name_scope('summaries'):
        mean = tf.reduce_mean(var)
        tf.summary.histogram('mean', mean)
        with tf.name_scope('stddev'):
            stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
            tf.summary.scalar('stddev', stddev)  # 注意,這是標量
            tf.summary.scalar('max', tf.reduce_max(var))
            tf.summary.scalar('min', tf.reduce_min(var))
            tf.summary.histogram('histogram', var)

def WeightsVariable(n_in,n_out,name_str):
    return tf.Variable(tf.random_normal([n_in,n_out]),dtype=tf.float32,name=name_str)


def biasesVariable(n_out,name_str):
    return tf.Variable(tf.random_normal([n_out]),dtype=tf.float32,name=name_str)


def encoder(x_origin,activate_func=tf.nn.sigmoid):
    with tf.name_scope('Layer1'):
        Weights = WeightsVariable(n_input_units,n_hidden1_units,'Weights')
        biases = biasesVariable(n_hidden1_units,'biases')
        x_code1 = activate_func(tf.add(tf.matmul(x_origin,Weights),biases))
        variable_summaries(Weights) #<---
        variable_summaries(biases) #<---
    with tf.name_scope('Layer2'):
        Weights = WeightsVariable(n_hidden1_units,n_hidden2_units,'Weights')
        biases = biasesVariable(n_hidden2_units,'biases')
        x_code2 = activate_func(tf.add(tf.matmul(x_code1,Weights),biases))
        variable_summaries(Weights) #<---
        variable_summaries(biases) #<---
    return x_code2


def decode(x_code,activate_func=tf.nn.sigmoid):
    with tf.name_scope('Layer1'):
        Weights = WeightsVariable(n_hidden2_units,n_hidden1_units,'Weights')
        biases = biasesVariable(n_hidden1_units,'biases')
        x_decode1 = activate_func(tf.add(tf.matmul(x_code,Weights),biases))
        variable_summaries(Weights) #<---
        variable_summaries(biases) #<---
    with tf.name_scope('Layer2'):
        Weights = WeightsVariable(n_hidden1_units,n_output_units,'Weights')
        biases = biasesVariable(n_output_units,'biases')
        x_decode2 = activate_func(tf.add(tf.matmul(x_decode1,Weights),biases))
        variable_summaries(Weights) #<---
        variable_summaries(biases) #<---
    return x_decode2


with tf.Graph().as_default():
    with tf.name_scope('Input'):
        X_input = tf.placeholder(tf.float32,[None,n_input_units])
    with tf.name_scope('Encode'):
        X_code = encoder(X_input)
    with tf.name_scope('decode'):
        X_decode = decode(X_code)
    with tf.name_scope('loss'):
        loss = tf.reduce_mean(tf.pow(X_input - X_decode,2))
    with tf.name_scope('train'):
        Optimizer = tf.train.RMSPropOptimizer(learning_rate)
        train = Optimizer.minimize(loss)

    # 標量匯總
    with tf.name_scope('LossSummary'):
        tf.summary.scalar('loss',loss)
        tf.summary.scalar('learning_rate',learning_rate)

    # 圖像展示
    with tf.name_scope('ImageSummary'):
        image_original = tf.reshape(X_input,[-1, 28, 28, 1])
        image_reconstruction = tf.reshape(X_decode, [-1, 28, 28, 1])
        tf.summary.image('image_original', image_original, 9)
        tf.summary.image('image_recinstruction', image_reconstruction, 9)

    # 匯總
    merged_summary = tf.summary.merge_all()

    init = tf.global_variables_initializer()

    writer = tf.summary.FileWriter(logdir='logs', graph=tf.get_default_graph())
    writer.flush()

    mnist = input_data.read_data_sets('../Mnist_data/', one_hot=True)

    with tf.Session() as sess:
        sess.run(init)
        total_batch = int(mnist.train.num_examples / batch_size)
        for epoch in range(training_epochs):
            for i in range(total_batch):
                batch_xs,batch_ys = mnist.train.next_batch(batch_size)
                _,Loss = sess.run([train,loss],feed_dict={X_input: batch_xs})
                Loss = sess.run(loss,feed_dict={X_input: batch_xs})
            if epoch % display_step == 0:
                print('Epoch: %04d' % (epoch + 1),'loss= ','{:.9f}'.format(Loss))
                summary_str = sess.run(merged_summary,feed_dict={X_input: batch_xs}) #<---
                writer.add_summary(summary_str,epoch) #<---
                writer.flush() #<---
        writer.close()
        print('訓練完畢!')

幾個有意思的發現,

  使用之前的圖像輸出方式時,win下matplotlib.pyplot的繪畫框會立即退出,所以要使用 plt.waitforbuttonpress() 命令。

  win下使用plt繪畫色彩和linux不一樣,效果如下:

 

  

輸出圖如下:

對比圖像如下(截自tensorboard):

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM