用MNIST的训练集训练的LeNet,这里就不展示代码了
直接加载保存好的模型
lenet = torch.load('resourses/trained_model/LeNet_trained.pkl')
测试代码附上
print("Testing")
#定义转换操作
#将测试图片读入并transform后传入模型
test_images = Image.open('resourses/LeNet_test/0.png')
img_to_tensor = transforms.Compose([
transforms.Resize(32),
transforms.Grayscale(num_output_channels=1),
transforms.ToTensor(),
transforms.Normalize([0.5], [0.5])])
input_images = img_to_tensor(test_images).unsqueeze(0)
#如果cuda可用,将模型及数据搬到cuda上进行计算
USE_CUDA = torch.cuda.is_available()
if USE_CUDA:
input_images = input_images.cuda()
lenet = lenet.cuda()
output_data = lenet(input_images)
#打印测试信息
test_labels = torch.max(output_data, 1)[1].data.cpu().numpy().squeeze(0)
print(output_data)
print(test_labels)
目前按照自己的图片基本上没有正确率,找不到任何原因,目前输出8的频率很高。
后来查阅了相关资料,有以下几点原因:
- 解析MNIST数据集,你会发现数据集里的图片是黑底白字,如:
而我们自定义的测试图片一般都是白底黑字,如:
故我将自定义的测试图片按像素取反后又重新进行了测试
像素取反的代码如下:
from PIL import Image, ImageOps #导包
image = Image.open('resourses/LeNet_test/0.png')
image_invert = ImageOps.invert(image)
image_invert.show()
经过像素取反后,测试的正确率达到百分之50到60,正确率仍然不理想,继续参考下面的原因
- MNIST数据集收录的都是外国人的字迹,外国人的手写风格、习惯和国人有些许不同,这也是影响测试正确率的一重大原因。但楼主目前没有测试过修改字体后图片测试的正确率。
欢迎大家补充潜在的原因。
附参考链接:https://www.zhihu.com/question/52047327