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数据集转为图片形式输出(按标签分别存储,统一存储) 好用!