深度学习 - 8.TF x Keras AutoEncoder 2D、3D 展示

一.引言:

AutoEncoder-自编码是神经网络中常见的无监督学习,其目的一般为提取原始目标中的关键信息,类似于降维与主成分分析,但又不完全相同,其原理是用输入信息作为输出信息训练模型,最终提取中间的关键信息作为输入信息的抽象表达。

二.实现:

导入依赖:

import numpy as np
import matplotlib.pyplot as plt

from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Input

1.数据准备

这里采用常见的mnist手写数字识别数据作为输入信息,x_train是60000x28x28的原始数据,这里先做数据归一化,然后通过reshape转换为60000 x 784的数据形式

    (x_train, x_test), (x_test, y_test) = mnist.load_data()

    # 1.简单归一处理
    x_train = x_train.astype('float32') / 255.
    x_test = x_test.astype('float32') / 255.

    x_train = x_train.reshape((x_train.shape[0], -1))
    x_test = x_test.reshape((x_test.shape[0], -1))
    print(x_train.shape)
    print(x_test.shape)

2.定义压缩维度

    encoding_dim = 2

3.定义AutoEncoder模型并训练

输入层的784根据上面准备数据(60000x784)而来,模型分为两个部分,编码层进行信息压缩,将原始图像数据抽象到 encoding_dim 的维度,随后解码层根据抽象的编码进行解压重新获取 784维的向量。自编码的精髓就是用自己学习自己,但最终一般只留下编码层,因为编码层可以根据给定数据对原始数据做出抽象。所以自编码模型autoencoder的输出是解码得到的最终784维的结果,而编码层则只保留了 encoding_dim 的输出。

    input_img = Input(shape=(784,))

    # 编码层
    encoded = Dense(128, activation='relu')(input_img)
    encoded = Dense(64, activation='relu')(encoded)
    encoded = Dense(10, activation='relu')(encoded)
    encoder_output = Dense(encoding_dim)(encoded)

    # 解码层
    decoded = Dense(10, activation='relu')(encoder_output)
    decoded = Dense(64, activation='relu')(decoded)
    decoded = Dense(128, activation='relu')(decoded)
    decoded = Dense(784, activation='relu')(decoded)

    # 构建自编码模型
    autoencoder = Model(inputs=input_img, outputs=decoded)

    # 构建编码模型
    encoder = Model(inputs=input_img, outputs=encoder_output)

    # 编译模型
    autoencoder.compile(optimizer='rmsprop', loss='mse')

    # 训练模型
    autoencoder.fit(x_train, x_train, epochs=20, batch_size=256, shuffle=True)

4.查看自编码器对数据的抽象能力

    # 2D绘图
    encoded_imgs = encoder.predict(x_test)
    print(encoded_imgs.shape,x_test.shape,y_test.shape)
    plt.scatter(encoded_imgs[:, 0], encoded_imgs[:, 1], c=y_test, s=3)
    plt.title("Dim=2")
    plt.colorbar()
    plt.show()

 eoncoding_dim为2时,可以看到模型具备一定对数据的分类能力

CSDN-BITDDD

5.查看3D情况下模型的信息提取能力

    fig = plt.figure()
    ax = fig.gca(projection='3d')
    # ax = fig.add_subplot(111, projection='3d')
    ax.scatter(encoded_imgs[:, 0], encoded_imgs[:, 1], encoded_imgs[:, 2], c=y_test, s=3, alpha=0.5)

    plt.show()

encoding_dim改为3时,可以看到混在一起的点变少了,因为模型有更多的维度去学习和表达

CSDN-BITDDD

三.总结:

AutoEncoder算是深度学习入门的基础算法, 通过编码层实现了对原始输入信息的压缩或者说是精炼。除了调整 encoding_dim,编码层解码层的激活函数,是否添加正则化系数 ergularizers 以及优化器和损失函数都可以进行调整,通过不同参数可以看到图像不同的映射趋势,只不过更高维的数据很难直观的观察。

更多推荐算法相关深度学习:深度学习导读专栏 

以下是几个常用的深度学习模型在Python中的示例代码,用于信号识别分类任务: 1. 卷积神经网络(CNN): ```python import tensorflow as tf model = tf.keras.Sequential([ tf.keras.layers.Conv1D(filters=32, kernel_size=3, activation='relu', input_shape=(input_shape)), tf.keras.layers.MaxPooling1D(pool_size=2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(units=64, activation='relu'), tf.keras.layers.Dense(units=num_classes, activation='softmax') ]) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=10, batch_size=32) ``` 2. 循环神经网络(RNN): ```python import tensorflow as tf model = tf.keras.Sequential([ tf.keras.layers.SimpleRNN(units=64, input_shape=(input_shape)), tf.keras.layers.Dense(units=num_classes, activation='softmax') ]) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=10, batch_size=32) ``` 3. 自编码器(Autoencoder): ```python import tensorflow as tf input_img = tf.keras.layers.Input(shape=(input_shape,)) encoded = tf.keras.layers.Dense(units=128, activation='relu')(input_img) decoded = tf.keras.layers.Dense(units=input_shape, activation='sigmoid')(encoded) autoencoder = tf.keras.models.Model(input_img, decoded) autoencoder.compile(optimizer='adam', loss='binary_crossentropy') autoencoder.fit(x_train, x_train, epochs=10, batch_size=32) ``` 4. 转移学习模型(使用预训练的CNN模型): ```python import tensorflow as tf base_model = tf.keras.applications.MobileNetV2(weights='imagenet', include_top=False, input_shape=(input_shape)) x = base_model.output x = tf.keras.layers.GlobalAveragePooling2D()(x) predictions = tf.keras.layers.Dense(num_classes, activation='softmax')(x) model = tf.keras.models.Model(inputs=base_model.input, outputs=predictions) for layer in base_model.layers: layer.trainable = False model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=10, batch_size=32) ``` 这些示例代码使用了常见的深度学习库(如TensorFlowKeras),并且根据具体的模型类型和任务需求进行了相应的配置。你可以根据自己的数据和任务特点,调整代码中的参数和网络结构,以满足你的信号识别分类需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BIT_666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值