You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改PyTorch GAN生成器以输出256×64的语音数据?

生成256×64语音数据的条件GAN生成器修改方案

核心结论

  1. 卷积层不需要是正方形:完全支持处理矩形维度(如256×64),只需调整转置卷积的kernel_size、stride、padding参数来匹配目标尺寸。
  2. 优先调整ConvTranspose2d参数:这是最优方案,能保留语音数据的时序/空间关联性;添加线性层会丢失局部结构,不推荐。

具体修改步骤

原MNIST生成器通过多次转置卷积将1×1的噪声映射到64×64图像,现在需要输出256×64,只需在网络末尾增加针对目标维度(比如高度)的上采样层,或调整中间层的转置卷积参数,让其中一个维度的缩放倍数更高。

以下是修改后的生成器代码:

import torch
import torch.nn as nn

class Generator(nn.Module):
    def __init__(self, channels_noise, channels_img, features_g, num_classes, x1_size, x2_size, embed_size, device):
        super(Generator, self).__init__()
        self.device = device
        self.net = nn.Sequential(
            # Input: N x (channels_noise + embed_size) x 1 x 1
            self._block(channels_noise + embed_size, features_g * 16, 4, 1, 0),  # 输出: 4x4
            self._block(features_g * 16, features_g * 8, 4, 2, 1),  # 输出: 8x8
            self._block(features_g * 8, features_g * 4, 4, 2, 1),  # 输出: 16x16
            self._block(features_g * 4, features_g * 2, 4, 2, 1),  # 输出: 32x32
            self._block(features_g * 2, features_g, 4, 2, 1),  # 输出: 64x64(宽度已达目标64)
            # 新增层:仅对高度上采样,宽度保持64
            self._block(features_g, features_g // 2, (4, 1), (2, 1), (1, 0)),  # 输出: 128x64
            # 最终转置卷积得到256x64
            nn.ConvTranspose2d(
                features_g // 2, channels_img, kernel_size=(4, 1), stride=(2, 1), padding=(1, 0)
            ),
            nn.Tanh(),
        )
        self.embed = nn.Embedding(num_classes, embed_size)

    def _block(self, in_channels, out_channels, kernel_size, stride, padding):
        return nn.Sequential(
            nn.ConvTranspose2d(
                in_channels, out_channels, kernel_size, stride, padding, bias=False,
            ),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(),
        )

    def forward(self, x, labels):
        embedding = self.embed(labels).unsqueeze(2).unsqueeze(3).to(self.device)
        x = torch.cat([x, embedding], dim=1) 
        return self.net(x).to(self.device)

修改说明

  • 前5层转置卷积保持和原模型一致,将输入映射到64×64的特征图(宽度匹配目标的64)。
  • 新增的两层转置卷积使用元组形式的参数:kernel_size=(4,1)、stride=(2,1)、padding=(1,0),仅在高度方向上做2倍上采样,宽度维持64不变,最终输出256×64的结果。
  • 修正了原代码中重复赋值self.x1_size = x1_size的冗余问题,新增device参数统一管理设备。

为什么不推荐线性层

如果用线性层,需要先将卷积层输出的特征图flatten成一维向量,再通过线性层映射到256*64的维度,最后reshape成256×64。这种方式会破坏语音数据的时序连续性(比如相邻时间步的特征关联),导致生成的语音质量下降,因此不建议使用。

内容的提问来源于stack exchange,提问作者Conweezy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:35:27