将MNIST数据集的每个类对应的的图像输出

1. 方法一

这种方法直接将MNIST数据集里面的所有图像输出,换句话说就是没有分门别类的输出,代码如下:

import torch
import torchvision   
import torch.utils.data as Data  
import scipy.misc
import os
import matplotlib.pyplot as plt  
from torch.autograd import Variable       
  
train_data = torchvision.datasets.MNIST(root='./datasets/MNIST/', train=True,transform=torchvision.transforms.ToTensor(), download=True)
test_data = torchvision.datasets.MNIST(root='./datasets/MNIST/', train=False)


#把原始图片保存至MNIST_data/raw/下
save_dir="mnist/raw/"
if os.path.exists(save_dir)is False:
    os.makedirs(save_dir)
    
for i in range(20): # 为了方便测试只输出20张,这里可以自己定义
    image_array,_=train_data[i]#打印第i个
    image_array=image_array.resize(28,28)
    filename=save_dir + 'mnist_train_%d.jpg' % i#保存文件的格式
    print(filename)
    print(train_data.train_labels[i])#打印出标签
    scipy.misc.toimage(image_array,cmin=0.0,cmax=1.0).save(filename)#保存图像

1.1 运行结果

在这里插入图片描述

2. 方法二

这里我们按照每张图像所对应的类别输出,也就是属于该类的所有图像存放在一起,代码如下:

import os
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

import tensorflow as tf


save_path = "./img/minst" # 输出图片保存路径

(x_train,y_train),(x_test,y_test) = tf.keras.datasets.mnist.load_data()

def decode(images,labels,path):
    for index, vec in enumerate(images):
        image = vec.reshape([28,28])    #遍历图片
        label = labels[index]  #图片对应标签
        classes_path = os.path.join(path,str(label)) #图片分类到每个文件夹,得到文件夹地址
        if not os.path.exists(classes_path) : os.makedirs(classes_path) #不存在就创建
        image_path = os.path.join(classes_path, str(index)+".jpg") #图片地址
        matplotlib.image.imsave(image_path, image, cmap="binary")#保存图片

decode(x_train, y_train, os.path.join(save_path,"train"))
print("finish")
decode(x_test,y_test,os.path.join(save_path,"test"))
print("finish")

2.1 效果如下

运行上面代码,结果如下所示:
在这里插入图片描述

2.2 小提示

这里我们使用的是tensorflow框架,所需要的版本是2.0+,所以要运行这段代码必须对应好tf版本。

3. 方法三

与方法二类似,但是我们使用的pytorch框架,读取本地数据集,代码如下

import os
import torch
import torchvision
import torchvision.transforms as transforms
from skimage import io
import torchvision.datasets.mnist as mnist
import numpy

# Device configuration
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')

# MNIST dataset
train_dataset = torchvision.datasets.MNIST(root='data/',
                                           train=True,
                                           transform=transforms.ToTensor(),
                                           download=True)

test_dataset = torchvision.datasets.MNIST(root='data/',
                                          train=False,
                                          transform=transforms.ToTensor())

root='./data/MNIST/raw/'

train_set=(mnist.read_image_file(os.path.join(root,'train-images-idx3-ubyte')),
           mnist.read_label_file(os.path.join(root,'train-labels-idx1-ubyte'))
           )
test_set = (
    mnist.read_image_file(os.path.join(root,'t10k-images-idx3-ubyte')),
    mnist.read_label_file(os.path.join(root,'t10k-labels-idx1-ubyte'))
)

def convert_to_img(train=True):
    if train:
        data_path='./img/data_train01/'
        for i,(img,label) in enumerate(zip(train_set[0],train_set[1])):
            img_path=data_path+str(label.item())+'/'
            print('train_img_path:',img_path,'img_num:',i)
            img_name=img_path+str(i)+'.png'
            if (not os.path.exists(img_path)):
                 os.makedirs(img_path)
            io.imsave(img_name, img.numpy())
    else:
        data_path = './img/data_test01/'
        for i, (img, label) in enumerate(zip(test_set[0], test_set[1])):
            img_path = data_path +str(label.item())+ '/'
            print('test_img_path:', img_path, 'img_numpy:',i)
            img_name = img_path + str(i) + '.png'
            if (not os.path.exists(img_path)):
                 os.makedirs(img_path)
            io.imsave(img_name, img.numpy())


convert_to_img(True)
convert_to_img(False)

3.1 效果展示

在这里插入图片描述

4. 参考文献

1.【解决错误】ModuleNotFoundError: No module named ‘skimage‘
2. 用几行代码将MNIST数据集图片提取并分类存放
3 . MNIST数据集转为图片形式输出(按标签分别存储,统一存储) 好用!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值