基于Tensorflow2.0的Variational AutoEncoder网络

VAE的网络首先,全部都是全连接层,其次拥有均值层和方差层(通常认为它是加上了log的)
最后满足 Z = MEAN + EPS * LOG_VAR,使得Z的值连续可导。
这个EPS需要认为构造一个正太分布(0,1).

import tensorflow as tf
from PIL import Image
import numpy as np


(x_train,y_train),(x_test,y_test) = tf.keras.datasets.mnist.load_data()
print(x_train.shape,y_train.shape)
#(60000, 28, 28) (60000,)

z_dim = 20
batchSize = 128
lr = 0.00001
EPOCH = 300


x_train = tf.cast(x_train,dtype=tf.float32)
x_test = tf.cast(x_test,dtype=tf.float32)

x_train = tf.divide(x_train,255.)
x_test = tf.divide(x_test,255.)

dataBase_train = tf.data.Dataset.from_tensor_slices(x_train).shuffle(10000).batch(batchSize,drop_remainder=True)
dataBase_test = tf.data.Dataset.from_tensor_slices(x_test).shuffle(10000).batch(batchSize,drop_remainder=True)



class VAE(tf.keras.Model):

    def __init__(self):
        super(VAE,self).__init__()
        #encooder
        self.fc1 = tf.keras.layers.Dense(512,activation= tf.nn.relu)
        self.fc2 = tf.keras.layers.Dense(256,activation= tf.nn.relu)
        self.fc4 = tf.keras.layers.Dense(64,activation= tf.nn.relu)
        self.mean = tf.keras.layers.Dense(z_dim)
        self.log_var = tf.keras.layers.Dense(z_dim)


        #decoder

        self.output_fc2 = tf.keras.layers.Dense(128,activation= tf.nn.relu)
        self.output_fc5 = tf.keras.layers.Dense(784)



    def encoder(self,inputs):
        x = tf.reshape(inputs,[-1,784])
        x = self.fc1(x)
        x = self.fc2(x)
        logits = self.fc4(x)
        mean = self.mean(logits)
        log_var = self.log_var(logits)
        return mean,log_var

    def reparameterize(self,mean,log_var):
        eps = tf.random.normal([log_var.shape[1]],mean=0.,stddev=1.)
        z = mean + eps * tf.exp(log_var) ** 0.5
        return z


    def decoder(self,z):
       x =   self.output_fc2(z)
       logits  =  self.output_fc5(x)
       return logits


    def call(self, inputs, training=None, mask=None):
        mean,log_var = self.encoder(inputs)
        z = self.reparameterize(mean,log_var)
        logits = self.decoder(z)
        return logits,mean,log_var


model=VAE()
model.build(input_shape=[None,28,28])
model.summary()
optimizer = tf.optimizers.Adam(learning_rate=lr)
print()

path = r"E:\PycharmProjects\untitled\VAE\save_image\writer"


index = 0

for epoch in range(EPOCH):
    for step,data in enumerate(dataBase_train):

        with tf.GradientTape() as tape:
            logtis,mean,log_var = model(data)
            data = tf.reshape(data,[-1,784])
            logits_loss = tf.keras.losses.binary_crossentropy(data,logtis,from_logits=True)
            #KL离散度,将VAE的数据表达通过一定的函数形式转化为(0,1)分布

KI散度公式最终为:KL

			#上式为标准正太分布,简化后为下式
            kl = - 0.5 * (log_var + 1 - mean ** 2 - tf.exp(log_var))
            kl = tf.reduce_mean(kl)
            loss = tf.reduce_mean((logits_loss + 0.9 * kl))
            grad = tape.gradient(loss,model.trainable_variables)
            optimizer.apply_gradients(zip(grad,model.trainable_variables))


        if step % 100 == 0:
            print("Epoch:",epoch,"Loss:",float(loss))
            writer = tf.summary.create_file_writer(path)
            with writer.as_default():
                tf.summary.scalar("loss",loss,step=step)
    if epoch > 10 and epoch <=20:
        optimizer.learning_rate = lr * 10 ** 0.5

    if epoch > 40 and epoch <=100:
        optimizer.learning_rate = lr * 0.0001

    # text_image = next(iter(dataBase_test))

    text_image = tf.random.normal([batchSize,28,28])
    image = next(iter(text_image))
    # print(image,image.shape)


    new_img = Image.new('L',(28,28))
    logits,_,_ = model(image)
    logits = tf.reshape(logits,[-1,28,28])
    logits = tf.nn.sigmoid(logits) * 255.
    image = Image.fromarray(np.uint8(logits[0]),mode='L')
    new_img.paste(image,(0,0))
    p = r"E:\VAE\save_image"   #图片保存路径
    new_img.save(p + "/{a}.png".format(a = index))
    index += 1
    print("Image Saved!")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PythonTensorFlow 2.0 Demo是一个展示和演示TensorFlow 2.0的示例程序。TensorFlow是一个开源的机器学习框架,它提供了丰富的工具和库,用于构建和训练各种人工智能模型。 TensorFlow 2.0 Demo可以帮助我们了解如何使用Python编写TensorFlow代码,构建和训练模型。在Demo中,我们可以看到一些预先定义好的模型,如卷积神经网络(CNN)和循环神经网络(RNN),以及一些常见的数据集,如MNIST手写数字数据集。 Demo中的代码可以帮助我们学习如何使用TensorFlow 2.0的新特性,如Eager Execution和tf.keras API。Eager Execution使得TensorFlow代码更加直观和易于调试,而tf.keras API提供了一种方便的方式来定义和训练神经网络模型。 另外,Demo还可以帮助我们了解TensorFlow 2.0的一些新功能,如动态图(Dynamic Graph)和AutoGraph。动态图允许我们动态地构建和修改计算图,而AutoGraph则可以将Python代码自动转化为高效的TensorFlow计算图。 通过运行TensorFlow 2.0 Demo,我们可以学习到如何使用PythonTensorFlow构建和训练机器学习模型,并熟悉TensorFlow 2.0的一些新特性和功能。这对于想要进一步了解和掌握深度学习和人工智能的人来说非常有帮助。 ### 回答2: Python TensorFlow 2.0 Demo 是一个用于展示 TensorFlow 2.0 版本的 Python 示例的演示程序。它旨在向用户展示如何使用 TensorFlow 2.0 进行机器学习和深度学习任务。 Python TensorFlow 2.0 Demo 演示了 TensorFlow 2.0 在数据处理、模型构建和训练等方面的功能。通过这个示例,用户可以了解 TensorFlow 2.0 的主要特点和用法。 在数据处理方面,Python TensorFlow 2.0 Demo 提供了许多常用的数据处理功能,例如加载数据集、数据集预处理、数据增强等。这些功能可以帮助用户准备数据用于模型的训练和评估。 在模型构建方面,Python TensorFlow 2.0 Demo 展示了如何使用 TensorFlow 2.0 构建各种类型的神经网络模型,包括卷积神经网络(CNN)、循环神经网络(RNN)和变分自编码器(VAE)等。用户可以学习如何定义模型的结构和参数,并将其编译为可训练的 TensorFlow 图。 在模型训练方面,Python TensorFlow 2.0 Demo 展示了如何使用 TensorFlow 2.0 进行模型的训练和评估。用户可以学习如何选择合适的优化器、损失函数和评估指标,并使用训练数据集对模型进行训练,并使用测试数据集对其进行评估。 总而言之,Python TensorFlow 2.0 Demo 可以帮助用户了解并学习如何使用 TensorFlow 2.0 进行机器学习和深度学习任务。通过这个演示程序,用户可以掌握 TensorFlow 2.0 的基本用法,并在实践中探索更多高级的功能和技巧。 ### 回答3: Python TensorFlow 2.0 是一个强大的深度学习框架,可以用于构建和训练各种机器学习模型。使用 Python TensorFlow 2.0,可以轻松地创建端到端的模型,处理大规模的数据集,以及进行模型的训练和推理。 在 TensorFlow 2.0 中,与之前版本相比,有一些重要的改进和新功能。其中最重要的是 Eager Execution(即动态图执行),它使得在 TensorFlow 中编写代码更加直观和简单,可以立即获得结果的反馈。另外,TensorFlow 2.0 还引入了一种新的高级 API——Keras,它提供了更简洁、易用的方式来定义和训练神经网络模型。 使用 TensorFlow 2.0 可以轻松地构建各种机器学习模型。例如,可以使用 TensorFlow 2.0 构建一个图像分类模型,对图像进行分类。首先,需要准备训练集和测试集的图像数据,然后使用 TensorFlow 2.0 的 Keras API 构建一个卷积神经网络模型。接下来,编写代码对模型进行训练,并使用测试集进行验证。通过迭代和调整模型的参数,可以获得更好的分类效果。 在实际使用 TensorFlow 2.0 进行机器学习任务时,通常还会使用一些其他的库和工具来辅助。例如,可以使用 NumPy 来处理和转换数据,使用 Matplotlib 来可视化结果,使用 Pandas 来进行数据处理和分析等等。同时,也可以利用 TensorFlow 的高级特性,如分布式训练和自定义损失函数等,来进一步提升模型的性能和效果。 总而言之,Python TensorFlow 2.0 是一个功能强大、易用的深度学习框架,可用于构建和训练各种机器学习模型。通过灵活的应用和结合其他工具和库,可以实现各式各样的机器学习任务,并获得良好的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值