实现自动编码器的编码器如下:
# 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]
可能不会改变太大,因为它的梯度恰好很小,学习率也很小。