Error:output with shape [1, 224, 224] doesn‘t match the broadcast shape [3, 224, 224]

Error:output with shape [1, 224, 224] doesn't match the broadcast shape [3, 224, 224]
原模型输入的图片为RGB三通道,输入的为单通道灰度图片。

# Error:output with shape [1, 224, 224] doesn't match the broadcast shape [3, 224, 224]
# 原模型输入的图片为RGB三通道,我输入的为单通道灰度图片。
# #--------------------------------------------------------------------------------------
# from torch.utils.data import DataLoader
# dataloader = DataLoader(dataset, shuffle=True, batch_size=16)
# from torchvision.utils import make_grid, save_image
# dataiter = iter(dataloader)
# img = make_grid(next(dataiter)[0], 4) # 拼成4*4网格图片,且会转成3通道
# to_img(img)
# #-------------------------------------------------------------------------------------
# 好像make_grid并不能转成3通道

解决如下:

from torch import nn
from torchvision import datasets
from torchvision import transforms as T
from torch.utils.data import DataLoader
from torchvision.utils import make_grid, save_image
import numpy as np
import matplotlib.pyplot as plt

transform  = T.Compose([
         T.ToTensor(), #这会将介于0到255之间的numpy数组转换为介于0到1之间的浮点张量
         T.Normalize((0.5, ), (0.5, )),  #在normalize()方法中, 我们指定了用来标准化张量图像所有通道的均值, 并且还指定了中心偏差。
])
dataset = datasets.MNIST('data/', download=True, train=False, transform=transform)
dataloader = DataLoader(dataset, shuffle=True, batch_size=100)

print(type(dataset[0][0]),dataset[0][0].size())
# print(dataset[0][0])
# 要绘制张量图像, 我们必须将其更改回numpy array。
# 我们将在函数def im_convert()中完成此工作, 该函数包含一个将成为张量图像的参数。
def im_convert(tensor):
    image=tensor.clone().detach().numpy()
    # 使用torch.clone()获得的新tensor和原来的数据不再共享内存,但仍保留在计算图中,
    # clone操作在不共享数据内存的同时支持梯度梯度传递与叠加,所以常用在神经网络中某个单元需要重复使用的场景下。
    # 通常如果原tensor的requires_grad=True,则:
    # clone()操作后的tensor requires_grad=True
    # detach()操作后的tensor requires_grad=False。
    image=image.transpose(1, 2, 0)
    # 将转换为numpy数组的张量具有第一, 第二和第三维的形状。第一维表示颜色通道, 第二维和第三维表示图像和像素的宽度和高度。
    # 我们知道MNIST数据集中的每个图像都是对应于单个彩色通道的灰度, 其宽度和高度为28 * 28像素。因此, 形状将为(1、28、28)。
    # 为了绘制图像, 要求图像的形状为(28, 28, 1)。因此, 通过将轴零, 一和二交换
    print(image.shape)
    image=image*(np.array((0.5, 0.5, 0.5))+np.array((0.5, 0.5, 0.5)))
    print(image.shape)
    # 我们对图像进行归一化, 而之前我们必须对其进行归一化。通过减去平均值并除以标准偏差来完成归一化。
    # 我们将乘以标准偏差, 然后将平均值相加
    image=image.clip(0, 1)
    print(image.shape,type(image))
    return image
    # 为了确保介于0和1之间的范围, 我们使用了clip()
    # 函数并传递了零和一作为参数。我们将clip函数应用到最小值0和最大值1并返回图像。

# 它将创建一个对象, 该对象使我们可以一次通过一个可变的训练加载器。
# 我们通过在dataiter上调用next来一次访问一个元素。
# next()函数将获取我们的第一批训练数据, 并且该训练数据将被分为以下图像和标签
dataiter=iter(dataloader)
images, labels=dataiter.next()

fig=plt.figure(figsize=(25, 6))
#fig=plt.figure(figsize=(25, 4))  #图片输出宽度较上面小
for idx in np.arange(20):
    ax=fig.add_subplot(2, 10, idx+1)
    plt.imshow(im_convert(images[idx]))
    ax.set_title([labels[idx].item()])
plt.show()

最终结果如下:

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸽泣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值