内存占用最优的高分辨率图像存入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
相关产品推荐
相关产品推荐

