Пытаюсь реализовать 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})