如今,我们将两部分连在一路。
- sampled, mn, sd = encoder(X_in, keep_prob)
- dec = decoder(sampled, keep_prob)
为了计算图像重构的损掉函数,我们简单地应用了平方差(这有时刻会使图像变得有些模糊)。这个损掉函数还结合了 KL 散度,这确保了我们的隐蔽值将会年腋荷琐标准分布中采样。关于这个主题,如不雅想要懂得更多,可以看一下这篇文┞仿(https://jaan.io/what-is-variational-autoencoder-vae-tutorial/)。
- 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)
- optimizer = tf.train.AdamOptimizer(0.0005).minimize(loss)
- sess = tf.Session()
- sess.run(tf.global_variables_initializer())
如今我们终于可以练习我们的 VAE 了!
每隔 200 步,我们会看一下当前的重建是什么样子的。大年夜约在处理了 2000 次迭代后,大年夜多半重建看上倒是挺合理的。
- 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))
推荐阅读
Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 有若干法度榜样员,就有若干定义。所以我只询问了一些异常有名且经验丰富的法度榜样员。 优良法度榜样员>>>详细阅读
本文标题:如何使用TensorFlow和自编码器模型生成手写数字
地址:http://www.17bianji.com/lsqh/38737.html
1/2 1