автоэнкодер с тензорным потоком - PullRequest
0 голосов
/ 08 февраля 2019

Пытаюсь реализовать Stacked autoencoder с тензорным потоком.Я использовал набор данных mnist и попытался уменьшить размерность с 784 до 2. Я уже сделал это с помощью keras, и его результат был хорошим (ошибка поезда была почти 0,04).Тем не менее, с этим кодом tesorflow результат не очень хороший (ошибка поезда была почти 0,4).Я не знаю, почему эти результаты такие разные.Можете ли вы сказать мне, как мне его пересмотреть?

from keras.datasets import mnist
import tensorflow as tf


(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')

x_train = x_train.reshape(60000,28*28)
x_test = x_test.reshape(10000,28*28)

x_train  = x_train/255.0
x_test = x_test/255.0

x_ = tf.placeholder('float32', [None,784])



#encoder
w1 = tf.Variable(tf.random_normal([784,512]))
b1 = tf.Variable(tf.random_normal([512]))
h1 = tf.nn.relu(tf.matmul(x_, w1) + b1)

w2 = tf.Variable(tf.random_normal([512,128]))
b2 = tf.Variable(tf.random_normal([128]))
h2 = tf.nn.relu(tf.matmul(h1, w2) + b2)

w0 = tf.Variable(tf.random_normal([128,2]))
b0 = tf.Variable(tf.random_normal([2]))
h0 = tf.matmul(h2, w0) + b0



#decoder
w_1 = tf.Variable(tf.random_normal([2,128]))
b_1 = tf.Variable(tf.random_normal([128]))
h_1 = tf.nn.relu(tf.matmul(h0, w_1) + b_1)

w_2 = tf.Variable(tf.random_normal([128,512]))
b_2 = tf.Variable(tf.random_normal([512]))
h_2 = tf.nn.relu(tf.matmul(h_1, w_2) + b_2)

w_0 = tf.Variable(tf.random_normal([512,784]))
b_0 = tf.Variable(tf.random_normal([784]))
h_0 = tf.nn.sigmoid(tf.matmul(h_2, w_0) + b_0)


#cost
cost = tf.reduce_mean(tf.pow(x_-h_0,2))
train_step = tf.train.AdamOptimizer(0.05).minimize(cost)
init = tf.global_variables_initializer()


batch_count = int(x_train.shape[0]/256)

sess = tf.Session()
sess.run(init)
for i in range(2) :
    total_cost = 0
    for j in range(batch_count) :
        batch_xs= x_train[i*256:i*256 + 256,:]
        _, cost_val = sess.run([train_step, cost], feed_dict = {x_ : batch_xs})
        total_cost = total_cost + cost_val
        if j % 20 == 0 :
            print('epoch : %d ,%d / %d , loss : %f , average_loss : %f' %(i+1, j+1, batch_count, cost_val, total_cost/(j+1)))


hidden1, hidden2, encoder = sess.run([h1,h2,h0],feed_dict={x_ : x_test})

1 Ответ

0 голосов
/ 08 февраля 2019

Ваш последний шаг энкодера не имеет активации h0 = tf.matmul(h2, w0) + b0 и, таким образом, потери остаются на уровне 0,48, после применения там активации relu, то есть при замене

h0 = tf.matmul(h2, w0) + b0 на h0 = tf.nn.relu(tf.matmul(h2, w0) + b0) потеря снижается до 0,06.всего за две эпохи.

After adding activation in the last layer of the encoder

Я также изменил частоту отображения выходных данных, чтобы разместить больше данных на изображении.

Если у вас есть какие-либодальнейшие запросы, комментарий ниже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...