使用TensorFlow训练自动编码器时,编码器的重量不会改变



实现自动编码器的编码器如下:

# One Layer Autoencoder
# Parameters
learning_rate = 0.01
training_epochs = 20
batch_size = 256
display_step = 1
examples_to_show = 10
# Network Parameters
n_hidden= 128 # 1st layer num features
n_input = 784 # MNIST data input (img shape: 28*28)
# tf Graph input (only pictures)
X = tf.placeholder("float", [None, n_input])
weights = {
    'encoder_h': tf.Variable(tf.random_normal([n_input, n_hidden])),
    'decoder_h': tf.Variable(tf.random_normal([n_hidden, n_input])),
}
biases = {
    'encoder_b': tf.Variable(tf.random_normal([n_hidden])),
    'decoder_b': tf.Variable(tf.random_normal([n_input])),
}
# Building the encoder
hidden_layer =             tf.nn.sigmoid(tf.add(tf.matmul(X,weights["encoder_h"]),biases["encoder_b"]))
out_layer = tf.nn.sigmoid(tf.add(tf.matmul(hidden_layer,weights["decoder_h"]),biases["decoder_b"]))

# Prediction
y_pred = out_layer
# Targets (Labels) are the input data.
y_true = X
# Define loss and optimizer, minimize the squared error
cost = tf.reduce_mean(tf.pow(y_true - y_pred, 2))
optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost)
# initializing the variables
init = tf.initialize_all_variables()
with tf.device("/gpu:0"):
    with tf.Session(config=config) as sess:
        sess.run(init)
        total_batch = int(mnist.train.num_examples/batch_size)
        print([total_batch,batch_size,mnist.train.num_examples])
        for epoch in range(training_epochs):#each round
            for i in range(total_batch):
                batch_xs, batch_ys = mnist.train.next_batch(batch_size)
                # Run optimization op (backprop) and cost op (to get loss value)
                _, loss_c = sess.run([optimizer, cost], feed_dict={X: batch_xs})
            if epoch % display_step == 0:
                encoder_w = weights["encoder_h"]
                encoder_w_eval = encoder_w.eval()
                print(encoder_w_eval[0,0])
                decoder_w = weights["decoder_h"]
                decoder_w_eval = decoder_w.eval()
                print(decoder_w_eval[0,0])
                print("Epoch:","%04d"%(epoch+1),
                 "cost=","{:.9f}".format(loss_c))
        print("Optimization Finished!")

当我打印编码器时,解码器重量和损失。解码器和减肥重量在训练时会发生变化,但编码器的重量与如下所示相同,我不知道为什么。有人帮忙。

encoder_w -0.00818192
decoder_w -1.48731
Epoch: 0001 cost= 0.132702485
encoder_w -0.00818192
decoder_w -1.4931
Epoch: 0002 cost= 0.089116640
encoder_w -0.00818192
decoder_w -1.49607
Epoch: 0003 cost= 0.080637991
encoder_w -0.00818192
decoder_w -1.49947
Epoch: 0004 cost= 0.073829792
encoder_w -0.00818192
decoder_w -1.50176
...

权重总是以这种方式行为。也就是说,他们总是具有高斯分布。请注意,您的输入可以遵循高维度的任何分布。另外,似乎如果您不同类型的分布,您最终会具有高斯分布(这是概率理论)。结果,权重的分布将以某种方式概括,并将在高斯分布之后继续。还要注意,使用Batch Normalization,目的是强迫activation functions的输出遵循高斯分布。这是一般直觉。

此外,l2_regulization在某种程度上迫使权重遵循Gaussian Distribution

最后,当您做的时候打印weights是错误的。相反,您应该使用Tensorboard

希望这个答案会有所帮助。

一般而言,我建议在张量板上检查图表,以确保它看起来像您期望的(例如,Encoder witters有梯度更新。

在您的情况下,encoder_w[0, 0]可能不会改变太大,因为它的梯度恰好很小,学习率也很小。

相关内容

  • 没有找到相关文章

最新更新