3.生成index.ubyte文件
这里我主要参考了 这篇博客,他们把这块的知识解释得很到位了,我这里也没什么补充的。主要是拿到训练集图片与标签的index_ubyte文件和测试集的图片与标签的index_ubyte文件。共四个文件。
非常感谢我的参考博客:
https://blog.csdn.net/qq_44042678/article/details/131631917?spm=1001.2014.3001.5506
直接上代码:
import os # 用于操作系统相关的功能 from PIL import Image # 用于处理图像 from array import * # 用于数组操作 from random import shuffle # 用于打乱数据顺序 # 图像数据的加载和保存路径 Names = [['./training-images', 'train'], ['./test-images', 'test']] # 遍历输入的训练和测试数据集 for name in Names: # 创建图像数据和标签数据的数组 data_image = array('B') data_label = array('B') # 获取文件列表 FileList = [] for dirname in os.listdir(name[0])[1:]: # [1:] 用于排除 Mac OS 中的 .DS_Store 文件夹 path = os.path.join(name[0], dirname) for filename in os.listdir(path): if filename.endswith(".png"): FileList.append(os.path.join(name[0], dirname, filename)) # 打乱文件列表的顺序,有助于进一步划分验证集 shuffle(FileList) # 遍历文件列表 for filename in FileList: # 获取标签并打开图像文件 label = int(filename.split('/')[2]) Im = Image.open(filename) pixel = Im.load() width, height = Im.size # 遍历图像像素并将其添加到图像数据中 for x in range(0, width): for y in range(0, height): data_image.append(pixel[y, x]) data_label.append(label) # 添加标签到标签数据中 # 计算文件数并将其转换成十六进制形式 hexval = "{0:#0{1}x}".format(len(FileList), 6) # 为标签数组添加头信息 header = array('B') header.extend([0, 0, 8, 1, 0, 0]) header.append(int('0x' + hexval[2:][:2], 16)) header.append(int('0x' + hexval[2:][2:], 16)) data_label = header + data_label # 为图像数组添加附加头信息 if max([width, height]) <= 256: header.extend([0, 0, 0, width, 0, 0, 0, height]) else: raise ValueError('Image exceeds maximum size: 256x256 pixels') header[3] = 3 # 修改图像数据的最高有效位 (MSB) (0x00000803) data_image = header + data_image # 打开并写入图像数据文件 output_file = open(name[1] + '-images-idx3-ubyte', 'wb') data_image.tofile(output_file) output_file.close() # 打开并写入标签数据文件 output_file = open(name[1] + '-labels-idx1-ubyte', 'wb') data_label.tofile(output_file) output_file.close() # 压缩生成的文件 for name in Names: os.system('gzip ' + name[1] + '-images-idx3-ubyte') os.system('gzip ' + name[1] + '-labels-idx1-ubyte')
到这可以恭喜你已经拿到了你自己的类mnist数据集了,可以去尽情的使用了。