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

基于Matplotlib与PyTorch从张量批次生成单张3×3图像网格的技术求助

解决GAN样本网格展示的窗口问题

哈哈,确实没必要把事情复杂化~你的问题核心就是每次循环都新建了画布并单独显示,导致每张图都弹出独立窗口。咱们只需要调整代码逻辑,把所有图像放在同一个画布上就行,给你两种简单的解决方案:

方案1:手动循环绘制子图(适合需要自定义子图细节的场景)

这种方式保留你原来的循环逻辑,但把画布创建和最终展示移到循环外:

import matplotlib.pyplot as plt
import numpy as np
import torchvision.utils as vutils

# 假设你已经定义好device
real_samples = next(iter(train_loader))

# 只创建一个总画布
plt.figure(figsize=(9, 9))

for i in range(9):
    # 指定第i+1个子图(3行3列的布局)
    plt.subplot(3, 3, i + 1)
    # 处理单个样本张量,转换为可显示的格式
    img = np.transpose(
        vutils.make_grid(real_samples[i].to(device), padding=1, normalize=True).cpu(),
        (1, 2, 0)
    )
    plt.imshow(img)
    plt.axis('off')  # 关闭坐标轴,让网格更整洁

# 统一调整子图间距并展示整个网格
plt.tight_layout()
plt.show()

方案2:用vutils.make_grid直接生成网格(更简洁高效)

vutils.make_grid本身就支持批量生成网格,咱们可以直接把要展示的9个样本一次性传入,避免循环:

import matplotlib.pyplot as plt
import numpy as np
import torchvision.utils as vutils

# 假设你已经定义好device
real_samples = next(iter(train_loader))

plt.figure(figsize=(9, 9))
# 取前9个样本,生成3列的网格张量
grid_tensor = vutils.make_grid(
    real_samples[:9].to(device),
    nrow=3,  # 指定每行显示3张图
    padding=1,
    normalize=True
)
# 转换维度为plt.imshow需要的(H, W, C)格式
img_grid = np.transpose(grid_tensor.cpu(), (1, 2, 0))
plt.imshow(img_grid)
plt.axis('off')
plt.show()

关键注意点:

  • 不要在循环里调用plt.figure()和plt.show(),前者会每次新建画布,后者会立即显示当前画布
  • vutils.make_grid的nrow参数可以控制每行的图像数量,自动帮你排列成网格
  • 加上plt.axis('off')可以去掉子图的坐标轴,让整体视觉效果更干净

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:03:12