引自免费微信小程序:皆我百晓生
当然可以,看起来你已经有一个基本的框架来读取MNIST数据集的 IDX 文件。MNIST 数据集中的图像实际上是灰度图像,每个像素值是一个介于0到255之间的整数。由于这些数据是以二进制格式存储的,所以使用 struct
模块进行解包是正确的做法。
为了将这些二进制数据转换成图片并保存,你需要对加载的数据做一些处理。下面是修改后的代码,它会读取 MNIST 数据集的图片部分,并将其保存为 PNG 格式的图片。
import numpy as np
from PIL import Image
def save_mnist_images(data, labels, num_images=10, output_folder='output'):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for i in range(num_images):
image = data[i]
label = labels[i]
# 将一维数组转换回二维数组,因为原始数据是扁平化的
image = image.reshape((28, 28))
# 创建一个 PIL.Image 对象
img = Image.fromarray(image, mode='L')
# 保存图片
img.save(os.path.join(output_folder, f'mnist_{label}_{i}.png'))
def read_idx_and_save_images(filename, num_images=10):
with open(filename, 'rb') as f:
zero, data_type, dims = struct.unpack('>HBB', f.read(4))
assert data_type == 2051, "Invalid data type"
_, height, width = struct.unpack('>III', f.read(12))
images_count = struct.unpack('>I', f.read(4))[0]
# 读取标签
labels = np.frombuffer(f.read(height * width * num_images), dtype=np.uint8)
labels = labels.reshape(-1)
# 读取图片数据
images_data = np.frombuffer(f.read(height * width * num_images), dtype=np.uint8)
images_data = images_data.reshape(num_images, height, width)
# 调整图片数据范围,从 [0, 255] 到 [0.0, 1.0]
images_data = images_data.astype('float32') / 255.0
# 保存图片
save_mnist_images(images_data, labels, num_images=num_images)
# 使用示例
read_idx_and_save_images('train-images-idx3-ubyte')
这个脚本首先定义了一个 save_mnist_images
函数,它接受数据、标签以及要保存的图片数量作为参数。然后,我们有一个 read_idx_and_save_images
函数,它负责读取 IDX 文件并调用 save_mnist_images
来保存图片。
确保你已经有了 MNIST 数据集的两个文件:train-images-idx3-ubyte
和 train-labels-idx1-ubyte
。此脚本仅处理训练集的图片,但你可以根据需要对其进行调整来处理测试集或其他数据。
运行这段代码后,你会在名为 "output" 的文件夹中看到前 num_images
张带有相应标签的 MNIST 图片。如果你没有看到 "output" 文件夹,那么请确保有写入权限,并且路径正确。