TensorFlow实现
您可以像常规深度 MLP 一样实现栈式自编码器。 特别是,我们在第 11 章中用于训练深度网络的技术也可以应用。例如,下面的代码使用 He 初始化,ELU 激活函数和 l2 正则化为 MNIST 构建一个栈式自编码器。 代码应该看起来很熟悉,除了没有标签(没有y):
n_inputs = 28 * 28 # for MNISTn_hidden1 = 300n_hidden2 = 150 # codingsn_hidden3 = n_hidden1n_outputs = n_inputslearning_rate = 0.01l2_reg = 0.001X = tf.placeholder(tf.float32, shape=[None, n_inputs])with tf.contrib.framework.arg_scope([fully_connected],activation_fn=tf.nn.elu,weights_initializer=tf.contrib.layers.variance_scaling_initializer(),weights_regularizer=tf.contrib.layers.l2_regularizer(l2_reg)):hidden1 = fully_connected(X, n_hidden1)hidden2 = fully_connected(hidden1, n_hidden2) # codingshidden3 = fully_connected(hidden2, n_hidden3)outputs = fully_connected(hidden3, n_outputs, activation_fn=None)reconstruction_loss = tf.reduce_mean(tf.square(outputs - X)) # MSEreg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)loss = tf.add_n([reconstruction_loss] + reg_losses)optimizer = tf.train.AdamOptimizer(learning_rate)training_op = optimizer.minimize(loss)init = tf.global_variables_initializer()
然后可以正常训练模型。 请注意,数字标签(y_batch)未使用:
n_epochs = 5batch_size = 150with tf.Session() as sess:init.run()for epoch in range(n_epochs):n_batches = mnist.train.num_examples // batch_sizefor iteration in range(n_batches):X_batch, y_batch = mnist.train.next_batch(batch_size)sess.run(training_op, feed_dict={X: X_batch})
