自编码实例3:卷积网络的自编码

Pytorch:基于转置卷积解码的卷积自编码网络 介绍了解码器为转置卷积的卷积自编码网络,并用该网络进行图像去噪,计算了峰值信噪比,并可视化相关结果。 阅读详情

      自编码结构不仅可用在全连接网络上,还可以用在卷积网络上。以下实例输入经过两层卷积、池化、反池化、两层卷积操作。

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

# 导入 MINST 数据集
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/data/", one_hot=True)

# 网络模型参数
learning_rate = 0.01
n_conv_1 = 16  # 第一层  
n_conv_2 = 32  # 第二层
n_input = 784
batchsize = 50

x = tf.placeholder("float", [batchsize, n_input])
x_image = tf.reshape(x, [-1, 28, 28, 1])  # 输入图像

def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1,1,1,1], padding="SAME")
def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding="SAME")

# 编码
def encoder(x):
    h_conv1 = tf.nn.relu(conv2d(x, weights["encoder_conv1"]) + biases["encoder_conv1"])
    h_conv2 = tf.nn.relu(conv2d(h_conv1, weights["encoder_conv2"]) + biases["encoder_conv2"])
    return h_conv2, h_conv1

# 解码
def decoder(x, conv1):
    # 反卷积
    t_conv1 = tf.nn.conv2d_transpose(x-biases["decoder_conv2"], weights["decoder_conv2"], conv1.shape, [1,1,1,1])
    t_x_image = tf.nn.conv2d_transpose(t_conv1-biases["decoder_conv1"], weights["decoder_conv1"], x_image.shape, [1,1,1,1])
    return t_x_image

# 学习参数
weights = {
    "encoder_conv1": tf.Variable(tf.truncated_normal([5,5,1,n_conv_1], stddev=0.1)),
    "encoder_conv2": tf.Variable(tf.random_normal([3,3,n_conv_1,n_conv_2], stddev=0.1)),
    
    "decoder_conv1": tf.Variable(tf.random_normal([5,5,1,n_conv_1], stddev=0.1)),
    "decoder_conv2": tf.Variable(tf.random_normal([3,3,n_conv_1,n_conv_2], stddev=0.1)),
}
biases = {
    "encoder_conv1": tf.Variable(tf.zeros([n_conv_1])),
    "encoder_conv2": tf.Variable(tf.zeros([n_conv_2])),
    
    "decoder_conv1": tf.Variable(tf.zeros([n_conv_1])),
    "decoder_conv2": tf.Variable(tf.zeros([n_conv_2])),
}

# 最大池化
def max_pool_with_argmax(net, stride):
    _, mask = tf.nn.max_pool_with_argmax(net, ksize=[1, stride, stride, 1], strides=[1, stride, stride, 1], padding="SAME")
    mask = tf.stop_gradient(mask)
    net = tf.nn.max_pool(net, ksize=[1, stride, stride, 1], strides=[1, stride, stride, 1], padding="SAME")
    return net, mask

# 反池化
def unpool(net, maks, stride):
    ksize = [1, stride, stride, 1]
    input_shape = net.get_shape().as_list()
    # 输出比输入大ksize倍
    output_shape = (input_shape[0], input_shape[1]*ksize[1], input_shape[2]*ksize[2], input_shape[3])
    one_like_mask = tf.ones_like(mask)
    batch_range = tf.reshape(tf.range(output_shape[0], dtype=tf.int64), shape=[input_shape[0], 1, 1, 1])
    b = one_like_mask * batch_range
    y = mask // (output_shape[2] * output_shape[3])
    x = mask % (output_shape[2]*output_shape[3]) // output_shape[3]
    feature_range = tf.range(output_shape[3], dtype=tf.int64)
    f = one_like_mask * feature_range
    # 
    updates_size = tf.size(net)
    indices = tf.transpose(tf.reshape(tf.stack([b, y, x, f]), [4, updates_size]))
    values = tf.reshape(net, [updates_size])
    ret = tf.scatter_nd(indices, values, output_shape)
    return ret

# 输出的节点
encoder_out, conv1 = encoder(x_image)
# 池化层
h_pool2, mask = max_pool_with_argmax(encoder_out, 2)   # 加入池化
h_upool = unpool(h_pool2, mask, 2)  # 反池化
pred = decoder(h_upool, conv1)

# 使用平方差为cost
cost = tf.reduce_mean(tf.pow(x_image - pred, 2))
optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost)

# 训练参数
training_epochs = 20
display_step = 5

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    total_batch = int(mnist.train.num_examples/batchsize)
    for epoch in range(training_epochs):
        for i in range(total_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batchsize)
            _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs})
        if epoch % display_step == 0:
            print("Epoch:", "%04d"%(epoch+1), "cost=", "{:.9f}".format(c))
    print("Done")
    # 测试
    batch_xs, batch_ys = mnist.train.next_batch(batchsize)
    print("Error:", cost.eval({x: batch_xs}))
    # 可视化结果
    show_num = 10
    reconstruction = sess.run(pred, feed_dict={x: batch_xs})
    f, a = plt.subplots(2, 10, figsize=(10, 2))
    for i in range(show_num):
        a[0][i].imshow(np.reshape(batch_xs[i], (28,28)))
        a[1][i].imshow(np.reshape(reconstruction[i], (28,28)))
    plt.draw()

可以看出输出与输入基本一样

 

卷积自编码器 卷积自编码器利用了传统自编码器的无监督的学习方式,结合了卷积神经网络的卷积和池化操作,从而实现特征提取,最后通过stack,实现一个深层的神经网络。 具体文章可以参考: Masci J, Meier U, Cireşan D, et al. Stacked convolutional auto-encoders for hierarchical feature extraction[C]//I 阅读详情

相关推荐

深度学习之卷积自编码器

一、自编码器 自编码器(Autoencoder)是一种旨在将它们的输入复制到的输出的神经网络。他们通过将输入压缩成一种隐藏空间表示(latent-space representation),然后这种重构这种表示的输出进行工作。这种网络由两部分组成,如下图: 编码器:将输入压缩为潜在空间表示。可以用编码函数h = f(x)表示。 解码器:这部分旨在重构来自隐藏空间表示的输入。可以用解码函数r ...

zlinxi 4万+

卷积自编码

这篇教程是翻译Paolo Galeone写的卷积自编码分析教程,作者已经授权翻译,这是原文。 卷积操作符会对输入信号进行滤波操作,以便提取其内容的一部分。在传统的方法中,自编码没有考虑到信号可以被看做是和其他信号的和。相反,卷积自编码就是使用卷积操作来做信号的叠加之和。他们对一组简...

chuange6363的博客 1164

TensorFlow实现卷积自编码器对图像进行去噪

一、概念介绍 自编码器是一种执行数据压缩的网络架构,其中的压缩和解压缩功能是从数据本身学习得到的,而非人为手工设计的。自编码器的两个核心部分是编码器和解码器,它将输入数据压缩到一个潜在表示空间里面,然后再根据这个表示空间将数据进行重构得到最后的输出数据。编码器和解码器都是用神经网络构建的,整个网络的构建方式和普通的神经网络类似,通过最小化输入和输出之间的差异来得到最好的网络。 二、作用   ...

人如墨的博客 1万+

深度学习笔记——卷积神经网络、自编码器

发现虽然玩了一次卷积神经网络,但还没有写文章分析下它在干什么。and今天瞅了眼自编码器和深度生成模型,生成宝可梦感觉真好玩啊(x。

andrew_1219的博客 1594

卷积自编码器(CAE)概念解析与用法实例:压缩数字图像

在深度学习领域,自编码器(Autoencoder)是一种无监督学习模型,用于学习数据的压缩表示并从中重建原始数据。卷积自编码器(Convolutional Autoencoder,CAE)是自编码器的一个变种,如果不熟悉自编码器,可以去读一读之前的博客。可以发现CAE与Autoencoder的差距无非就是一个用卷积层池化层学习,一个用全连接神经网络学习。CAE特别适用于处理图像数据。通过使用卷积层和池化层,CAE能够有效地学习图像的层次特征表示,同时减少参数量,提高模型的效率和性能。# 编码器部分。

橙色小博的博客,励志在人工智能领域发光发热! 2326

Pytorch:基于线性插值和卷积解码的卷积自编码网络

介绍了基于线性插值和卷积来解码的卷积自编码器,并用它来进行图像去噪。对结果计算峰值信噪比,可视化分析,并对比了它和基于转置卷积解码的卷积自编码器差异

Jingmin Wei's Blog 1282

深度学习系列(十):从卷积计算到卷积神经网络CNN

前面已经介绍了深度学习的一个模型框架:自编码器,那么从本节后来再来简单介绍一下深度学习的另一个模型框架:卷积神经网络CNN,关于CNN可能大家听说过的不能在多了,网上资源众多,各路大神总结的也是无比完美,在这里就不在copy了,重要的地方直接直接贴出那些优秀的文章,这里旨在记录一下整个思路过程以及一些简单的认识以求完整。首先贴一下网络上众多了讲解CNN的好资源吧: (1)综述性的:Deep Lea

我爱智能 2万+

用于图像降噪的卷积自编码器

在神经网络中,有一些重要的方法来对图像数据进行建模。其中卷积神经网络(CNN 或者 ConvNet)和卷积自编码器。以图像降噪的卷积自编码器为例

linspirit的博客 1126

基于卷积自编码网络结构的图像修复

基于自编码器的生成网络 深度自编码器( DAE) 网络,图2 给出了一个5层的深度自编码器网络示意图,其隐层( L2 ~ L4)的节点数目由多到少,再由少到多,最后输出层节点与输入层节点的数目一致。本质上, 中间的每层都是原输入的一个表示, 最低维度的表示在 L3 层。 深度网络的训练 深度置信网络(DBN)提出了非监督贪心逐层训练算法,为解决深层结构相关的优化难题带来希望,在深度网络的训练中,先用无监督逐层贪心训练算法对隐层完成预训练,然后使用反向传播( BP) ...

weixin_44881806的博客 6674

PyTorch 深度学习 || 4. 自编码网络 | Ch4.3 卷积自编码网络图像去噪

ok

weixin_40234309的博客 870

卷积自编码器 (Convolutional AutoEncoder) 详解与实现

卷积自编码器是一种基于卷积神经网络结构的自编码器,适用于处理图像数据。卷积自编码器在图像处理领域有广泛的应用,包括图像去噪、图像压缩、图像生成等任务。通过训练卷积自编码器,可以提取出输入图像的关键特征,并实现对图像数据的降维和压缩,同时保留重要的空间信息。在本节中,我们介绍了卷积自编码器的模型架构,使用 Keras 从零开始实现在 Fashion-MNIST 数据集上训练了一个简单的卷积自编码器。

盼小辉丶的博客 4497

卷积自编码器CAEs

https://www.cnblogs.com/cvtoEyes/p/8848815.html https://blog.youkuaiyun.com/woshisunwen/article/details/82830022

ヤ亽o﹏妳的博客 9091

稀疏自编码与卷积神经网络的结合

1.背景介绍 稀疏自编码(Sparse Autoencoder)和卷积神经网络(Convolutional Neural Networks,CNN)都是深度学习领域中的重要算法,它们各自在不同的应用场景中表现出色。稀疏自编码在图像压缩、特征学习和降维等方面有着广泛的应用,而卷积神经网络则在图像识别、语音处理和自然语言处理等领域取得了显著的成果。

AI天才研究院 1473

tensorflow 卷积、反卷积形式的去噪自编码器

对于去噪自编码器,网上好多都是利用全连接神经网络进行构建,我自己写了一个卷积、反卷积形式的去噪自编码器,其中的参数调优如果有兴趣的话,可以自行修改查看结果。 数据集我使用最简单的mnist: 网络结构: mnist输入(28*28=784向量) => 28*28*1矩阵 => 卷积层1 => 14*14*64 => 卷积层2 => 7*7*64 => 卷积层3 =>

妙猪的专栏 9718

PyTorch深度学习实战(28)——卷积自编码器(Convolutional Autoencoder)

卷积自编码器是一种基于卷积神经网络结构的自编码器,适用于处理图像数据。在本节中,我们介绍了卷积自编码器的模型架构,使用 PyTorch 从零开始实现在 MNIST 数据集上训练了一个简单的卷积自编码器,并使用 t-SNE 技术在二维平面中表示了所有测试图像的潜变量。

盼小辉丶的博客 1万+

卷积自编码去噪-tensorflow实现

tensorflow下构建三层卷积层,三层反卷积层实现卷积自编码,针对系数为0.5的高斯噪声亦有较好效果,可通过tensorboard查看输入输出图像

Tensorflow 2.0 教程-卷积自编码器

Tensorflow 2.0 教程持续更新 :https://blog.youkuaiyun.com/qq_31456593/article/details/88606284 完整tensorflow2.0教程代码请看tensorflow2.0:中文教程tensorflow2_tutorials_chinese(欢迎star) 入门教程: TensorFlow 2.0 教程- Keras 快速入门 Tenso...

知行_那片天 3581

卷积网络自编码_tensorflow卷积网络自编码_卷积网络自编码_

卷积网络自编码: 导入 MINST 数据集

上一篇: 自编码实例2:线性编码器
下一篇: 自编码实例4:去噪自编码
CopperDong
博客等级 码龄14年 1205粉丝 466原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值