0

我一直在使用 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)

模型训练得很好,但训练后我想分别使用编码器和解码器。

我该怎么做?现在我可以恢复输入,我希望能够将输入转换为隐藏表示并从任意隐藏表示恢复输入。

4

2 回答 2

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
于 2016-05-06T21:02:19.430 回答
0

感谢您的回答@discharged-spider。我刚刚编码/解码了 2,000 个大小为 1,000 的向量,并使用上面提到的自动编码器减小了它们的维度。但是,每当我尝试找到从解码器的输出到实际输入的映射时,只有在 1 个向量上它才能成功地将解码器输出的结果映射到实际输出。我不确定如何在这里提高准确性。我使用欧几里得距离来找到最接近解码器输出的向量。

于 2016-08-04T20:59:59.067 回答