【练手】MNIST数据集之图像可视化

MNIST数据集

作为神经网络和深度学习工具书和初学者首个经常接触和使用的“典型”数据集,是“知名”的手写数字数据集,本身占用空间不大(总共不到20MB),但是内容较多,且已经做好了分类。

MNIST数据集的获取

具体可参考本站另一位博主文章里提供的脚本:

链接:          MNIST数据集的下载、封装和读取

注:需要使用其提供的 mnist.py 作为依赖。

 

MNIST数据集的内容

下载下来是这样的:

简单解释一下:

  • train-images-idx3-ubyte.gz    (9.9 MB,训练集图像,包含 60,000 个样本)
  • train-labels-idx1-ubyte.gz      (29 KB,  训练集标签,包含 60,000 个标签)
  • t10k-images-idx3-ubyte.gz    (1.6 MB,测试集样本,包含 10,000 个样本)
  • t10k-labels-idx1-ubyte.gz      (5KB,     测试集标签,包含 10,000 个标签)

封装后是这样的:

   

随便解压一个内容是这样的:

  

idx3-ubyte格式,具体解释数据集的提供网站有介绍

总之,依靠普通常规手段是看不到图像内容的。

图像可视化

只看一点点

用这个脚本可以查看数据集的其中一个图像(来自博客):

链接:          查看MNIST的图像内容

代码如下:

import numpy as np
#下面这个引用就是上面文章提供的脚本mnist.py
from mnist import load_mnist
from PIL import Image

def img_show(img):
    pil_img = Image.fromarray(np.uint8(img))
    pil_img.show()

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True,
normalize=False)
img = x_train[0]
label = t_train[0]
print(label) # 5

#这里是把二维图像铺平成一维存放了
print(img.shape)          # (784,1)
img = img.reshape(28, 28) # 还原为二维
print(img.shape)          # (28, 28)

img_show(img)

图像是28*28的灰度图,也就是单通道图像。

多看一点点

才一张根?本不够嘛!哪咱们来100张的!

import numpy as np
from mnist import load_mnist
from PIL import Image

a = 10
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)
im = Image.new('L', (28 * a, 28 * a))  # 生成一个大的纯黑灰度图作为容器 长*宽

labels = []
images = []

for i in range(100):  # 从0开始 取100个整数
    img = x_train[i]
    label = t_train[i]
    img = img.reshape(28, 28)
    pil_img = Image.fromarray(np.uint8(img))  # 数据格式转换为8位
    labels.append(label)
    images.append(pil_img)

#在大的纯黑图灰度图上放单张图 10*10 共100张 得到100个数字的单张图
for k in range(10, 110, 10):
    for j in range(10000):
        if j < 10:
            print(k/10)
            im.paste(images[j], (j * 28, 28 * (int(k / 10) - 1)))
        elif j < k:
            im.paste(images[j], ((j - k + 10) * 28, 28 * (int(k / 10) - 1)))

im.show()        #显示图像
print(labels)

结果图:

再多看亿点点?

行,来点猛的!10000张够吗?

10改成100,100改10000即可,再加一些小改动:

a = 100
for i in range(10000):  # 从0开始 取10000个整数
for k in range(100, 10100, 100):
    for j in range(10000):
        if j < 100:
            print(k/100)
            im.paste(images[j], (j * 28, 28 * (int(k / 100) - 1)))
        elif j < k:
            im.paste(images[j], ((j - k + 100) * 28, 28 * (int(k / 100) - 1)))

大功告成!还挺有意思不是吗?

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值