pytorch----神经网络中由于PIL引起的错误

1、RuntimeError: output with shape [1, 128, 128] doesn‘t match the broadcast shape [3, 128, 128]

报错原因:输入图片需要是RGB空间图片而不能是灰度图,所以导致张量的通道数不匹配。

解决方法:知道了问题的原因之后问题就变得好解决了,我的解决思路是用opencv或者是PIL包下面的图形处理函数,把输入的图片从灰度图转为RGB空间的彩色图。这种方法可以适合数据集中既包含有RGB图片又含有灰度图的情况。解决代码如下:

img = Image.open(img_dir)

img = img.convert('RGB')

2、OSError: image file is truncated (26 bytes not processed)

解决办法:在代码中添加两行

from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True

3. UserWarning: Possibly corrupt EXIF data.

一般来说是图片的piexif的图片有点问题。简单的操作就是删除掉对应的exif信息。或者直接ignore 警告

解决方案1:下载piexif包:  pip install piexif -i https://pypi.tuna.tsinghua.edu.cn/simple/

                      删除掉图片的exif方式:

img_path: 图片的地址
import piexif

piexif.remove(img_path) 

解决方案2:跳过这些图片,无视警告信息。

###ignore warning: python -w ignore train.py    或是

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要准备好行书和隶书的数据集,并将其分为训练集和测试集。可以使用 PIL 库读取图片,并将其转换为 PyTorch 的张量。接着,可以使用 torchvision 库的 transforms 模块进行数据增强,如将图片进行随机旋转、缩放、裁剪等操作,以增加模型的泛化能力。 然后,需要搭建一个卷积神经网络模型,用于对文字体进行分类。可以使用 PyTorch 的 nn 模块来定义模型的结构,如卷积层、池化层、全连接层等。对于文字体的分类问题,可以使用交叉熵损失函数,并选择合适的优化器进行参数更新,如 Adam 或 SGD。 最后,进行模型的训练和测试。在训练时,可以使用 DataLoader 将数据集进行批处理,以提高训练效率。在测试时,可以使用模型对测试集进行预测,并计算准确率和召回率等指标来评估模型的性能。 下面是一个简单的行书和隶书分类器的 PyTorch 代码示例: ```python import torch import torch.nn as nn import torch.optim as optim import torchvision.transforms as transforms import torchvision.datasets as datasets # 定义数据增强操作 transform_train = transforms.Compose([ transforms.RandomRotation(15), transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), ]) transform_test = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), ]) # 加载数据集 trainset = datasets.ImageFolder('train/', transform=transform_train) testset = datasets.ImageFolder('test/', transform=transform_test) # 定义模型结构 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1) self.conv2 = nn.Conv2d(64, 128, kernel_size=3, padding=1) self.conv3 = nn.Conv2d(128, 256, kernel_size=3, padding=1) self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.fc1 = nn.Linear(256 * 28 * 28, 1024) self.fc2 = nn.Linear(1024, 2) self.relu = nn.ReLU() def forward(self, x): x = self.relu(self.conv1(x)) x = self.pool(x) x = self.relu(self.conv2(x)) x = self.pool(x) x = self.relu(self.conv3(x)) x = self.pool(x) x = x.view(-1, 256 * 28 * 28) x = self.relu(self.fc1(x)) x = self.fc2(x) return x # 定义训练参数 batch_size = 32 num_epochs = 10 learning_rate = 0.001 trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=2) testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=2) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(net.parameters(), lr=learning_rate) # 训练模型 for epoch in range(num_epochs): running_loss = 0.0 for i, (inputs, labels) in enumerate(trainloader, 0): optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 50 == 49: # 每 50 个 batch 输出一次 loss print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 50)) running_loss = 0.0 # 测试模型 correct = 0 total = 0 with torch.no_grad(): for images, labels in testloader: outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the test images: %d %%' % ( 100 * correct / total)) ``` 需要注意的是,这只是一个简单的示例代码,实际还需要根据具体情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值