TensorFlow 实现 CNN 自编码网络

TensorFlow 实现CNN自编码网络文章目录TensorFlow 实现CNN自编码网络1. 实现:2. 数据集:3. 实现流程:3.1 编码:CNN卷积操作3.2 解码:反卷积操作3.3 主网络3.4 训练网络3.5 测试代码4. 网络结构实现代码:5. 训练网络:获取损失和解码图6. 代码结果输出:7. 损失图8. 效果展示:原始图片:生成图片:9. 测试网络:测试代码:原始图片:生成...
摘要由CSDN通过智能技术生成

TensorFlow 实现CNN自编码网络

1. 实现:

实现卷积编码和反卷积解码的自编码网络

2. 数据集:

MNIST数据集

3. 实现流程:

3.1 编码:CNN卷积操作

CNN卷积操作 输入图像shape 激活函数 卷积核shape 步长 输出图像shape
第一层卷积 [batch,28,28,1] LeakReLU [3,3,1,16] [1,2,2,1] [batch,14,14,16]
第二层卷积 [batch,14,14,16] LeakReLU [3,316,32] [1,2,2,1] [batch,7,7,32]
第三层卷积 [batch,7,7,32] LeakReLU [3,3,32,64] [1,2,2,1] [batch,4,4,64]
第四层卷积 [batch,4,4,64] LeakReLU [2,2,64,64] [1,2,2,1] [batch,2,2,64]

3.2 解码:反卷积操作

CNN反卷积操作 输入图像shape 激活函数 卷积核shape 步长 输出图像shape
第一层反卷积 [batch,2,2,64] LeakReLU [2,2,1,16] [1,2,2,1] [batch,4,4,64]
第二层反卷积 [batch,4,4,64] LeakReLU [3,316,32] [1,2,2,1] [batch,7,7,32]
第三层反卷积 [batch,7,7,32] LeakReLU [3,3,32,64] [1,2,2,1] [batch,14,14,16]
第四层反卷积 [batch,14,14,16] LeakReLU [3,3,64,64] [1,2,2,1] [batch,28,28,1]

3.3 主网络

主网络
获取输入 占位符 类型:tf.float32 shape:[batch,28,28,1]
前向结构 获取卷积输出 [batch,2,2,64]
获取反卷积输出 [batch,28,28,1]
后向结构 损失 反卷积输出 输入数据 均值平方差
优化器 tf.train.AdamOptimizer()

3.4 训练网络

  1. MNIST数据集
  2. 每次从训练集取100张图片
  3. 因获取图片shape为【100,784】,转换为【100,28,28,1】
  4. 获取损失
  5. 每训练20次,输出损失
  6. 从测试集中取100张图片,输入进网络,获取解码后的图片,并输出

3.5 测试代码

测试网络 形状:shape batch=100
获取测试集 样本:[batch,784]
更改样本集的形状 样本:[batch,28,28,1]
向主网络中传入数据 样本:[batch,28,28,1]
获取解码器输出数据 预测数据:[batch,28,28,1]
输出一张真实图片
输出一张解码图片

4. 网络结构实现代码:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import numpy as np
import matplotlib.pyplot as plt
mnist = input_data.read_data_sets(r'E:\PycharmProjects\TensorflowTest\MNIST_data',one_hot=True)

# 卷积操作
class Convolution:
    def __init__(self):
        # 输入:[100,28,28,1]
        # 输出:(100, 14, 14, 16)
        self.filter1 = tf.Variable(tf.truncated_normal([3,3,1,16], stddev=0.1))
        self.b1 = tf.Variable(tf.zeros([16]))
        # 输出:(100, 7, 7, 32)
        self.filter2 = tf.Variable(tf.truncated_normal([3,3,16,32], stddev=0.1))
        self.b2 = tf.Variable(tf.zeros([32]))
        # 输出:(100, 4, 4, 64)
        self.filter3 = tf.Variable(tf.truncated_normal([3,3,32,64], stddev=0.1))
        self
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
卷积神经网络CNN)可以用来实现自编码器(Autoencoder)。自编码器是一种无监督学习的神经网络,它可以将输入数据编码成低维度的表示,并且能够从这个低维度的表示中重构出输入数据。自编码器通常被用于数据降维、特征提取和数据去噪等应用。 在CNN中,卷积层可以用于提取图像的特征,池化层可以用于降低特征图的尺寸,反卷积层可以用于将低维度的特征图重构成原始图像。因此,CNN可以用于实现自编码器。 下面是一个简单的卷积自编码器实现: ```python import tensorflow as tf # 定义卷积自编码器 class ConvAutoencoder(tf.keras.Model): def __init__(self): super(ConvAutoencoder, self).__init__() # 编码器 self.encoder = tf.keras.Sequential([ tf.keras.layers.Input(shape=(28, 28, 1)), tf.keras.layers.Conv2D(32, (3, 3), activation='relu', padding='same', strides=2), tf.keras.layers.Conv2D(16, (3, 3), activation='relu', padding='same', strides=2), tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding='same', strides=2), ]) # 解码器 self.decoder = tf.keras.Sequential([ tf.keras.layers.Conv2DTranspose(8, kernel_size=3, strides=2, activation='relu', padding='same'), tf.keras.layers.Conv2DTranspose(16, kernel_size=3, strides=2, activation='relu', padding='same'), tf.keras.layers.Conv2DTranspose(32, kernel_size=3, strides=2, activation='relu', padding='same'), tf.keras.layers.Conv2DTranspose(1, kernel_size=(3, 3), activation='sigmoid', padding='same') ]) def call(self, x): encoded = self.encoder(x) decoded = self.decoder(encoded) return decoded ``` 在这个例子中,我们定义了一个包含编码器和解码器的卷积自编码器。编码器包含三个卷积层,每个卷积层后都有一个池化层,用于将特征图的尺寸进行降低。解码器包含四个反卷积层,每个反卷积层都将特征图的尺寸进行还原。 在训练时,我们可以使用MNIST数据集进行训练: ```python # 加载MNIST数据集 (x_train, _), (x_test, _) = tf.keras.datasets.mnist.load_data() # 缩放到0~1之间 x_train = x_train.astype('float32') / 255. x_test = x_test.astype('float32') / 255. # 转换成适合卷积的形状 x_train = tf.reshape(x_train, (len(x_train), 28, 28, 1)) x_test = tf.reshape(x_test, (len(x_test), 28, 28, 1)) # 定义模型 autoencoder = ConvAutoencoder() # 编译模型 autoencoder.compile(optimizer='adam', loss='binary_crossentropy') # 训练模型 autoencoder.fit(x_train, x_train, epochs=10, batch_size=128, shuffle=True, validation_data=(x_test, x_test)) ``` 这个例子中,我们将MNIST数据集缩放到了0~1之间,并且转换成了适合卷积的形状。然后,我们定义了一个ConvAutoencoder模型,并且使用二元交叉熵作为损失函数进行编译。最后,我们使用训练集进行训练,训练10个epochs,批量大小为128。同时,我们使用测试集进行验证。 训练完成后,我们可以使用模型对图像进行重构: ```python import matplotlib.pyplot as plt # 从测试集中随机选择一些图像 n = 10 plt.figure(figsize=(20, 4)) for i in range(n): ax = plt.subplot(2, n, i + 1) plt.imshow(x_test[i].reshape(28, 28)) plt.gray() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) ax = plt.subplot(2, n, i + 1 + n) reconstructed = autoencoder(x_test[i].reshape(1, 28, 28, 1)).numpy().reshape(28, 28) plt.imshow(reconstructed) plt.gray() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) plt.show() ``` 上面的代码中,我们从测试集中随机选择了10张图像,并且使用模型对这些图像进行了重构。重构后的图像与原始图像非常相似,说明模型学习到了数据的重要特征。 这就是一个简单的卷积自编码器实现。在实际应用中,我们可以使用更深的卷积层和更多的特征图来提高自编码器的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值