# 教程 | 如何使用TensorFlow和自编码器模型生成手写数字

```import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt
%matplotlib inlinefrom tensorflow.examples.tutorials.mnist import input_data

MNIST 图像的维度是 28*28 像素，只有单色通道。我们的输入数据 X_in 是一批一批的 MNIST 字符，网络会学习如何重建它们。然后在一个占位符 Y 中输出它们，输出和输入具有相同的维度。

Y_flat 将会在后面计算损失函数的时候用到，keep_prob 将会在应用 dropout 的时候用到（作为一种正则化的方法）。在训练的过程中，它的值会设为 0.8，当生成新数据的时候，我们不使用 dropout，所以它的值会变成 1。

lrelu 函数需要自及定义，因为 TensorFlow 中并没有预定义一个 Leaky ReLU 函数。

```tf.reset_default_graph()

batch_size = 64X_in = tf.placeholder(dtype=tf.float32, shape=[None, 28, 28], name='X')
Y    = tf.placeholder(dtype=tf.float32, shape=[None, 28, 28], name='Y')
Y_flat = tf.reshape(Y, shape=[-1, 28 * 28])
keep_prob = tf.placeholder(dtype=tf.float32, shape=(), name='keep_prob')

dec_in_channels = 1n_latent = 8reshaped_dim = [-1, 7, 7, dec_in_channels]
inputs_decoder = 49 * dec_in_channels / 2def lrelu(x, alpha=0.3):    return tf.maximum(x, tf.multiply(x, alpha))```

• 一个是均值向量
• 一个是标准差向量

```def encoder(X_in, keep_prob):
activation = lrelu    with tf.variable_scope("encoder", reuse=None):
X = tf.reshape(X_in, shape=[-1, 28, 28, 1])
x = tf.layers.conv2d(X, filters=64, kernel_size=4, strides=2, padding='same', activation=activation)
x = tf.nn.dropout(x, keep_prob)
x = tf.layers.conv2d(x, filters=64, kernel_size=4, strides=2, padding='same', activation=activation)
x = tf.nn.dropout(x, keep_prob)
x = tf.layers.conv2d(x, filters=64, kernel_size=4, strides=1, padding='same', activation=activation)
x = tf.nn.dropout(x, keep_prob)
x = tf.contrib.layers.flatten(x)
mn = tf.layers.dense(x, units=n_latent)
sd       = 0.5 * tf.layers.dense(x, units=n_latent)
epsilon = tf.random_normal(tf.stack([tf.shape(x)[0], n_latent]))
z  = mn + tf.multiply(epsilon, tf.exp(sd))
return z, mn, sd```

```def decoder(sampled_z, keep_prob):    with tf.variable_scope("decoder", reuse=None):
x = tf.layers.dense(sampled_z, units=inputs_decoder, activation=lrelu)
x = tf.layers.dense(x, units=inputs_decoder * 2 + 1, activation=lrelu)
x = tf.reshape(x, reshaped_dim)
x = tf.layers.conv2d_transpose(x, filters=64, kernel_size=4, strides=2, padding='same', activation=tf.nn.relu)
x = tf.nn.dropout(x, keep_prob)
x = tf.layers.conv2d_transpose(x, filters=64, kernel_size=4, strides=1, padding='same', activation=tf.nn.relu)
x = tf.nn.dropout(x, keep_prob)
x = tf.layers.conv2d_transpose(x, filters=64, kernel_size=4, strides=1, padding='same', activation=tf.nn.relu)

x = tf.contrib.layers.flatten(x)
x = tf.layers.dense(x, units=28*28, activation=tf.nn.sigmoid)
img = tf.reshape(x, shape=[-1, 28, 28])        return img```

```sampled, mn, sd = encoder(X_in, keep_prob)
dec = decoder(sampled, keep_prob)```

```unreshaped = tf.reshape(dec, [-1, 28*28])
img_loss = tf.reduce_sum(tf.squared_difference(unreshaped, Y_flat), 1)
latent_loss = -0.5 * tf.reduce_sum(1.0 + 2.0 * sd - tf.square(mn) - tf.exp(2.0 * sd), 1)
loss = tf.reduce_mean(img_loss + latent_loss)
sess = tf.Session()
sess.run(tf.global_variables_initializer())```

```for i in range(30000):
batch = [np.reshape(b, [28, 28]) for b in mnist.train.next_batch(batch_size=batch_size)[0]]
sess.run(optimizer, feed_dict = {X_in: batch, Y: batch, keep_prob: 0.8})
if not i % 200:
ls, d, i_ls, d_ls, mu, sigm = sess.run([loss, dec, img_loss, dst_loss, mn, sd], feed_dict = {X_in: batch, Y: batch, keep_prob: 1.0})
plt.imshow(np.reshape(batch[0], [28, 28]), cmap='gray')
plt.show()
plt.imshow(d[0], cmap='gray')
plt.show()
print(i, ls, np.mean(i_ls), np.mean(d_ls))```

```randoms = [np.random.normal(0, 1, n_latent) for _ in range(10)]
imgs = sess.run(dec, feed_dict = {sampled: randoms, keep_prob: 1.0})
imgs = [np.reshape(imgs[i], [28, 28]) for i in range(len(imgs))]for img in imgs:
plt.figure(figsize=(1,1))
plt.axis('off')
plt.imshow(img, cmap='gray')```

0 条评论

• ### 深度学习入门实战

导语：在本文的开始前，强烈推荐两个深度学习相关的视频集 1.台湾李宏毅教授的ML 2016，清晰明了，很多晦涩的原理能让你看了也能明白：https://www....

• ### 用TensorFlow和TensorBoard从零开始构建ConvNet（CNN）

摘要： Tensorflow作为当下最流行的深度学习框架，实现ConvNet（CNN）自然是轻而易举，但是本文创造性的使用的TensorBoard来图形化展示...

• ### 教你用TensorFlow和自编码器模型生成手写数字（附代码）

来源：机器之心 本文长度为1876字，建议阅读4分钟 本文介绍了如何使用 TensorFlow 实现变分自编码器（VAE）模型，并通过简单的手写数字生成案例一步...

• ### TensorFlow从0到1 - 16 - L2正则化对抗“过拟合”

前面的14 交叉熵损失函数——防止学习缓慢和15 重新思考神经网络初始化从学习缓慢问题入手，尝试改进神经网络的学习。本篇讨论过拟合问题，并引入与之相对的L2正...

• ### TensorFlow从0到1丨第十六篇 L2正则化对抗“过拟合”

前面的第十四篇 交叉熵损失函数——防止学习缓慢和第十五篇 重新思考神经网络初始化从学习缓慢问题入手，尝试改进神经网络的学习。本篇讨论过拟合问题，并引入与之相对的...

• ### 人工智能|TensorFlow前向传播实例

举一个mnist手写数据集的识别的例子，这个数据集在机器学习中是非常经典的数据集，由60k个训练样本和10k个测试样本组成，每个样本都是一张28*28像素的灰度...

• ### tensorflow的GPU加速计算

tensorflow程序可以通过tf.device函数来指定运行每一个操作的设备，这个设备可以是本地的CPU或者GPU，也可以是某一台远程的服务器。tensor...

• ### tensorflow编程: Constants, Sequences, and Random Values

注意： start 和 stop 参数都必须是 浮点型；     取值范围也包括了 stop； tf.lin_space 等同于 tf.lins...