2017-04-13 4 views
1

以下のようにTensorflowで以下のオートエンコーダーを実装しました。基本的には、入力としてMNISTの数字を取り、データの構造を学習し、その出力で入力を再現します。Tensorflow Autoencoder - 再構成エラーを計算するには?

from __future__ import division, print_function, absolute_import 

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

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

# Parameters 
learning_rate = 0.01 
training_epochs = 20 
batch_size = 256 
display_step = 1 
examples_to_show = 10 

# Network Parameters 
n_hidden_1 = 256 # 1st layer num features 
n_hidden_2 = 128 # 2nd layer num features 
n_input = 784 # MNIST data input (img shape: 28*28) 

# tf Graph input (only pictures) 
X = tf.placeholder("float", [None, n_input]) 

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])), 
} 
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])), 
} 


# Building the encoder 
def encoder(x): 
    # Encoder Hidden layer with sigmoid activation #1 
    layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']), 
            biases['encoder_b1'])) 
    # Decoder Hidden layer with sigmoid activation #2 
    layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['encoder_h2']), 
            biases['encoder_b2'])) 
    return layer_2 


# Building the decoder 
def decoder(x): 
    # Encoder Hidden layer with sigmoid activation #1 
    layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']), 
            biases['decoder_b1'])) 
    # Decoder Hidden layer with sigmoid activation #2 
    layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['decoder_h2']), 
            biases['decoder_b2'])) 
    return layer_2 

# Construct model 
encoder_op = encoder(X) 
decoder_op = decoder(encoder_op) 

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

# Define loss and optimizer, minimize the squared error 
cost = tf.reduce_mean(tf.pow(y_true - y_pred, 2)) 
optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost) 

# Initializing the variables 
init = tf.global_variables_initializer() 

# Launch the graph 
with tf.Session() as sess: 
    sess.run(init) 
    total_batch = int(mnist.train.num_examples/batch_size) 
    # Training cycle 
    for epoch in range(training_epochs): 
     # Loop over all batches 
     for i in range(total_batch): 
      batch_xs, batch_ys = mnist.train.next_batch(batch_size) 
      # Run optimization op (backprop) and cost op (to get loss value) 
      _, c = sess.run([optimizer, cost], feed_dict={X: batch_xs}) 
     # Display logs per epoch step 
     if epoch % display_step == 0: 
      print("Epoch:", '%04d' % (epoch+1), 
        "cost=", "{:.9f}".format(c)) 

    print("Optimization Finished!") 

    # Applying encode and decode over test set 
    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() 

私は各試料について再構成誤差(すなわち、平均二乗誤差/損失)を計算しますどのように、テスト・セットの上にエンコードとデコードのですか?

つまり、オートエンコーダが入力を再構築して、オートエンコーダを単一クラスの分類子として使用できることを確認したいと思います。

事前に感謝します。

バリー

答えて

2

あなたは、デコーダの出力を取り、真の画像との違いを取得し、平均値を取ることができます。これはあなたの復興費用になります

tf.square(y-x) 

は、yはデコーダの出力及びxは、あなたが例のそれぞれのような何かを行うと、それ以上の平均値を取ることができますされ、元のテスト画像であると言いますテストセット用。

関連する問題