2016-05-06 12 views
0

私はtflearnを使って簡単なオートエンコーダーを書いています。オートエンコーダーをエンコーダーとデコーダーに分離する方法(TensorFlow + TFLearn)

net = tflearn.input_data (shape=[None, train.shape [1]]) 
net = tflearn.fully_connected (net, 500, activation = 'tanh', regularizer = None, name = 'fc_en_1') 

#hidden state 
net = tflearn.fully_connected (net, 100, activation = 'tanh', regularizer = 'L1', name = 'fc_en_2', weight_decay = 0.0001)  

net = tflearn.fully_connected (net, 500, activation = 'tanh', regularizer = None, name = 'fc_de_1')  
net = tflearn.fully_connected (net, train.shape [1], activation = 'linear', name = 'fc_de_2')  
net = tflearn.regression(net, optimizer='adam', learning_rate=0.01, loss='mean_square', metric='default') 

model = tflearn.DNN (net) 

モデルはよく訓練されていますが、訓練後に別途エンコーダとデコーダを使いたいと思います。

私はそれをどのように行うことができますか?今私は入力を復元することができ、入力を隠し表現に変換し、任意の隠れ表現から入力を復元できるようにしたい。

答えて

1

エンコーダとデコーダの入力/出力の名前を保存することができます。

すなわち(追加INPUT、HIDDEN_STATE、OUTPUT):その後、

net = tflearn.input_data (shape=[None, train.shape [1]]) 
INPUT = net 
net = tflearn.fully_connected (net, 500, activation = 'tanh', regularizer = None, name = 'fc_en_1') 

#hidden state 
net = tflearn.fully_connected (net, 100, activation = 'tanh', regularizer = 'L1', name = 'fc_en_2', weight_decay = 0.0001)  
HIDDEN_STATE = net 

net = tflearn.fully_connected (net, 500, activation = 'tanh', regularizer = None, name = 'fc_de_1')  
net = tflearn.fully_connected (net, train.shape [1], activation = 'linear', name = 'fc_de_2') 
OUTPUT = net  
net = tflearn.regression(net, optimizer='adam', learning_rate=0.01, loss='mean_square', metric='default') 

model = tflearn.DNN (net) 

そしてエンコードするために、このような機能を使用/デコード:あなたの答えを@に排出-クモ用

def encode (X):  
    if len (X.shape) < 2: 
     X = X.reshape (1, -1) 

    tflearn.is_training (False, model.session) 
    res = model.session.run (HIDDEN_STATE, feed_dict={INPUT.name:X})  
    return res  

def decode (X): 
    if len (X.shape) < 2: 
     X = X.reshape (1, -1) 

    #just to pass something to place_holder 
    zeros = np.zeros ((X.shape [0], train.shape [1])) 

    tflearn.is_training (False, model.session) 
    res = model.session.run (OUTPUT, feed_dict={INPUT.name:zeros, HIDDEN_STATE.name:X})  
    return res 
0

感謝。私はちょうど1,000のサイズの2,000のベクトルをコード化して/デコードし、上記のautoencoderを使って次元を縮小しました。しかし、デコーダの出力から実際の入力までのマッピングを見つけようとするたびに、1つのベクトルだけで、デコーダ出力の結果を実際の出力に正しくマッピングします。私はここでどのように精度を上げることができないのか分かりません。 ユークリッド距離を使用して、デコーダの出力に最も近いベクトルを見つけます。

+0

ネットワークのトレーニングは実際にはこの問題のポイントではありません。あなたの場合、私は、この自動エンコーダが大きすぎる、層の数を減らすか、またはより多くの正則化を追加しようとすると思います。さらにそれを訓練しようとする。 (より多くの時代) –

関連する問題