18.Keras与Tensorflow混用(再战VAE)

本文介绍了一个基于TensorFlow 1.9.0的变分自编码器(VAE)模型,用于生成MNIST手写数字图像。模型通过编码层将输入图像转换为低维隐变量,再通过解码层生成新的图像。训练过程中,模型同时最小化重构损失和KL散度,以保持生成图像的质量和多样性。
部署运行你感兴趣的模型镜像

Tensorflow : 1.9.0

import tensorflow as tf
import keras
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import keras.backend as K
import os
from keras.layers import Dense,Dropout
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data/',one_hot=True)
if not os.path.exists('out/'):
    os.makedirs('out/')

#画图方法
def plot(samples):
    fig = plt.figure(figsize=(4, 4))
    gs = gridspec.GridSpec(4, 4)
    gs.update(wspace=0.05, hspace=0.05)

    for i, sample in enumerate(samples):
        ax = plt.subplot(gs[i])
        plt.axis('off')
        ax.set_xticklabels([])
        ax.set_yticklabels([])
        ax.set_aspect('equal')
        plt.imshow(sample.reshape(28, 28), cmap='Greys_r')
    return fig

#输入维度
input_dim = 784
#隐变量z的维度
z_dim = 2
#学习率
learning_rate = 0.001
#minibatch的大小
batch_size = 250

#定义占位符
X = tf.placeholder(tf.float32, shape=[None, input_dim])
z = tf.placeholder(tf.float32, shape=[None, z_dim])
X /= 255.

#编码层
encode = Dense(512,activation='relu',
               kernel_initializer=keras.initializers.TruncatedNormal())(X)
encode = Dense(256,activation='relu',
               kernel_initializer=keras.initializers.TruncatedNormal())(encode)
encode = Dropout(rate=0.3)(encode)
mu = Dense(z_dim,
           kernel_initializer=keras.initializers.TruncatedNormal())(encode)
logvar = Dense(z_dim,
               kernel_initializer=keras.initializers.TruncatedNormal())(encode)

#计算Z
def get_z(z_mu,z_logvar):
    #标准正态分布
    eps = tf.random_normal(shape=tf.shape(z_mu))
    #返回Z的分布
    return mu + tf.exp(z_logvar / 2) * eps

z = get_z(mu,logvar)

decode = Dense(256,activation='relu',
               kernel_initializer=keras.initializers.TruncatedNormal())(z)
decode = Dense(512,activation='relu',
               kernel_initializer=keras.initializers.TruncatedNormal())(decode)
decode = Dropout(rate=0.3)(decode)
x_samples = Dense(784,activation='sigmoid')(decode)

#重构损失,比较还原的图像与原图像的损失
BCE = K.sum(K.binary_crossentropy(X,x_samples),axis=1)
#KL散度
KLD = 0.5*K.sum(tf.pow(mu, 2) + K.exp(logvar) - 1 - logvar,1)
# VAE loss
vae_loss = K.mean(KLD + BCE)

train = tf.train.AdamOptimizer(learning_rate).minimize(vae_loss)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    i = 10
    for it in range(5001): 
        batch_xs, _ = mnist.train.next_batch(batch_size) 
        _, loss = sess.run([train, vae_loss], feed_dict={X: batch_xs})
        if it % 1000 == 0:
            print('Iter: {}'.format(it))
            print('Loss: {:.4}'. format(loss))
            print('-----------------------')
            samples = sess.run(x_samples, feed_dict={z:np.random.randn(16, z_dim)})
            fig = plot(samples)
            plt.savefig('out/{}.png'.format(str(i).zfill(3)), bbox_inches='tight')
            i += 1
            plt.close(fig)

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

### `tensorflow.keras` `tensorflow.python.keras` 的区别 在 TensorFlow 中,`tensorflow.keras` 是官方推荐的标准模块路径,用于导入 Keras 提供的高级 API,包括模型构建、层、优化器等功能。从 TensorFlow 2.0 开始,Keras 成为了 TensorFlow 的默认高级 API,并且被集成在 `tensorflow.keras` 命名空间下,例如: ```python from tensorflow.keras import layers, models, optimizers ``` 这一路径的设计目标是提供一致、稳定的接口,并确保 TensorFlow 的其他模块兼容[^3]。 相比之下,`tensorflow.python.keras` 是 TensorFlow 1.x 中使用的内部模块路径,通常用于访问底层实现细节。它属于 TensorFlow 的私有模块,不建议在用户代码中直接使用。例如: ```python from tensorflow.python.keras import layers ``` 由于 `tensorflow.python.keras` 是 TensorFlow 的内部实现模块,其接口可能不稳定,且在版本更新时可能发生变化,导致代码不可用。因此,官方不推荐使用该路径进行导入,也不保证其向后兼容性[^1]。 ### 是否可以直接混用? `tensorflow.keras` `tensorflow.python.keras` 不应混用。`tensorflow.python.keras` 主要用于 TensorFlow 的内部开发测试,而 `tensorflow.keras` 是面向用户的公共 API 接口。混用这两个模块可能导致命名冲突、行为不一致以及难以调试的问题。例如,如果在同一个代码中同时导入 `tensorflow.keras.optimizers.Adam` `tensorflow.python.keras.optimizers.Adam`,可能会导致不可预期的运行时错误[^4]。 此外,使用 `tensorflow.python.keras` 的方式导入模块可能在某些环境中无法正常工作,尤其是在 TensorFlow 的未来版本中,私有模块的结构可能会被调整或移除[^1]。 ### 推荐做法 为了确保代码的可维护性稳定性,应始终使用 `tensorflow.keras` 路径来导入 Keras 相关功能。该路径提供的 API 经过官方维护,具有良好的文档支持版本兼容性保证。例如: ```python import tensorflow as tf from tensorflow.keras import layers, models ``` 这种做法不仅有助于避免模块导入错误,还能确保代码在不同版本的 TensorFlow 中保持一致性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值