展开

Deep Autoencoder

最后发布时间 : 2023-10-18 22:02:03 浏览量 :

学习资料

生信小木屋

自编码器是一种特殊类型的神经网络,它被训练成将输入复制到输出。例如,给定一张手写数字的图像,自编码器首先将图像编码为较低维度的潜在表示,然后将潜在表示解码回图像。自编码器通过最小化重构误差来学习压缩数据。

要了解有关自编码器的更多信息,请考虑阅读《深度学习》的第14章。

导入TensorFlow和其他库

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

from sklearn.metrics import accuracy_score, precision_score, recall_score
from sklearn.model_selection import train_test_split
from tensorflow.keras import layers, losses
from tensorflow.keras.datasets import fashion_mnist
from tensorflow.keras.models import Model

加载数据

(x_train, _), (x_test, _) = fashion_mnist.load_data()

x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.

print (x_train.shape)
print (x_test.shape)
(60000, 28, 28)
(10000, 28, 28)

第一个例子: Basic autoencoder

生信小木屋

定义一个具有两个全连接层的自动编码器:一个编码器,将图像压缩为64维的潜在向量,和一个解码器,从潜在空间中重构原始图像。

# 定义Autoencoder类,继承Model类
class Autoencoder(Model):
  # 初始化函数,设置隐藏层的维度和输入的形状
  def __init__(self, latent_dim, shape):
    super(Autoencoder, self).__init__()
    self.latent_dim = latent_dim
    self.shape = shape
    # 定义编码层,将输入的形状转换为隐藏层的维度
    self.encoder = tf.keras.Sequential([
      layers.Flatten(),
      layers.Dense(latent_dim, activation='relu'),
    ])
    # 定义解码层,将隐藏层的维度转换为输入的形状
    self.decoder = tf.keras.Sequential([
      layers.Dense(tf.math.reduce_prod(shape), activation='sigmoid'),
      layers.Reshape(shape)
    ])

  # 调用函数,返回编码后的结果
  def call(self, x):
    encoded = self.encoder(x)
    decoded = self.decoder(encoded)
    return decoded


# 设置隐藏层的维度和输入的形状
shape = x_test.shape[1:]
latent_dim = 64
# 实例化Autoencoder类,定义自编码器
autoencoder = Autoencoder(latent_dim, shape)
# 编译自编码器,使用adam优化器,损失函数为MeanSquaredError
autoencoder.compile(optimizer='adam', loss=losses.MeanSquaredError())

定义一个具有两个全连接层的自动编码器:一个编码器,将图像压缩成64维的潜在向量,以及一个解码器,从潜在空间中重构原始图像。

使用x_train作为输入和目标训练模型。编码器将学习将数据集从784维压缩到潜在空间,解码器将学习重构原始图像。

# 训练自编码器
autoencoder.fit(x_train, x_train,
                epochs=10,
                shuffle=True,
                validation_data=(x_test, x_test))

现在模型已经训练完成,让我们通过对测试集中的图像进行编码和解码来进行测试。

# 测试自编码器
encoded_imgs = autoencoder.encoder(x_test).numpy()
decoded_imgs = autoencoder.decoder(encoded_imgs).numpy()
# 参数n表示显示的图片数量
n = 10
# 创建画布,大小为20*4
plt.figure(figsize=(20, 4))
# 遍历n次
for i in range(n):

  # 显示原始图片
  ax = plt.subplot(2, n, i + 1)
  plt.imshow(x_test[i])
  plt.title("original")
  plt.gray()
  # 隐藏x轴和y轴
  ax.get_xaxis().set_visible(False)
  ax.get_yaxis().set_visible(False)

  # 显示重构图片
  ax = plt.subplot(2, n, i + 1 + n)
  plt.imshow(decoded_imgs[i])
  plt.title("reconstructed")
  plt.gray()
  # 隐藏x轴和y轴
  ax.get_xaxis().set_visible(False)
  ax.get_yaxis().set_visible(False)
# 显示图片
plt.show()

生信小木屋

自动编码器在生物信息学中有许多应用。以下是一些常见的例子:
可以作为一种无监督聚类和可视化的降维方法,类似于主成分分析(PCA)

特征提取:自动编码器可以用于从生物信息学数据中提取有用的特征。例如,可以将基因表达数据作为输入,训练自动编码器来学习表示这些数据的低维编码。这些编码可以用于聚类分析、可视化和其他机器学习任务。

数据降维:生物信息学数据往往具有高维度,自动编码器可以用于将其降低到更低的维度,以便更好地可视化和分析数据。例如,可以将基因组数据或蛋白质结构数据输入自动编码器,然后将其压缩到较低的维度表示。

异常检测:自动编码器可以用于检测生物信息学数据中的异常或异常样本。通过训练自动编码器来学习正常数据的表示,可以使用它来重构新样本,并检测与正常样本有较大差异的样本。

序列生成:自动编码器可以用于生成具有与训练数据相似特征的新的生物信息学序列。例如,可以使用DNA序列作为输入,训练自动编码器来学习表示这些序列的低维编码,然后使用该编码来生成新的DNA序列。

噪声过滤:自动编码器可以用于去除生物信息学数据中的噪声。例如,在基因表达数据中,可以将有噪声的数据作为输入,训练自动编码器来学习去除噪声并重构干净的数据。

这些只是自动编码器在生物信息学中的一些应用示例。实际上,自动编码器在生物信息学的许多领域中都有广泛的应用,包括基因组学、蛋白质结构预测、药物发现等。