Machine learning 如何防止简单的keras自动编码器过度压缩数据?

Machine learning 如何防止简单的keras自动编码器过度压缩数据?,machine-learning,tensorflow,neural-network,keras,autoencoder,Machine Learning,Tensorflow,Neural Network,Keras,Autoencoder,我正在尝试使用keras前端和tensorflow后端来实现一个简单的autoencoder作为多维缩放技术,将多维数据绘制成二维。很多时候,当我运行它时(不确定如何为kerasbtw设置随机种子),其中一个维度被折叠以产生一维嵌入(该图应该有助于解释)。为什么会这样我如何确保尺寸被自动编码器保留和利用?我意识到这是我实现的自动编码器最简单和最基本的形式,但我想在此基础上为这项任务制作更好的自动编码器 from sklearn.datasets import load_iris from skl

我正在尝试使用
keras
前端和
tensorflow
后端来实现一个简单的
autoencoder
作为多维缩放技术,将多维数据绘制成二维。很多时候,当我运行它时(不确定如何为
keras
btw设置随机种子),其中一个维度被折叠以产生一维嵌入(该图应该有助于解释)。为什么会这样我如何确保尺寸被自动编码器保留和利用?我意识到这是我实现的自动编码器最简单和最基本的形式,但我想在此基础上为这项任务制作更好的自动编码器

from sklearn.datasets import load_iris
from sklearn import model_selection
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Load data
X = load_iris().data
Y = pd.get_dummies(load_iris().target).as_matrix()
X_tr, X_te, Y_tr, Y_te = model_selection.train_test_split(X,Y, test_size=0.3, stratify=Y.argmax(axis=1))
dims = X_tr.shape[1]
n_classes = Y_tr.shape[1]

# Autoencoder
encoding_dim = 2  

# this is our input placeholder
input_data = tf.keras.Input(shape=(4,))

# "encoded" is the encoded representation of the input
encoded = tf.keras.layers.Dense(encoding_dim, 
                                activation='relu', 
                               )(input_data)
# "decoded" is the lossy reconstruction of the input
decoded = tf.keras.layers.Dense(4, activation='sigmoid')(encoded)

# this model maps an input to its reconstruction
autoencoder = tf.keras.models.Model(input_data, decoded)

# this model maps an input to its encoded representation
encoder = tf.keras.models.Model(input_data, encoded)

autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
network_training = autoencoder.fit(X_tr, X_tr,
                                    epochs=100,
                                    batch_size=5,
                                    shuffle=True,
                                    verbose=False,
                                    validation_data=(X_te, X_te))

# Plot data
embeddings = encoder.predict(X_te)
plt.scatter(embeddings[:,0], embeddings[:,1], c=Y_te.argmax(axis=1), edgecolor="black", linewidth=1)
运行算法一次

再次运行算法

你好,奥卡,我认为这里的情况是因为深度学习(特别是反向传播算法)是一个随机过程。这意味着每次你训练它,你都会得到不同的结果。在这种情况下,我认为在某些运行中,您成功地嵌入了数据,而在其他运行中,您的模型无法达到最佳性能。这是深度学习中的一个常见问题,也是计算机科学的一个开放问题(规范优化算法)。通常,你必须试着运行几次才能得到一个让你满意的模型。你的曲线图到底代表了什么?另外,两个图之间的轴单位(?)不一样(它们似乎翻转了?)是的,因为这是一个随机过程,所以它们看起来完全不同是有道理的,但我想知道我是否可以应用某种类型的参数或转换,以避免陷入局部极小值,从而使数据只适合瓶颈层中的一个神经元。轴显示了我的自动编码器的瓶颈层中嵌入的第一和第二维度。好的,你有代码来训练完整的自动编码模型。你能展示代码的其余部分吗?使用编码器(该模型的一半),添加层(密集和softmax)后训练,并使用压缩编码信息进行分类?顺便说一下。。。列车测试分割数据洗牌数据(内部)也在列车中重新洗牌。。。也许这是造成不同结果的主要原因。。。此外,在编码器/解码中添加更多层和使用relu可能有助于增强弹性(?)。我认为有特定于自动编码器的层类型(?)不确定。。。您正在使用密集层进行自动编码器。。。同时尝试使用不同的错误函数。。。而不是二进制交叉熵