基于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
相关产品推荐
相关产品推荐

