运行时错误:形状“[-1, 784]”对于大小为 614400 的输入无效

发布于 2025-01-16 04:04:20 字数 4404 浏览 3 评论 0原文

我正在练习实现“自动编码变量贝叶斯(VAE)”论文的代码。 但是,错误“RuntimeError:shape [16, 1, 28, 28] 对于大小为 37632 的输入无效”尚未解决。我不知道如何解决。请帮我。

EPOCHS = 50
BATCH_SIZE = 16
# Transformer code
transformer = transforms.Compose([
            transforms.Resize((28, 28)),
            transforms.ToTensor()
])

# Transform data
train_set = torchvision.datasets.ImageFolder(root = "/home/seclab_dahae/dahye/VAE_data", transform = transformer)
train_set, test_set = train_test_split(train_set, test_size=0.2)
print("Train size is {}, test size is {} ".format(len(train_set), len(test_set)))

#test_set = torchvision.datasets.ImageFolder(root = "/home/seclab_dahae/dahye/VAE_data", transform = transformer)

# Loading trainloader, testloader
trainloader = torch.utils.data.DataLoader(train_set, batch_size = BATCH_SIZE, shuffle = True, num_workers = 2)
testloader = torch.utils.data.DataLoader(test_set, batch_size = BATCH_SIZE, shuffle = True, num_workers = 2)

这是将我的数据带到 pytorch 的代码。

# VAE model
class VAE(nn.Module):
    def __init__(self, image_size, hidden_size_1, hidden_size_2, latent_size): #28*28, 512, 256, 2
        super(VAE, self).__init__()

        self.fc1 = nn.Linear(image_size, hidden_size_1)
        self.fc2 = nn.Linear(hidden_size_1, hidden_size_2)
        self.fc31 = nn.Linear(hidden_size_2, latent_size)
        self.fc32 = nn.Linear(hidden_size_2, latent_size)

        self.fc4 = nn.Linear(latent_size, hidden_size_2)
        self.fc5 = nn.Linear(hidden_size_2, hidden_size_1)
        self.fc6 = nn.Linear(hidden_size_1, image_size)

    def encode(self, x):
        h1 = F.relu(self.fc1(x))
        h2 = F.relu(self.fc2(h1))
        return self.fc31(h2), self.fc32(h2)

    def reparameterize(self, mu, logvar):
        std = torch.exp(0.5 * logvar)
        eps = torch.randn_like(std)
        return mu + std * eps

    def decode(self, z):
        h3 = F.relu(self.fc4(z))
        h4 = F.relu(self.fc5(h3))
        return torch.sigmoid(self.fc6(h4))

    def forward(self, x):
        mu, logvar = self.encode(x.view(-1, 784))
        z = self.reparameterize(mu, logvar)
        return self.decode(z), mu, logvar

VAE_model = VAE(28*28, 512, 256, 2).to(DEVICE)
optimizer = optim.Adam(VAE_model.parameters(), lr = 1e-3)

这是实现VAE模型的部分。

def loss_function(recon_x, x, mu, logvar):
    BCE = F.binary_cross_entropy(recon_x, x.view(-1, 784), reduction = 'sum')
    KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
    return BCE, KLD

这是实现损失函数的代码。

def train(epoch, model, train_loader, optimizer):
    model.train()
    train_loss = 0
    for batch_idx, (data, _) in enumerate(train_loader):
        data = data.to(DEVICE)
        optimizer.zero_grad()

        recon_batch, mu, logvar = model(data)

        BCE, KLD = loss_function(recon_batch, data, mu, logvar)

        loss = BCE + KLD

        loss.backward()

        train_loss += loss.item()

        optimizer.step()

        if batch_idx % 100 == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\t Loss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                100. * batch_idx / len(train_loader),
                loss.item() / len(data)))
            
    print("======> Epoch: {} Average loss: {:.4f}".format(
        epoch, train_loss / len(train_loader.dataset)
    ))  

def test(epoch, model, test_loader):
    model.eval()
    test_loss = 0
    with torch.no_grad():
        for batch_idx, (data, _) in enumerate(test_loader):
            data = data.to(DEVICE)
            
            recon_batch, mu, logvar = model(data)
            BCE, KLD = loss_function(recon_batch, data, mu, logvar)

            loss = BCE + KLD
            test_loss += loss.item()

            if batch_idx == 0:
                n = min(data.size(0), 8)
                comparison = torch.cat([data[:n], recon_batch.view(BATCH_SIZE, 1, 28, 28)[:n]]) # (16, 1, 28, 28)
                grid = torchvision.utils.make_grid(comparison.cpu()) # (3, 62, 242)

这是火车代码和测试代码。 Jupiter的错误发生在测试代码的“recon_batch.view(BATCH_SIZE, 1, 28, 28)[:n]”部分。

for epoch in tqdm(range(0, EPOCHS)):
    train(epoch, VAE_model, trainloader, optimizer)
    test(epoch, VAE_model, testloader)
    print("\n")
    latent_to_image(epoch, VAE_model)

最后,此代码是开始学习的触发器。 我该如何解决这个错误?

I'm practicing code that implements the "Auto-Encoding Variable Bayes (VAE)" paper.
However, the error "RuntimeError:shape [16, 1, 28, 28] is invalid for input of size 37632" has not been resolved. I don't know how to solve it. Please help me.

EPOCHS = 50
BATCH_SIZE = 16
# Transformer code
transformer = transforms.Compose([
            transforms.Resize((28, 28)),
            transforms.ToTensor()
])

# Transform data
train_set = torchvision.datasets.ImageFolder(root = "/home/seclab_dahae/dahye/VAE_data", transform = transformer)
train_set, test_set = train_test_split(train_set, test_size=0.2)
print("Train size is {}, test size is {} ".format(len(train_set), len(test_set)))

#test_set = torchvision.datasets.ImageFolder(root = "/home/seclab_dahae/dahye/VAE_data", transform = transformer)

# Loading trainloader, testloader
trainloader = torch.utils.data.DataLoader(train_set, batch_size = BATCH_SIZE, shuffle = True, num_workers = 2)
testloader = torch.utils.data.DataLoader(test_set, batch_size = BATCH_SIZE, shuffle = True, num_workers = 2)

This is the code that brings my data to pytorch.

# VAE model
class VAE(nn.Module):
    def __init__(self, image_size, hidden_size_1, hidden_size_2, latent_size): #28*28, 512, 256, 2
        super(VAE, self).__init__()

        self.fc1 = nn.Linear(image_size, hidden_size_1)
        self.fc2 = nn.Linear(hidden_size_1, hidden_size_2)
        self.fc31 = nn.Linear(hidden_size_2, latent_size)
        self.fc32 = nn.Linear(hidden_size_2, latent_size)

        self.fc4 = nn.Linear(latent_size, hidden_size_2)
        self.fc5 = nn.Linear(hidden_size_2, hidden_size_1)
        self.fc6 = nn.Linear(hidden_size_1, image_size)

    def encode(self, x):
        h1 = F.relu(self.fc1(x))
        h2 = F.relu(self.fc2(h1))
        return self.fc31(h2), self.fc32(h2)

    def reparameterize(self, mu, logvar):
        std = torch.exp(0.5 * logvar)
        eps = torch.randn_like(std)
        return mu + std * eps

    def decode(self, z):
        h3 = F.relu(self.fc4(z))
        h4 = F.relu(self.fc5(h3))
        return torch.sigmoid(self.fc6(h4))

    def forward(self, x):
        mu, logvar = self.encode(x.view(-1, 784))
        z = self.reparameterize(mu, logvar)
        return self.decode(z), mu, logvar

VAE_model = VAE(28*28, 512, 256, 2).to(DEVICE)
optimizer = optim.Adam(VAE_model.parameters(), lr = 1e-3)

This is the part that implements the VAE model.

def loss_function(recon_x, x, mu, logvar):
    BCE = F.binary_cross_entropy(recon_x, x.view(-1, 784), reduction = 'sum')
    KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
    return BCE, KLD

Here is a code that implements a loss function.

def train(epoch, model, train_loader, optimizer):
    model.train()
    train_loss = 0
    for batch_idx, (data, _) in enumerate(train_loader):
        data = data.to(DEVICE)
        optimizer.zero_grad()

        recon_batch, mu, logvar = model(data)

        BCE, KLD = loss_function(recon_batch, data, mu, logvar)

        loss = BCE + KLD

        loss.backward()

        train_loss += loss.item()

        optimizer.step()

        if batch_idx % 100 == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\t Loss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                100. * batch_idx / len(train_loader),
                loss.item() / len(data)))
            
    print("======> Epoch: {} Average loss: {:.4f}".format(
        epoch, train_loss / len(train_loader.dataset)
    ))  

def test(epoch, model, test_loader):
    model.eval()
    test_loss = 0
    with torch.no_grad():
        for batch_idx, (data, _) in enumerate(test_loader):
            data = data.to(DEVICE)
            
            recon_batch, mu, logvar = model(data)
            BCE, KLD = loss_function(recon_batch, data, mu, logvar)

            loss = BCE + KLD
            test_loss += loss.item()

            if batch_idx == 0:
                n = min(data.size(0), 8)
                comparison = torch.cat([data[:n], recon_batch.view(BATCH_SIZE, 1, 28, 28)[:n]]) # (16, 1, 28, 28)
                grid = torchvision.utils.make_grid(comparison.cpu()) # (3, 62, 242)

This is the train code and test code.
Jupiter's error occurred in the "recon_batch.view(BATCH_SIZE, 1, 28, 28)[:n]" section of the test code.

for epoch in tqdm(range(0, EPOCHS)):
    train(epoch, VAE_model, trainloader, optimizer)
    test(epoch, VAE_model, testloader)
    print("\n")
    latent_to_image(epoch, VAE_model)

Finally, This code is a trigger to start learning.
How can I solve this error?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

宫墨修音 2025-01-23 04:04:20

您的测试图像似乎不是 28 x 28 像素。您正在尝试重塑/查看 不是 28 x 28 的张量与不兼容的形状。您的测试数据是否可能是一批 600 张大小为 32 x 32 的图像?

请注意,当您重塑/查看张量只能更改元素的排列,但不能更改张量中元素的数量。

It seems like your test images are not 28 by 28 pixels. You are trying to reshape/view a tensor that is not 28 by 28 to a shape that is incompatible. Is it possible your test data is a batch of 600 images of size 32 by 32?

Note that when you reshape/view a tensor you only change the arrangement of elements, but you cannot change the number of elements in the tensor.

妄想挽回 2025-01-23 04:04:20

解决了类似的错误,

mu, logvar = self.encode(x.view(-1, 784))

通过替换

mu, logvar = self.encode(x.view(x.size(0), 784))

我希望这会有所帮助。

A similar error was solved by replacing

mu, logvar = self.encode(x.view(-1, 784))

by

mu, logvar = self.encode(x.view(x.size(0), 784))

I hope this helps.

半透明的墙 2025-01-23 04:04:20

添加 Shai 的答案:

[16, 1, 28, 28] 对于大小为 37632 的输入无效

37632 是 16x3x1x28x28 ;这些图像可能是 RGB 而不是灰度,这会增加额外的 x3 字节

Adding to Shai's answer:

[16, 1, 28, 28] is invalid for input of size 37632

37632 is 16x3x1x28x28 ; possibly these images are RGB and not grayscale, which would add the extra x3 bytes

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文