咩都冇知 2024-04-21 18:06 采纳率: 66.7%
浏览 3

关于gan中将mnist二进制数据集保存为图片的问题

请问大家mnist数据集是C结构的吗,我在python中将mnist数据集保存为图片是不是需要调用 struct.unpack函数?
代码如下

def read_idx(filename):
    """
    二进制文件解析函数
    filename:二进制文件路径
    """
    with open(filename, 'rb') as f:  #rb: 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。
        zero, data_type, dims = struct.unpack('>HBB', f.read(4))
        shape = tuple(struct.unpack('>I', f.read(4))[0] for d in range(dims))  #元组(Tulpe)是Python中另外的一种数据类型,和列表(List)一样也是一组有序对象的集合,大部分的属性和列表一样
        return np.frombuffer(f.read(), dtype=np.uint8).reshape(shape)  #reshape()函数用于在不更改数据的情况下为数组赋予新形状  uint8(8位无符号整数)


  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-21 18:06
    关注

    引自免费微信小程序:皆我百晓生

    当然可以,看起来你已经有一个基本的框架来读取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-ubytetrain-labels-idx1-ubyte。此脚本仅处理训练集的图片,但你可以根据需要对其进行调整来处理测试集或其他数据。

    运行这段代码后,你会在名为 "output" 的文件夹中看到前 num_images 张带有相应标签的 MNIST 图片。如果你没有看到 "output" 文件夹,那么请确保有写入权限,并且路径正确。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月21日

悬赏问题

  • ¥15 本人本科机械,目前研一。没有深度学习基础,目前对研究生课题一片迷茫,请教各位!
  • ¥15 关于R语言单因素与多因素线性回归的平均值
  • ¥15 服务器清除BIOS之后引导不了
  • ¥15 CPLEX用OPL编写的混合整数线性优化问题。
  • ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
  • ¥15 前端预览docx文件,文件从后端传送过来。
  • ¥15 层次聚类和蛋白质相似度
  • ¥25 主成分分析中的第一第二主成分分别代表哪些参数
  • ¥15 oracle数据库查询语句问题
  • ¥15 有没有c++绘制算法的佬们吗救孩一下