首页 > 编程问答 >CVAE 合成数据分布过于狭窄

CVAE 合成数据分布过于狭窄

时间:2024-07-30 14:01:59浏览次数:7  
标签:python machine-learning deep-learning neural-network autoencoder

我有一个数据集,其中包含 3 个特征、2 个浮点特征和 1 个包含 33 个类别的分类特征。 (此处称为 Float_A、Float_B 和 Cat_A)。

我正在尝试训练 CVAE 来生成合成数据。数据使用以下 sklearn 转换器进行转换:

df=df[["float_A","float_B","categorical_A"]]

transformers=[('float_A',Pipeline(steps=[('imputer',SimpleImputer(strategy='mean',add_indicator=True)),
('scaler',RobustScaler(quantile_range=(5,95)))]),
['float_A']),
('float_B',
Pipeline(steps=[('imputer',SimpleImputer(strategy='mean',add_indicator=True)),
('scaler',MinMaxScaler())]),
['float_B']),
('cats',OneHotEncoder(),categorical_columns)]`

transformer=ColumnTransformer(transformers,remainder='passthrough')

transformed_df=transformer.fit_transform(df)

我的第二个浮点数有一个 sigmoid 激活函数,其声明如下:

`Def sample(self,z):
reconstructed=self.decoder(z)
#Apply sigmoid activation to the float feature.
reconstructed[:,self.float_B_idx]=torch.sigmoid(reconstructed[:,self.float_B_idx])
returnreconstructed

Def forward(self,x):
z_mean,z_log_var=torch.chunk(self.encoder(x),2,dim=1)
z=self.reparameterize(z_mean,z_log_var)
reconstructed=self.decoder(z)
#Apply sigmoid activation to the float feature.
reconstructed[:,self.float_B_idx]=torch.sigmoid(reconstructed[:,self.float_B_idx])
return reconstructed,z_mean,z_log_var`

一旦 CVAE 被训练,(训练和验证损失似乎会减少,因为它们应该) ),我尝试使用以下命令生成随机样本:

random_latent_vectors=torch.randn(num_samples,latent_dim)

with torch.no_grad():
gen_df=model.sample(random_latent_vectors).detach().cpu().numpy()

但是 gen_df 中的所有样本都非常“未扩散”。

FloatA, FloatB, Cat[0:2]…

[[0.11782782 0.286538 0.646666 0.266387 0.09747571]
[0.0963359 0.29775462 0.58443785 0.29296008 0.1101962]
[0.1300626 0.31274286 0.59086925 0.30710378 0.10169853]
[0.1232817 0.32317564 0.56470346 0.29102385 0.11446829]
[0.13240162 0.28100765 0.6230704 0.29497638 0.08924796]]

然后,当我在 gen_df 上调用 scaler.inverse_transform 时,我实际上得到了所有相同的结果每行。

我尝试了各种方法,其中一个类别非常占主导地位(~90%),因此使用 imblearn 进行了一些类别不平衡欠采样,使其只有 50% 占主导地位,但仍然获得 100% 的样本。

我尝试向我的 CVAE 添加更多层和复杂性,但再次被证明是徒劳的。


听起来的 CVAE 模型正在生成崩溃,这意味着它生成的数据缺乏多样性,并且在的例子中过于集中在输入空间的狭窄范围内。这在 CVAE 中是一个常见问题,有几个潜在的原因和解决方案需要考虑:

可能的原因和解决方案:

  1. 潜在空间维度:
  2. 问题: 如果潜在空间(即从中采样随机向量以生成数据的空间)的维度太小,模型可能没有足够的容量来编码数据中所有必要的变化。
  3. 解决方案: 尝试增加潜在空间的维度。这将为模型提供更多空间来表示数据的不同方面。

  4. KL 散度损失加权:

  5. 问题: CVAE 中的损失函数有两个组成部分:重建损失(鼓励模型生成类似于输入的数据)和 KL 散度损失(鼓励潜在空间遵循正态分布)。如果 KL 散度损失的权重相对于重建损失过高,则模型可能会优先使潜在空间正则化,从而牺牲数据多样性。
  6. 解决方案: 尝试降低 KL 散度损失的权重。这可以通过引入一个超参数 β 来实现,该参数乘以 KL 散度损失项。降低 β 会降低 KL 散度损失的影响,从而可能导致更多样化的生成数据。

  7. 模型容量和架构:

  8. 问题: 如果的编码器和/或解码器网络过于简单或容量不足,它们可能无法充分学习数据分布的复杂性。
  9. 解决方案: 尝试向编码器和解码器网络添加更多层或神经元。还可以尝试使用更具表现力的架构,例如使用卷积层来处理图像数据或使用递归层来处理顺序数据。

  10. 训练数据:

  11. 问题: 如果的训练数据量有限或类别分布不平衡,则模型可能难以学习真实数据分布。
  12. 解决方案: 如果可能,请收集更多训练数据。对于类别不平衡,可以尝试使用数据增强技术或对少数类别进行过采样来平衡类别分布。尝试过的类别不平衡欠采样也是一种有效的方法。

  13. 激活函数:

  14. 问题: 虽然对第二个浮点特征使用 sigmoid 激活函数是合理的,但这可能会限制生成数据的范围,尤其是在解码器中没有使用适当的缩放或偏移的情况下。
  15. 解决方案: 确保解码器的最终输出层中的激活函数和任何缩放操作与输入数据预处理相匹配。例如,如果在预处理期间使用 MinMaxScaler 将第二个浮点特征缩放到 [0, 1] 范围,则使用 sigmoid 激活函数并将输出缩放到原始范围是有意义的。

  16. 超参数调整:

  17. 问题: 学习率、批大小和其他超参数等训练超参数也会影响模型的性能及其生成数据的能力。
  18. 解决方案: 尝试使用不同的超参数组合,例如使用网格搜索或随机搜索等技术。

调试技巧:

  • 可视化潜在空间: 通过将潜在空间表示(即编码器输出)降维到两个维度来可视化,例如使用 t-SNE 或 PCA。这可以帮助了解潜在空间是否被充分利用以及数据点在潜在空间中的分布情况。
  • 检查重建: 从训练数据和生成数据中可视化重建样本。这可以帮助确定模型是否难以重建某些特征或数据点的某些方面。
  • 监控训练进度: 密切关注训练过程中重建损失和 KL 散度损失。如果 KL 散度损失迅速下降到接近于零的值,则可能表明模型正在崩溃。

其他提示:

  • 考虑尝试使用其他生成模型,例如生成对抗网络 (GAN),它们在生成多样化和逼真的数据方面可能更有效。
  • 查阅有关 CVAE 崩溃的文献和资源,以获取更多见解和解决方案。

请记住,构建和训练生成模型可能具有挑战性,通常需要大量的实验和微调才能获得令人满意的结果。

标签:python,machine-learning,deep-learning,neural-network,autoencoder
From: 78809995

相关文章

  • python之代码简化式(列表、字典生成式,递归函数,迭代器(iter)和生成器(yield)、匿名函数(
    文章目录前言1、列表、字典生成式2、递归函数2.1python中代码的递归深度(扩展)3、拓展:迭代器和生成器3.1迭代器(iter)3.2生成器(yield)4、匿名函数(lambda)4.1map函数4.2reduce函数(较少使用)4.3filter函数前言本文主要讲解一些简化代码格式的一些方法,方便大家更好的......
  • Python:在 Protocol 和 TypedDict 之间共享类型注释
    举这个简单的例子:from__future__importannotationsimporttypingastclassMyType:def__init__(self,s:str,i:int)->None:self.s=sself.i=iclassMyProto(t.Protocol):s:stri:intclassMyDict(t.TypedDict):......
  • PIL 和 python 静态类型
    我有一个函数参数,它可以接受图像的多种类型:defsomefunc(img:Union[np.array,Image,Path,str]):PILImage在这种情况下抛出以下异常:TypeError:Union[arg,...]:eachargmustbeatype.Got<module'PIL.Image'from...进一步检查图像对象后这才有......
  • 学会用Python爬取小说网站,想看什么就爬什么,广告也不用看了~
    今天以爬取笔趣阁小说网站为例,练习Python爬虫技术。通过这个爬虫,可以完成批量爬取一本小说的所有章节,并将所有章节内容按顺序保存到一个txt文档内,下面我们就开始吧。首先,百度搜索“笔趣阁”,发现有很多网站都叫笔趣阁。我们可以随便挑选一个网站尝试,本文我以‘https://......
  • 计算机毕业设计django+vue《Python数据分析》的教学系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今数字化时代,数据分析已成为各行各业不可或缺的技能之一,而Python作为数据分析领域的首选语言,其重要性日益凸显。然而,传统的教学模式在......
  • 如何将多个变量分配给 python 函数中的单个参数?
    我正在尝试编写一个程序,如果可能的话,它需要一个三项式并对其进行因式分解。每当用户输入A、B和C时,三项式应该通过Factor(product,summation)函数获取,但我似乎无法弄清楚如何将A和C分配给乘积arg,将B分配给我尝试在函数外部声明不同的变量,product=(a*c)和summati......
  • python - 从文本生成音乐
    请给我一些建议为了解释一下,我输入“深度睡眠的睡眠音乐”,它将返回一个wav文件:https://www.youtube.com/watch?v=1wAdQhFJy54或者我给出一个wav文件,它会返回相同的现在这是我尝试过的:https://github.com/facebookresearch/audiocraft......
  • 从零开始的Python开发日记(7):短信验证功能开发流程
    短信验证功能开发流程在开发一个包含登录、注册以及短信验证的功能时,你需要遵循一个系统的开发流程。以下是实现这一功能的基本步骤,包括所需的技术和代码示例。1.环境配置首先,确保你的开发环境已经配置好,并安装了必要的库和工具。pipinstallfastapiuvicornsqlalche......
  • 【Python数值分析】革命:引领【数学建模】新时代的插值与拟合前沿技术
    目录​编辑第一部分:插值的基本原理及应用1.插值的基本原理1.1插值多项式1.2拉格朗日插值 1.3牛顿插值 1.4样条插值2.插值的Python实现2.1使用NumPy进行插值2.2使用SciPy进行插值2.2.1一维插值​编辑2.2.2二维插值3.插值的应用场景3.1数据平......
  • 在家用电脑上设置 Python 和 Jupyter,尝试打开 Jupyter 笔记本并显示错误,无法获取
    我有最新的Python版本3.12.4和以下版本的Jupyter:SelectedJupytercorepackages...IPython:8.26.0ipykernel:6.29.5ipywidgets:notinstalledjupyter_client:8.6.2jupyter_core:5.7.2jupyter_server:2.14.2jupyterlab......