关于#WGAN#的问题,如何解决?

在梯度惩罚项函数中,参数alpha的维度到底是多少,我看了很多都是alpha直接alpha=expand(real.size()),但是在我这边出现了这样的报错!
The expanded size of the tensor (64) must match the existing size (32) at non-singleton dimension 2. Target sizes: [32, 1, 64, 64]. Tensor sizes: [32, 1]

在梯度惩罚项函数中,参数 alpha 的维度应该是和实际输出的维度相同。在常见的深度学习框架中(如 PyTorch 和 TensorFlow),通常使用 expand() 函数来扩展张量的维度。但是,在使用 expand() 函数时需要注意以下几点:

扩展后的形状必须符合原始张量形状的 broadcasting 要求。简单来说,就是如果张量 A 的形状为 (3, 1),而要将其扩展成 (3, 2),那么扩展后的张量 B 的形状必须是 (3, 2),而不是 (2, 1)。

expand() 函数会返回一个新的张量,因此需要将扩展后的张量重新赋值给原始张量。

在 expand() 函数中,可以通过指定 -1 来自动计算某个维度的大小。

下面是一个 PyTorch 中使用 expand() 函数来扩展张量的示例代码:
import torch

原始张量的形状为 (32, 1)

real = torch.randn(32, 1)

将 alpha 扩展成 (32, 1, 64, 64)

alpha = torch.zeros(32, 1, 1, 1).expand(-1, -1, 64, 64)
在上面的示例中,我们首先创建了一个形状为 (32, 1) 的张量 real,然后使用 expand() 函数将其扩展成 (32, 1, 64, 64)。其中,-1 表示自动计算某个维度的大小,而 -1, -1, 64, 64 则表示将 real 张量的第二维扩展成 alpha 张量的第三、四维。这样,就可以将扩展后的张量重新赋值给 alpha 变量,并在梯度惩罚项函数中使用了。

如果您仍然遇到维度不匹配的问题,请检查一下输入张量和输出张量的形状是否正确,并确保使用 expand() 函数时按照上述建议进行操作。

从报错信息来看,你尝试将一个大小为[32,1]的张量进行扩展,但是扩展后的大小为[32,1,64,64],其中第三维扩展了64倍。这导致在第三维上的大小不匹配。

通常,在梯度惩罚项函数中,参数alpha应该是一个标量或者一个与模型所有可训练参数形状相同的张量。如果使用expand()函数对它进行扩展,则应该根据特定的情况对其进行调整,并确保其形状与受惩罚的参数形状相同。

在你遇到的错误中,可以看出你正在处理的实数张量的维度是[32, 1, 64, 64],因此你需要选择正确的维度大小以匹配它们。如果希望将alpha参数应用于此张量,请确保对其进行扩展时,只在长度为3 的最后一维上进行扩展,例如: alpha = torch.ones((1, 1, 64, 64)).