Fashion MNIST自编码器网络实战

import tensorflow as  tf
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as keras
from tensorflow.keras import datasets,layers,optimizers,losses,Sequential

batchsz=128
lr=0.01
h_dim=20
#加载Fashion MNIST图片数据集
(x_train,y_train),(x_test,y_test)=datasets.fashion_mnist.load_data()
#归一化
x_train,x_test=x_train.astype(np.float32)/255.,x_test.astype(np.float32)/255.
#只需要通过图片数据即可构建数据集对象,不需要标签
train_db=tf.data.Dataset.from_tensor_slices(x_train)
test_db=tf.data.Dataset.from_tensor_slices(x_test)
#构建测试集对象
train_db=train_db.shuffle(batchsz*5).batch(batchsz)
test_db=test_db.shuffle(batchsz*5).batch(batchsz)

class AE(tf.keras.Model):
    
    def __init__(self):
        super(AE,self).__init__()
        #创建Enconder网络,实现在自编码器类的初始化函数中
        self.encoder=Sequential([layers.Dense(256,activation='relu'),
                                layers.Dense(128,activation='relu'),
                                layers.Dense(h_dim)])
        #创建Deconder网络
        self.decoder=Sequential([layers.Dense(128,activation='relu'),
                                layers.Dense(256,activation='relu'),
                                layers.Dense(784)])
    def call(self,inputs,training=None):
        #前向传播函数
        #编码获得隐藏向量h,[b,784]->[b,20]
        h=self.encoder(inputs)
        #解码获得重建图片,[b,20]->[b,784]
        x_hat=self.decoder(h)
        return x_hat
#创建网络对象
model=AE()
#指定输入大小
model.build(input_shape=(4,784))
#打印网络信息
model.summary()
#创建优化器,并放置学习率
optimizer=optimizers.Adam(learning_rate=lr)

loss=[]
for epoch in range(10):
    for step,x in enumerate(train_db):
        x=tf.reshape(x,[-1,784])
        with tf.GradientTape() as tape:#梯度记录器
            #前向计算获得重建的图片
            x_rec_logits=model(x)
            #计算重建图片与输入之间的损失函数
            rec_loss=tf.nn.sigmoid_cross_entropy_with_logits(labels=x,logits=x_rec_logits)
            rec_loss=tf.reduce_mean(rec_loss)
        #自动求导,包含两个子网络的梯度
        grades=tape.gradient(rec_loss,model.trainable_variables)
        #自动更新,同时更新两个子网络
        optimizer.apply_gradients(zip(grades,model.trainable_variables))
        if step%100==0:
            loss.append(float(rec_loss))
            print("epoch:{},step:{},rec_loss:{}".format(epoch ,step,rec_loss))
#画出训练误差图像
plt.figure()
x=[i*5 for i in range(len(loss))]
plt.plot(x,loss,color='C1',marker='s',label='训练')
plt.xlabel('step')
plt.ylabel('loss')
plt.legend()
plt.show()

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值