2017-10-21 20 views
2

TensorFlowで実装された自動エンコーダーによって実行される次元削減を視覚化するためにAymeric Damien's codeを適応しようとしています。私が見たすべての例はmnistディジットのデータセットで処理されていましたが、このメソッドを使用して、2次元のアイリスデータセットをおもちゃの例として視覚化して、実際のデータセットを調整する方法を見つけ出すことができました。オートエンコーダを使用して次元削減を視覚化する方法は? (Python | TensorFlow)

私の質問はどのようにしてサンプル固有の2次元埋め込みを視覚化することができますか?

たとえば、虹彩データセットは、150 samples4 attributesです。合計8 attributesを得るために4 noise attributesを追加しました。エンコード/デコードは次のようになります。[8, 4, 2, 4, 8]しかし、埋め込みを視覚化するために、形状の配列をどのように抽出するのかは分かりません。(150, 2)TensorFlowを使用して次元削減を視覚化する方法に関するチュートリアルは見つかりませんでした。

from sklearn.datasets import load_iris 
from sklearn.decomposition import PCA 
import numpy as np 
import tensorflow as tf 
import matplotlib.pyplot as plt 
%matplotlib inline 

# Set random seeds 
np.random.seed(0) 
tf.set_random_seed(0) 

# Load data 
iris = load_iris() 
# Original Iris : (150,4) 
X_iris = iris.data 
# Iris with noise : (150,8) 
X_iris_with_noise = np.concatenate([X_iris, np.random.random(size=X_iris.shape)], axis=1).astype(np.float32) 
y_iris = iris.target 

# PCA 
pca_xy = PCA(n_components=2).fit_transform(X_iris_with_noise) 
with plt.style.context("seaborn-white"): 
    fig, ax = plt.subplots() 
    ax.scatter(pca_xy[:,0], pca_xy[:,1], c=y_iris, cmap=plt.cm.Set2) 
    ax.set_title("PCA | Iris with noise") 

enter image description here

# Training Parameters 
learning_rate = 0.01 
num_steps = 1000 
batch_size = 10 

display_step = 250 
examples_to_show = 10 

# Network Parameters 
num_hidden_1 = 4 # 1st layer num features 
num_hidden_2 = 2 # 2nd layer num features (the latent dim) 
num_input = 8 # Iris data input 

# tf Graph input 
X = tf.placeholder(tf.float32, [None, num_input], name="input") 

weights = { 
    'encoder_h1': tf.Variable(tf.random_normal([num_input, num_hidden_1]), dtype=tf.float32, name="encoder_h1"), 
    'encoder_h2': tf.Variable(tf.random_normal([num_hidden_1, num_hidden_2]), dtype=tf.float32, name="encoder_h2"), 
    'decoder_h1': tf.Variable(tf.random_normal([num_hidden_2, num_hidden_1]), dtype=tf.float32, name="decoder_h1"), 
    'decoder_h2': tf.Variable(tf.random_normal([num_hidden_1, num_input]), dtype=tf.float32, name="decoder_h2"), 
} 
biases = { 
    'encoder_b1': tf.Variable(tf.random_normal([num_hidden_1]), dtype=tf.float32, name="encoder_b1"), 
    'encoder_b2': tf.Variable(tf.random_normal([num_hidden_2]), dtype=tf.float32, name="encoder_b2"), 
    'decoder_b1': tf.Variable(tf.random_normal([num_hidden_1]), dtype=tf.float32, name="decoder_b1"), 
    'decoder_b2': tf.Variable(tf.random_normal([num_input]), dtype=tf.float32, name="decoder_b2"), 
} 

# 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'])) 
    # Encoder 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): 
    # Decoder 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 
loss = tf.reduce_mean(tf.pow(y_true - y_pred, 2)) 
optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(loss) 

# Initialize the variables (i.e. assign their default value) 
init = tf.global_variables_initializer() 

# Start Training 
# Start a new TF session 
with tf.Session() as sess: 

    # Run the initializer 
    sess.run(init) 

    # Training 
    for i in range(1, num_steps+1): 
     # Prepare Data 
     # Get the next batch of Iris data 
     idx_train = np.random.RandomState(i).choice(np.arange(X_iris_with_noise.shape[0]), size=batch_size) 
     batch_x = X_iris_with_noise[idx_train,:] 
     # Run optimization op (backprop) and cost op (to get loss value) 
     _, l = sess.run([optimizer, loss], feed_dict={X: batch_x}) 
     # Display logs per step 
     if i % display_step == 0 or i == 1: 
      print('Step %i: Minibatch Loss: %f' % (i, l)) 
+0

私はあなたではなく、T-SNEをしたいかもしれないと思う:組み込み環境の可視化を使用してTensorBoardでも、よりよい解決策(https://www.tensorflow.org/programmers_guide/embedding)があり

_, l, embedding = sess.run([optimizer, loss, h], feed_dict={X: batch_x}) 

:その後、各バッチのためにあなたは、次のように値を得ることができますオートエンコーダより –

+0

私はSciKit Learnでt-SNEを使用していますが、テンソルフローでコードを作成する方法はわかりません.2d埋め込みの生成方法を見たいと思っていました。私は数時間で私のコンピュータに着くと、下のコードを試してみるつもりです。 tfでt-sneのチュートリアルを知っていますか? –

+1

はい、@maestrojeongを参照してくださいGitHub repo [here](https://github.com/maestrojeong/t-SNE) –

答えて

0

あなたの埋め込みがh = encoder(X)でアクセス可能です。

from tensorflow.contrib.tensorboard.plugins import projector 
config = projector.ProjectorConfig() 

embedding = config.embeddings.add() 
embedding.tensor_name = h.name 

# Use the same LOG_DIR where you stored your checkpoint. 
summary_writer = tf.summary.FileWriter(LOG_DIR) 

projector.visualize_embeddings(summary_writer, config) 
+0

ありがとう!その埋め込みをすぐに引き出すことは理にかなっています。ハハ、間違いなくいくつかのことを調整する必要があるでしょう。(自動エンコーダープロット)(https://i.imgur.com/FdlUF1M.png) –

関連する問題