【CAES】卷积神经网络 自编码器 反卷积神经网络 Convolutional Auto-Encoders

卷积神经网络自编码器实现与结果分析

(1)实现框架:Keras
(2)数据集:Mnist 手写数字识别
(3)关键代码:

环境配置

使用conda,新建一个keras 和tensorflow的环境

在win cmd 终端中建立一个新的环境
新建用pip安装三个包

C:\Users\TJ619\Downloads\autoencoder-master>conda create -n keras_only python=3.9
(base) C:\Users\TJ619\Downloads\autoencoder-master>conda activate keras_only
(keras_only) C:\Users\TJ619\Downloads\autoencoder-master> conda install pip
(keras_only) C:\Users\TJ619\Downloads\autoencoder-master>pip install keras tensorflow matplotlib
(keras_only) C:\Users\TJ619\Downloads\autoencoder-master>conda list
# packages in environment at C:\Users\TJ619\AppData\Local\Continuum\anaconda3\envs\keras_only:   
#
# Name                    Version                   Build  Channel
absl-py                   1.0.0                    pypi_0    pypi
astunparse                1.6.3                    pypi_0    pypi
ca-certificates           2021.10.26           haa95532_2    http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
cachetools                4.2.4                    pypi_0    pypi
certifi                   2021.10.8        py39haa95532_0    http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
charset-normalizer        2.0.9                    pypi_0    pypi
cycler                    0.11.0                   pypi_0    pypi
flatbuffers               2.0                      pypi_0    pypi
fonttools                 4.28.3                   pypi_0    pypi
gast                      0.4.0                    pypi_0    pypi
google-auth               2.3.3                    pypi_0    pypi
google-auth-oauthlib      0.4.6                    pypi_0    pypi
google-pasta              0.2.0                    pypi_0    pypi
grpcio                    1.42.0                   pypi_0    pypi
h5py                      3.6.0                    pypi_0    pypi
idna                      3.3                      pypi_0    pypi
importlib-metadata        4.8.2                    pypi_0    pypi
keras                     2.7.0                    pypi_0    pypi
keras-preprocessing       1.1.2                    pypi_0    pypi
kiwisolver                1.3.2                    pypi_0    pypi
libclang                  12.0.0                   pypi_0    pypi
markdown                  3.3.6                    pypi_0    pypi
matplotlib                3.5.0                    pypi_0    pypi
numpy                     1.21.4                   pypi_0    pypi
oauthlib                  3.1.1                    pypi_0    pypi
openssl                   1.1.1l               h2bbff1b_0    http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
opt-einsum                3.3.0                    pypi_0    pypi
packaging                 21.3                     pypi_0    pypi
pillow                    8.4.0                    pypi_0    pypi
pip                       21.2.4           py39haa95532_0    http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
protobuf                  3.19.1                   pypi_0    pypi
pyasn1                    0.4.8                    pypi_0    pypi
pyasn1-modules            0.2.8                    pypi_0    pypi
pyparsing                 3.0.6                    pypi_0    pypi
python                    3.9.7                h6244533_1    http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
python-dateutil           2.8.2                    pypi_0    pypi
requests                  2.26.0                   pypi_0    pypi
requests-oauthlib         1.3.0                    pypi_0    pypi
rsa                       4.8                      pypi_0    pypi
setuptools                58.0.4           py39haa95532_0    http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
setuptools-scm            6.3.2                    pypi_0    pypi
six                       1.16.0                   pypi_0    pypi
sqlite                    3.36.0               h2bbff1b_0    http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
tensorboard               2.7.0                    pypi_0    pypi
tensorboard-data-server   0.6.1                    pypi_0    pypi
tensorboard-plugin-wit    1.8.0                    pypi_0    pypi
tensorflow                2.7.0                    pypi_0    pypi
tensorflow-estimator      2.7.0                    pypi_0    pypi
tensorflow-io-gcs-filesystem 0.22.0                   pypi_0    pypi
termcolor                 1.1.0                    pypi_0    pypi
tomli                     1.2.2                    pypi_0    pypi
typing-extensions         4.0.1                    pypi_0    pypi
tzdata                    2021e                hda174b7_0    http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
urllib3                   1.26.7                   pypi_0    pypi
vc                        14.2                 h21ff451_1    http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
vs2015_runtime            14.27.29016          h5e58377_2    http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
werkzeug                  2.0.2                    pypi_0    pypi
wheel                     0.37.0             pyhd3eb1b0_1    http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
wincertstore              0.2              py39haa95532_2    http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
wrapt                     1.13.3                   pypi_0    pypi
zipp                      3.6.0                    pypi_0    pypi

在这里插入图片描述

I)在 Keras 编码中,反卷积的实现代码便是卷积操作,具体解释详见上述博
客。https://blog.csdn.net/quiet_girl/article/details/84579038 。
ii)UpSampling2D()实现的是反平均卷积的操作。
iii) autoencoder.summary()如下:

o enable them in other operations, rebuild TensorFlow with the appropriate compiler fl
Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #
=================================================================
 input_1 (InputLayer)        [(None, 28, 28, 1)]       0

 conv2d (Conv2D)             (None, 28, 28, 16)        160

 max_pooling2d (MaxPooling2D  (None, 14, 14, 16)       0
 )

 conv2d_1 (Conv2D)           (None, 14, 14, 8)         1160

 max_pooling2d_1 (MaxPooling  (None, 7, 7, 8)          0
 2D)

 conv2d_2 (Conv2D)           (None, 7, 7, 8)           584

 up_sampling2d (UpSampling2D  (None, 14, 14, 8)        0
 )

 conv2d_3 (Conv2D)           (None, 14, 14, 16)        1168

 up_sampling2d_1 (UpSampling  (None, 28, 28, 16)       0
 2D)

 conv2d_4 (Conv2D)           (None, 28, 28, 1)         145

=================================================================
Total params: 3,217
Trainable params: 3,217
Non-trainable params: 0
Non-trainable params: 0
_________________________________________________________________
Epoch 1/20                                                            

在这里插入图片描述

整体程序如下

# python3
# -*- coding: utf-8 -*-
# @Author  : ziyue
# @Time    : 2021 12 10
"""
Convolutional Autoencoder.
"""
import numpy as np

from keras.datasets import mnist
from keras.models import Model
from keras.layers import Conv2D, MaxPool2D,Input, UpSampling2D
import matplotlib.pyplot as plt

np.random.seed(33)   # random seed,to reproduce results.



def train(x_train):
    """
    build autoencoder.
    :param x_train:  the train data
    :return: encoder and decoder
    """
    # input placeholder
    input_image = Input(shape=(28, 28, 1))

    # encoding layer
    x = Conv2D(CHANNEL_1, (3, 3), activation='relu', padding="same")(input_image)
    x = MaxPool2D((2, 2), padding='same')(x)
    x = Conv2D(CHANNEL_2, (3, 3), activation='relu', padding='same')(x)
    encoded = MaxPool2D((2, 2), padding='same')(x)

    # decoding layer
    x = Conv2D(CHANNEL_2, (3, 3), activation='relu', padding='same')(encoded)
    x = UpSampling2D((2, 2))(x)
    x = Conv2D(CHANNEL_1, (3, 3),activation='relu', padding='same')(x)
    x = UpSampling2D((2, 2))(x)
    decoded = Conv2D(CHANNEL_OUTPUT, (3, 3), activation='sigmoid', padding='same')(x)

    # build autoencoder, encoder, decoder
    autoencoder = Model(inputs=input_image, outputs=decoded)
    encoder = Model(inputs=input_image, outputs=encoded)

    # compile autoencoder
    autoencoder.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

    autoencoder.summary()

    # training
    # need return history, otherwise can not use history["acc"]
    history_record = autoencoder.fit(x_train, x_train, epochs=EPOCHS, batch_size=BATCH_SIZE, shuffle=True, )

    return encoder, autoencoder, history_record

def plot_accuray(history_record):
    """
    plot the accuracy and loss line.
    :param history_record:
    :return:
    """
    accuracy = history_record.history["accuracy"]
    loss = history_record.history["loss"]
    epochs = range(len(accuracy))
    plt.plot(epochs, accuracy, 'bo', label='Training accuracy')
    plt.title('Training accuracy')
    plt.legend()
    plt.figure()
    plt.plot(epochs, loss, 'bo', label='Training loss')
    plt.title('Training loss')
    plt.legend()
    plt.show()

def show_images(decode_images, x_test):
    """
    plot the images.
    :param decode_images: the images after decoding
    :param x_test: testing data
    :return:
    """
    n = 10
    plt.figure(figsize=(20, 4))
    for i in range(n):
        ax = plt.subplot(2, n, i+1)
        ax.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)
        ax.imshow(decode_images[i].reshape(28, 28))
        plt.gray()
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)
    plt.show()



if __name__ == '__main__':
    CHANNEL_1 = 16
    CHANNEL_2 = 8
    CHANNEL_OUTPUT = 1
    EPOCHS = 1
    BATCH_SIZE = 64
    # Step1: load data  x_train: (60000, 28, 28), y_train: (60000,) x_test: (10000, 28, 28), y_test: (10000,)
    (x_train, y_train), (x_test, y_test) = mnist.load_data()

    # Step2: normalize
    x_train = x_train.astype('float32') / 255.
    x_test = x_test.astype('float32') / 255.

    # Step3: reshape data, x_train: (60000, 28, 28, 1), x_test: (10000, 28, 28, 1), one row denotes one sample.
    x_train = x_train.reshape((x_train.shape[0], 28, 28, 1))
    x_test = x_test.reshape((x_test.shape[0], 28, 28, 1))

    # Step4: train
    encoder, autoencoder, history_record = train(x_train=x_train)

    # show images
    decode_images = autoencoder.predict(x_test)
    show_images(decode_images, x_test)
    plot_accuray(history_record)




论文名称:Stacked Convolutional Auto-Encoders for
Hierarchical Feature Extraction

论文地址:https://people.idsia.ch//~ciresan/data/icann2011.pdf
摘要:

我们提出了一种新颖的卷积自动编码器(CAE),用于 无监督特征学习。一堆 CAE 形成一个卷积 神经网络(CNN)。每个 CAE 都使用传统的在线训练 没有额外的正则化项的梯度下降。最大池化 层对于学习生物学上合理的特征是必不可少的 以前的方法发现的那些。用 a 的过滤器初始化 CNN 训练有素的 CAE 堆栈在数字 (MNIST) 和 对象识别 (CIFAR10) 基准。

介绍:

无监督学习方法的主要目的是从未标记的数据中提取普遍有用的特征,检测和去除输入冗余,以及
仅保留数据的基本方面以稳健和有区别的表示。无监督方法已在许多科学中常规使用和工业应用。在神经网络架构的背景下,无监督层可以相互堆叠以构建深层层次结构[7]。输入层激活被馈送到第一层,它馈送下一层,并且
依此类推,对于层次结构中的所有层。可以训练深度架构无监督的逐层时尚,然后通过反向传播进行微调以成为分类器 [9]。无监督初始化倾向于避免局部最小值和提高网络的性能稳定性[6]。

3 卷积自编码器 (CAE) 全连接 AE 和 DAE 都忽略了 2D 图像结构。这不是 只是在处理实际大小的输入时出现问题,而且还引入了 参数中的冗余,迫使每个特征都是全局的(即跨越 整个视野)。然而,视觉和物体识别的趋势采用 最成功的模型 [17,25] 是发现在整个输入中重复的局部特征。 CAE 与传统 AE 的不同之处在于它们的 权重在输入中的所有位置之间共享,从而保持空间局部性。 因此重建是由于基本图像块的线性组合 基于潜在代码。

在这里插入图片描述

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

结论
我们介绍了卷积自动编码器,这是一种用于分层特征提取的无监督方法。它学习生物学上合理的过滤器。一个CNN可以由 CAE 堆栈初始化。虽然 CAE 的过完备隐藏表示使学习比标准自动编码器更难,但好的过滤器
如果我们使用最大池化层,就会出现,这是一种强制执行稀疏代码的优雅方式无需通过反复试验设置任何正则化参数。预训练CNN 的性能往往略胜于随机初始化的网络,但始终如一。我们的 CIFAR10 结果是任何在原始数据上训练的无监督方法的最佳结果数据,并接近该基准测试的最佳发布结果.

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,我们需要导入必要的库和数据集。在这里,我们将使用“airquality”数据集来进行图像回归。 ```R library(keras) library(tensorflow) library(dplyr) data("airquality") ``` 接下来,我们需要对数据集进行预处理。由于卷积神经网络需要的输入是图像,因此我们需要将数据集转换为图像。我们可以使用ggplot2库将数据可视化为图像。 ```R library(ggplot2) airquality %>% ggplot(aes(x=Month, y=Day, fill=Ozone)) + geom_tile() + scale_fill_gradient(low="white", high="blue") + theme_void() -> img img <- as.raster(print(img, vp=viewport(width=4, height=4, units="in", clip="on"))) img <- image_to_matrix(img)[,,1] ``` 在这里,我们将“airquality”数据集中的“Month”和“Day”作为图像的横纵坐标,将“Ozone”作为图像的颜色填充。然后,我们使用ggplot2库的“geom_tile”函数将数据可视化为热力图。接下来,我们使用“scale_fill_gradient”函数将颜色映射到白色到蓝色的颜色范围内。最后,我们使用“as.raster”函数将图像转换为光栅图像,并使用“image_to_matrix”函数将其转换为图像矩阵。在这里,我们只使用了R中的一个数据点来生成图像矩阵,但是在实际应用中,我们需要对整个数据集进行相同的操作。 接下来,我们将使用“image_data_generator”函数来生成训练数据和测试数据。在这里,我们将使用5个折叠来进行k折交叉验证。 ```R n_fold <- 5 batch_size <- 16 train_datagen <- image_data_generator( rescale = 1/255, validation_split = 1/n_fold ) train_generator <- flow_images_from_data( img_array = img, generator = train_datagen, batch_size = batch_size, shuffle = TRUE, subset = "training" ) validation_generator <- flow_images_from_data( img_array = img, generator = train_datagen, batch_size = batch_size, shuffle = TRUE, subset = "validation" ) ``` 在这里,我们使用“rescale”参数将图像像素值的范围从0到255缩放到0到1之间。然后,我们使用“validation_split”参数将数据集分成训练集和验证集。接下来,我们使用“flow_images_from_data”函数将数据集转换为可以用于训练的数据生成器。 接下来,我们将定义一个卷积神经网络模型。在这里,我们将使用一个包含3个卷积层和3个池化层的模型。 ```R model <- keras_model_sequential() %>% layer_conv_2d(filters = 32, kernel_size = c(3, 3), activation = "relu", input_shape = dim(img)) %>% layer_max_pooling_2d(pool_size = c(2, 2)) %>% layer_conv_2d(filters = 64, kernel_size = c(3, 3), activation = "relu") %>% layer_max_pooling_2d(pool_size = c(2, 2)) %>% layer_conv_2d(filters = 128, kernel_size = c(3, 3), activation = "relu") %>% layer_max_pooling_2d(pool_size = c(2, 2)) %>% layer_flatten() %>% layer_dense(units = 128, activation = "relu") %>% layer_dropout(rate = 0.5) %>% layer_dense(units = 1, activation = "linear") summary(model) ``` 在这里,我们使用“keras_model_sequential”函数创建了一个序列模型。然后,我们使用“layer_conv_2d”函数添加3个卷积层和“layer_max_pooling_2d”函数添加3个池化层。接下来,我们使用“layer_flatten”函数将卷积层的输出展平,并使用“layer_dense”函数添加2个全连接层。最后,我们使用“layer_dropout”函数添加一个dropout层,并使用“layer_dense”函数添加一个输出层。 在定义好模型后,我们需要编译模型并训练模型。 ```R model %>% compile( optimizer = optimizer_rmsprop(), loss = "mse", metrics = c("mae") ) history <- model %>% fit_generator( generator = train_generator, validation_data = validation_generator, steps_per_epoch = 50, epochs = 10 ) ``` 在这里,我们使用“optimizer_rmsprop”函数作为优化器,并使用“mse”作为损失函数。我们还使用“mae”作为度量指标。然后,我们使用“fit_generator”函数训练模型。在这里,我们使用“train_generator”作为训练数据生成器,使用“validation_generator”作为验证数据生成器,使用“steps_per_epoch”参数指定每个epoch中使用的训练步数,使用“epochs”参数指定训练的epoch数。 最后,我们可以使用“evaluate_generator”函数评估模型的性能。 ```R model %>% evaluate_generator( generator = validation_generator, steps = 50 ) ``` 在这里,我们使用“validation_generator”作为验证数据生成器,并使用“steps”参数指定评估模型时使用的步数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高山仰止景

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值