You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

内存占用最优的高分辨率图像存入Numpy array的实现方法是什么

TensorFlow框架下3万张GAN训练图像内存高效存取方案

下面直接给3种可落地的方案,按需选择:

方案1:用tf.data.Dataset动态加载(最适配TensorFlow训练场景,优先选)

不需要提前把所有图像加载进内存转成Numpy数组,运行时逐批加载,内存占用仅和batch size挂钩,3万张图完全不会爆内存:

  • 第一步读取所有图像路径构建基础Dataset
import tensorflow as tf
import glob

# 替换为你自己的图像文件夹路径和后缀
image_paths = glob.glob("./gan_train_imgs/*.png")
path_ds = tf.data.Dataset.from_tensor_slices(image_paths)
  • 写预处理函数映射得到图像Dataset,动态加载处理图像
def preprocess_img(path):
    # 读文件+解码,按需调整通道数、解码格式
    img = tf.io.read_file(path)
    img = tf.image.decode_png(img, channels=3)
    # 按需调整目标尺寸
    img = tf.image.resize(img, [256, 256])
    # GAN常用归一化到[-1, 1]区间
    img = tf.cast(img, tf.float32) / 127.5 - 1
    return img

image_ds = path_ds.map(preprocess_img, num_parallel_calls=tf.data.AUTOTUNE)
  • 配置训练流水线直接喂给GAN模型即可
BATCH_SIZE = 64
train_ds = image_ds.shuffle(buffer_size=1000).batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)

方案2:用Numpy内存映射memmap(需要Numpy数组式调用的场景)

如果确实需要用类Numpy数组的方式全局访问所有数据,用内存映射把数组存在磁盘上,操作和普通Numpy数组完全一致,但只会把当前访问的片段加载进内存,内存占用极低:

import numpy as np
from PIL import Image

# 按需调整数组形状:样本数*高*宽*通道数
arr_shape = (30000, 256, 256, 3)
# 创建磁盘映射的Numpy数组
memmap_arr = np.memmap("gan_imgs.npy", dtype="float32", mode="w+", shape=arr_shape)

# 逐张写入数据,不会一次性占满内存
for idx, img_path in enumerate(image_paths):
    img = np.array(Image.open(img_path).resize((256,256)), dtype="float32")
    # 按需做归一化
    memmap_arr[idx] = img / 127.5 - 1

# 写入完成后刷入磁盘
del memmap_arr

# 后续调用时直接读取,操作和普通Numpy数组没有区别
load_arr = np.memmap("gan_imgs.npy", dtype="float32", mode="r", shape=arr_shape)

方案3:转TFRecord格式存储(大规模数据集反复训练场景)

如果需要反复用这个数据集训练,转成TensorFlow原生的TFRecord格式,读取效率更高,同样是动态加载,内存占用极低:

  • 先把所有图像转存为TFRecord文件
  • 训练时用tf.data.TFRecordDataset加载即可,配置逻辑和方案1的流水线一致。

内容的提问来源于stack exchange,提问作者Sinister 3665

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:06:03