2017-04-07 87 views
0

python 3.5.2,tensorflow 1.0.0Autoencoder在訓練時未學習

在自動編碼器編程方面有點新穎。我正試圖實現一個簡單的網絡,以從here熟悉。我使用了相同的輸入數據,其中CNN能夠以98%的準確度完美分類。我的數據有2000行數據,每行都是一個信號。我正在嘗試使用3個堆疊的512個自動編碼器和256個節點。

class dimensions: 
input_width, input_height = 1,1024 
BATCH_SIZE = 50 
layer = [input_width*input_height, 512, 256, 64] 
learningrate = 0.001 

def myencoder(x,corrupt_prob,dimensions): 
current_input = corrupt(x) * corrupt_prob + x * (1 - corrupt_prob) 
encoder = [] 
for layer_i, n_output in enumerate(dimensions.layer[1:]): 
    n_input = int(current_input.get_shape()[1]) 
    W = tf.Variable(
     tf.random_uniform([n_input, n_output], 
          -1.0/math.sqrt(n_input), 
          1.0/math.sqrt(n_input))) 
    b = tf.Variable(tf.zeros([n_output])) 
    encoder.append(W) 
    output = tf.nn.tanh(tf.matmul(current_input, W) + b) 

    current_input = output 

z = current_input 
encoder.reverse() 
# Build the decoder using the same weights 
for layer_i, n_output in enumerate(model.layer[:-1][::-1]): 
    W = tf.transpose(encoder[layer_i]) 
    b = tf.Variable(tf.zeros([n_output])) 
    output = tf.nn.tanh(tf.matmul(current_input, W) + b) 

    current_input = output 
# now have the reconstruction through the network 
y = current_input 
# cost function measures pixel-wise difference 
cost = tf.sqrt(tf.reduce_mean(tf.square(y - x))) 

return z,y,cost 

sess = tf.Session() 
model = dimensions() 
data_train,data_test,label_train,label_test = load_data(Datainfo,folder) 

x = tf.placeholder(tf.float32,[model.BATCH_SIZE,model.input_height*model.input_width]) 
corrupt_prob = tf.placeholder(tf.float32,[1]) 
z,y,cost = myencoder(x,corrupt_prob,dimensions) 
train_step = tf.train.AdamOptimizer(model.learningrate).minimize(cost) 
lossfun = np.zeros(STEPS) 
sess.run(tf.global_variables_initializer()) 

for i in range(STEPS): 
    train_data = batchdata(data_train, model.BATCH_SIZE) 
    epoch_loss = 0 
    for j in range(model.BATCH_SIZE): 
     sess.run(train_step,feed_dict={x:train_data,corrupt_prob:[1.0]}) 
     c = sess.run(cost, feed_dict={x: train_data, corrupt_prob: [1.0]}) 
     epoch_loss += c 
    lossfun[i] = epoch_loss 
    print('Epoch', i, 'completed out of', STEPS, 'loss:', epoch_loss) 

我的損失函數出現這樣enter image description here x軸 - 沒有重複的,Y軸 - 損失

損失不會降低,網絡沒有學到什麼東西。 任何幫助表示讚賞!

回答

0

在函數myencoder中,權重變量W和b在每個訓練步驟中被初始化。

+0

我會檢查並更新結果 – Raady