コード学AI-AutoEncoder

4821 ワード

本編では主に自作コードという乱暴で有効な手段を紹介する.
セルフコーディングは興味深い考え方であり,理解されやすく受け入れられ,従来の特徴抽出過程に代わっている(深さ学習も実際にはこの過程に代わっているが,両者の方法は異なる)
1.自己符号化は、まずソースデータを符号化する、すなわちメタデータを階層的に抽象化する方式を採用する
2.その後抽象的なデータを再利用してデータの復元を行い、その後、復元後のデータとソースデータとの差異を比較する(還元誤差を計算する、または一般的な呼び方は損失値)
3.還元後の損失ができるだけ小さくなるように損失値を最適化する.実際には,元のデータをできるだけ模倣し,損失した情報をできるだけ少なくすることを示すもう一つの近似過程と理解できる.
この3つのステップは、所望の最適化値または反復回数の上限に達するまで循環反復する.コード注記を開始します.
関連する関数とデータセットのインポート
# -*- coding: utf-8 -*-

""" 
 

 MNIST 

 :http://yann.lecun.com/exdb/mnist/

 :https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/autoencoder.py

"""
from __future__ import division, print_function, absolute_import

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

#  
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)


パラメータの設定
#  
#   
learning_rate = 0.01
# 
training_epochs = 5
# 
batch_size = 256
# 
display_step = 1
examples_to_show = 10

#  
# 256 
n_hidden_1 = 256 
# 128 
n_hidden_2 = 128 
# 28*28
n_input = 784 
# tf Graph input (only pictures)
# shape[256,784]
X = tf.placeholder("float", [None, n_input])

#  
# encoder_h1=[784,256]
# encoder_h2=[256,128]
# decoder_h1=[128,256]
# decoder_h2=[256,784]


符号化(encoderとdecoderの2つのプロセス)を含む重みと偏差のパラメータ
weights = {
    'encoder_h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
    'encoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
    'decoder_h1': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_1])),
    'decoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_input])),
}
#biase 
#encoder_b1=[256]
#encoder_b2=[128]
#decoder_b1=[256]
#decoder_b2=[784]
biases = {
    'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),
    'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),
    'decoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),
    'decoder_b2': tf.Variable(tf.random_normal([n_input])),
}


encoderレイヤの定義
#  Encoder 
def encoder(x):
    #  sigmoid   WX+b Sigmoid 
    #x->[256,784],w->[784,256]
    #layer_1->[256,256]
    layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']),
                                   biases['encoder_b1']))
    #  Sigmoid , WX1+b Sigmoid , X1 layer_1
    #layer_1->[256,256],w->[256,128]
    #layer_2->[256,128]
    layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['encoder_h2']),
                                   biases['encoder_b2']))
    return layer_2

decoderレイヤの定義

#  decoder 
def decoder(x):
    #  , 
    # x=layer_2->[256,128],w->[128,256]
    #  layer_1->[256,256]
    layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']),
                                   biases['decoder_b1']))
    #  
    # w->[256,784]
    #  layer_2->[256,784]  
    layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['decoder_h2']),
                                   biases['decoder_b2']))
    return layer_2

モデルの構築、最適化方法の定義、損失関数など
#  
# 
encoder_op = encoder(X)
# 
decoder_op = decoder(encoder_op)

#  , 
y_pred = decoder_op
# Targets (Labels) are the input data.
y_true = X

#  , 
cost = tf.reduce_mean(tf.pow(y_true - y_pred, 2))
#  RMS 
optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost)


計算図の構築
#  
init = tf.global_variables_initializer()

#  Graph
with tf.Session() as sess:
    sess.run(init)
    # 
    total_batch = int(mnist.train.num_examples/batch_size)
    #  20 
    for epoch in range(training_epochs):
        #  
        for i in range(total_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            #  
            _, c = sess.run([optimizer, cost], feed_dict={X: batch_xs})
        #  if , display_step 1 , 
        if epoch % display_step == 0:
            print(" :", '%04d' % (epoch+1),
                  " =", "{:.9f}".format(c))

    print(" ")


テスト効果
    #  
    encode_decode = sess.run(
        y_pred, feed_dict={X: mnist.test.images[:examples_to_show]})
    #  Compare original images with their reconstructions
    f, a = plt.subplots(2, 10, figsize=(10, 2))
    for i in range(examples_to_show):
        a[0][i].imshow(np.reshape(mnist.test.images[i], (28, 28)))
        a[1][i].imshow(np.reshape(encode_decode[i], (28, 28)))
    f.show()
    plt.draw()
    plt.waitforbuttonpress()


今日はここまで書いておきますが、まだ続きません.