paddlepaddle 手写数据集mnist逆转化为图像

本文介绍了如何将PaddlePaddle的MNIST手写数字数据集逆向处理回图像,详细解析了数据处理过程,展示了从数组到图像的转换,并通过代码实现批量显示多个图像,验证了模型的预测准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近在实战paddlepaddle手写数字集识别。但是我发现,官方的数据是处理过了,这就意味着数据可以直接拿来训练,但是无法以图片的形式显示出来。看不见实实在在的图像是真的难受,没关系,我带大家还原图像。

分析

咱们先看一下官方给的例子中,有这个一个图像处理方法,用于检测模型的

def load_image(file):
    im = Image.open(file).convert('L')                        #将RGB转化为灰度图像,L代表灰度图像,像素值在0~255之间
    im = im.resize((28, 28), Image.ANTIALIAS)                 #resize image with high-quality 图像大小为28*28
    im = np.array(im).reshape(1, 1, 28, 28).astype(np.float32)#返回新形状的数组,把它变成一个 numpy 数组以匹配数据馈送格式。
    # print(im)
    im = im / 255.0 * 2.0 - 1.0                               #归一化到【-1~1】之间
    return im

每一步是什么作用,旁边的注释写的很清楚,我就不多言了。

由于之前训练的时候,是把模型中的数据直接拿来用,不需要经过这么处理。而在使用外部图片时,需要经过这样的处理。所以,我断定模型中的手写数据集已经处理过了。

那我们需要做的,就是根据这个方法,反向操作就完事了。

逆转化图像

def reverseimg(data):
    data = 255*(data+1)/2
    data = np.array(data).reshape(28,28)
    img = Image.fromarray(data)
    img.show()

好了,这就是我们根据前面的方法,写的逆转化图像方法。那么问题来了,这个参数data应该传入什么呢?

既然显示的是一张图片,那么data必是一张图片转化成的数组。


test_reader=paddle.batch(
  paddle.reader.shuffle(paddle.dataset.mnist.test(),buf_size=512),batch_size=128
)

datas = next(test_reader())
x = np.array([data[0] for data in datas]).astype("float32")
img = x[0]

test_reader 是获取mnist的训练数据,一共获取数据大小是512,每一批次为128个,一共四批次。

datas = next(test_reader())这个方法用于获取test_reader第一批次的数据,也就是128个。

我们输出一下,看看datas目前的数据格式

print(np.array(datas).shape)
print(np.array(datas)[0])

输出:

(128, 2)
[array([-1., -1. , -1., -1., -1., -1. ......], dtype=float32)
 5]

从输出来看,一共128个数据,每一个数据由一个数组和一个整数组成。这个数组就是图像的数据,后面的整数,就是图像的标签。

我们现在只需要提取图像数据即可,那明白了,我们可以这么做:

 x = np.array([data[0] for data in datas]).astype("float32")
 

现在这个x是一个二维数组,共有128行,每一行为一个图片的数据,共有(28*28)列。因为我们目前只显示一张图片,所以,只需要获取一个图片数据即可。

img = x[0]
reverseimg(img)

然后我们调用之前的方法,看看显示出来的图片是什么样:

在这里插入图片描述
嗯嗯,很是满意。但是呢,我们在验证模型准确率时,每次一张一张的验证,很是麻烦,加下来我们稍微修改一下前面的代码,将十张数据集图像显示在一个图像中。

def reverseimg(datas):
    image = Image.new(mode='L',size=(300,300))
    left=0
    for data in datas:
        data = 255*(data+1.0)/2
        data1 = np.array(data).reshape(28,28)
        img = Image.fromarray(data1)
        image.paste(img,(left,135))
        left+=30
    image.show()
x = np.array([data[0] for data in datas]).astype("float32")
imgs = x[:10]
reverseimg(imgs)

这里我一共获取了10张图片的数据,并一一转化为图像,并且通过paste方法,将图片粘贴在一个空白图像中,我们来看看效果:

在这里插入图片描述

还不错,我们看看输出结果:
在这里插入图片描述

哈哈,全部预测正确,这次是比较幸运,图片中没有模棱两可的数字,有些数字我都分不清是多少,更别说这个模型了。

总结

paddlepaddle它自带的数据集都是提前将数据处理好的,这也的确增加了我们模型训练速度。不过,我们想查看原数据就比较难了。这里我只是针对手写数据集进行逆转化图像过程的分析,给大家一个思路上的参考吧。

轻轻的你来了,请不要轻轻的走,你伸了伸衣袖,点了个赞才走👍

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值