学习笔记:自编码神经网络 TensorFlow(代码)

来源:互联网 发布:java 替换特殊字符 编辑:程序博客网 时间:2024/06/06 19:44

  • 自编码网络的作用是,将输入样本压缩到隐藏层(隐藏层神经元个数小于输入层),再在输出端重建样本。也就是说,自编码网络输出层与输入层存在如下关系:

  • 注意:由于神经元的输出只在0和1之间,因此输入需要进行均值归一化

自编码网络可以看做将数据进行压缩(由原来的“n-维”压缩成“m维”(m=隐藏层神经元数目)),然后再在需要的时候用损失尽量小的方式将数据恢复出来。

这里有两层意思:

第一,自编码网络是要将经过压缩的数据还原

第二,还原数据应该使得损失尽量小

from __future__ import division, print_function, absolute_importimport tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt# 下载并导入MNIST数据集from tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets("MNIST_data", one_hot=True)# 参数learning_rate = 0.01#学习率training_epochs = 20#训练的周期batch_size = 256#每一批次训练的大小display_step = 1examples_to_show = 10# 神经网络的参数n_hidden_1 = 256 # 隐层1的神经元个数n_hidden_2 = 128 # 隐层2神经元个数n_input = 784 # MNIST数据集的输出(img shape: 28*28)# tf Graph input (only pictures)X = tf.placeholder("float", [None, n_input])weights = {    'encoder_h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),    'encoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),    'decoder_h1': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_1])),    'decoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_input])),}biases = {    'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),    'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),    'decoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),    'decoder_b2': tf.Variable(tf.random_normal([n_input])),}# Building the encoderdef encoder(x):    # Encoder Hidden layer with sigmoid activation #1    layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']),                                   biases['encoder_b1']))    # Encoder Hidden layer with sigmoid activation #2    layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['encoder_h2']),                                   biases['encoder_b2']))    return layer_2# Building the decoderdef decoder(x):    # Decoder Hidden layer with sigmoid activation #1    layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']),                                   biases['decoder_b1']))    # Decoder Hidden layer with sigmoid activation #2    layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['decoder_h2']),                                   biases['decoder_b2']))    return layer_2# Construct modelencoder_op = encoder(X)decoder_op = decoder(encoder_op)# Predictiony_pred = decoder_op# Targets (Labels) are the input data.y_true = X# Define loss and optimizer, minimize the squared errorcost = tf.reduce_mean(tf.pow(y_true - y_pred, 2))optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost)# Initializing the variablesinit = tf.global_variables_initializer()sess = tf.InteractiveSession()sess.run(init)total_batch = int(mnist.train.num_examples/batch_size)# Training cyclefor epoch in range(training_epochs):    # Loop over all batches    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)        _, c = sess.run([optimizer, cost], feed_dict={X: batch_xs})    # Display logs per epoch step    if epoch % display_step == 0:        print("Epoch:", '%04d' % (epoch+1),              "cost=", "{:.9f}".format(c))print("Optimization Finished!")# Applying encode and decode over test setencode_decode = sess.run(    y_pred, feed_dict={X: mnist.test.images[:examples_to_show]})# Compare original images with their reconstructionsf, a = plt.subplots(2, 10, figsize=(10, 2))for i in range(examples_to_show):    a[0][i].imshow(np.reshape(mnist.test.images[i], (28, 28)))    a[1][i].imshow(np.reshape(encode_decode[i], (28, 28)))f.show()plt.draw()


2 0
原创粉丝点击