基于Tensorflow2的基本自编码器实现(MNIST)

该博客介绍了如何在Tensorflow2中实现一个基本的自编码器,以MNIST手写数字数据集为例。首先导入所需库,然后预处理数据。接着创建自编码器模型,包括编码器和解码器,使用ReLU和Sigmoid激活函数。模型编译后,用Adam优化器和MSE损失函数进行训练。最后,提取编码器和解码器模型,并使用测试集进行验证,比较原始图像和重构后的图像。
摘要由CSDN通过智能技术生成

基于Tensorflow2的基本自编码器实现(MNIST)


在这里插入图片描述
关于自编码器的知识这里暂不做过多介绍,我们直接在手写数字集MNIST上进行演示效果。

1. 导包

import tensorflow as tf # 2.0
import matplotlib.pyplot as plt

2. 数据准备

# 加载数据
(x_train, _), (x_test, _) = tf.keras.datasets.mnist.load_data() # 不需要标签,因此使用占位符
# x_train.shape 为(60000, 28, 28)
# x_test.shape 为(10000, 28, 28)
x_train = x_train.reshape([x_train.shape[0],28*28]) # 改变shape
x_test = x_test.reshape([x_test.shape[0],28*28])
# x_train.shape 为(60000, 784)
# x_test.shape 为(10000, 784)
# 归一化为0-1之间的数据(愿MNIST数据为0-255之间)
x_train = tf.cast(x_train,tf.float32)/255 
x_test =  tf.cast(x_test,tf.float32)/255

3. 模型创建

将原784维的数据压缩至32维,再还原为784维的数据

# 设置参数
input_size = 784 
hidden_size = 32
output_size = 784
# 使用函数式方式创建Model
input  = tf.keras.layers.Input(shape  = (input_size,))
# encode 
en = tf.keras.layers.Dense(hidden_size,activation='relu')(input)
# decode
de = tf.keras.layers.Dense(output_size,activation='sigmoid')(en)
# 创建模型,指定输入与输出
model = tf.keras.Model(inputs = input,outputs = de)

使用print(model.summary())查看模型,可以看到每层的shape大小及参数的数量

在这里插入图片描述

4. 模型编译与训练

model.compile(optimizer=tf.optimizers.Adam(),loss =tf.losses.mse,metrics=['acc'])
model.fit(x_train,x_train,
          epochs=50,
          batch_size=255,
          shuffle=True,
          validation_data=(x_test,x_test)) # 目标数据也是目标数据也是x_test

5. 从模型中获取编码器与解码器

获取编码器encode,输入为784维,输出为32维

input_en  = tf.keras.layers.Input(shape  = (input_size,))
en = model.layers[1](input_en) # 利用了模型中第一个Dense层训练好的参数
encode = tf.keras.Model(inputs = input_en ,outputs = en)

获取解码器decode,输入为32维,输出为784维

input_de = tf.keras.layers.Input(shape = (hidden_size,))
output_de = model.layers[-1](input_de)  # -1 调用之前训练好模型的最后一层 ,利用了模型中第二个Dense层训练好的参数
decode = tf.keras.Model(inputs = input_de ,outputs = output_de)

6. 使用测试集进行测试

x_test = x_test.numpy()
print(x_test.shape)# (10000, 784)

encode_test = encode.predict(x_test)# 压缩  ->   (10000, 32)

decode_test = decode.predict(encode_test) # 解码 -> (10000, 784)

# 绘图
n = 15
plt.figure(figsize=(20,4)) # 宽20 高4的 画布
for i in range(1,n):
    ax = plt.subplot(2,n,i) # 几行几列的第几个
    plt.imshow(x_test[i].reshape(28,28)) # 绘制上一层
    ax = plt.subplot(2,n,i+n) # 几行几列的第几个
    plt.imshow(decode_test[i].reshape(28,28)) # 绘制下一层

绘图结果,上面为原数据,下面为编码又解码之后的数据
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为您介绍一下如何基于TensorFlow使用LeNet-5实现MNIST手写数字识别分类。 1. 导入相关库 首先,我们需要导入TensorFlow和其他必要的库。在这个例子中,我们需要使用TensorFlow、NumPy和Matplotlib。 ``` import tensorflow as tf import numpy as np import matplotlib.pyplot as plt ``` 2. 加载数据集 接下来,我们需要加载MNIST数据集。TensorFlow已经为我们提供了一个方便的函数来加载MNIST数据集。我们可以使用以下代码来加载数据集: ``` (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data() ``` 这个函数将返回两个元组,一个用于训练数据,一个用于测试数据。在每个元组中,第一个元素是图像数组,第二个元素是标签数组。 3. 数据预处理 在训练模型之前,我们需要对数据进行一些预处理。首先,我们需要将图像数组归一化到0-1范围内。我们可以使用以下代码来完成此操作: ``` train_images = train_images / 255.0 test_images = test_images / 255.0 ``` 其次,我们需要将标签数组转换为独热编码形式。我们可以使用以下代码来完成此操作: ``` train_labels = tf.keras.utils.to_categorical(train_labels) test_labels = tf.keras.utils.to_categorical(test_labels) ``` 4. 构建模型 接下来,我们将构建LeNet-5模型。我们可以使用以下代码来定义模型: ``` model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(filters=6, kernel_size=5, activation='relu', input_shape=(28, 28, 1)), tf.keras.layers.MaxPooling2D(pool_size=2), tf.keras.layers.Conv2D(filters=16, kernel_size=5, activation='relu'), tf.keras.layers.MaxPooling2D(pool_size=2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(units=120, activation='relu'), tf.keras.layers.Dense(units=84, activation='relu'), tf.keras.layers.Dense(units=10, activation='softmax') ]) ``` 这个模型由两个卷积层、两个池化层和三个全连接层组成。第一个卷积层使用6个5x5的过滤器,第二个卷积层使用16个5x5的过滤器。两个池化层分别使用2x2的池化器。最后,我们使用三个全连接层来完成分类任务。 5. 编译模型 在训练模型之前,我们需要编译模型。我们可以使用以下代码来编译模型: ``` model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) ``` 我们使用Adam优化器、交叉熵损失函数和准确率指标来编译模型。 6. 训练模型 现在,我们可以开始训练我们的模型了。我们可以使用以下代码来训练模型: ``` history = model.fit(train_images.reshape(-1, 28, 28, 1), train_labels, epochs=10, validation_data=(test_images.reshape(-1, 28, 28, 1), test_labels)) ``` 在这里,我们指定了训练数据、标签和训练轮数。我们还指定了验证集数据和标签,以便在训练期间监测模型的性能。 7. 评估模型 训练完成后,我们可以评估模型在测试集上的性能。我们可以使用以下代码来评估模型: ``` test_loss, test_accuracy = model.evaluate(test_images.reshape(-1, 28, 28, 1), test_labels) print('Test accuracy:', test_accuracy) ``` 8. 可视化训练历史 最后,我们可以使用Matplotlib可视化训练历史。我们可以使用以下代码来可视化训练历史: ``` plt.plot(history.history['accuracy'], label='Training accuracy') plt.plot(history.history['val_accuracy'], label='Validation accuracy') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.legend() plt.show() ``` 这将显示训练和验证准确率随时间变化的图形。 好的,以上就是基于TensorFlow使用LeNet-5实现MNIST手写数字识别分类的步骤。希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值