如何使用NumPy构造与MNIST格式一致的三维图像数据集数组
数组扁平化原因
np.append默认的拼接逻辑是将两个输入数组都扁平化到1维之后再拼接,你初始定义的X_train是普通Python列表,第一次执行np.append操作时就会被转换为1维numpy数组,后续每次追加图像数组时,也会先把单张2维的图像数组压成1维再拼接,最终就得到了全扁平的1维结果。
修复方法
推荐更简单的列表转数组方案:
import numpy as np, random import matplotlib.image as plt X_train=[] print("Preparing the dataset...") for i in range(100): img= plt.imread(f"img/{random.randint(1,2)}.png") # 直接将单张图像数组加入Python列表,不要调用np.append X_train.append(img) # 全部加载完成后统一转换为numpy数组,自动生成样本维度 X_train = np.array(X_train) print("Done...") print(X_train.shape)
- 该方案无需提前获知图像尺寸,只要所有输入图像的宽高一致,转换后就会自动得到
(100, x, y)格式的3维数组;如果你的图像是带RGB通道的彩色图,还会自动生成(100, x, y, 3)的4维数组,完全适配TensorFlow的输入要求。
如果你需要逐次用numpy方法拼接,可以使用np.concatenate指定拼接维度:
import numpy as np, random import matplotlib.image as plt print("Preparing the dataset...") for i in range(100): img= plt.imread(f"img/{random.randint(1,2)}.png") if i == 0: # 给第一张图像新增样本维度,形状变为(1, x, y) X_train = img[np.newaxis, :] else: # 每次在第0维度(样本维度)拼接新的图像 X_train = np.concatenate([X_train, img[np.newaxis, :]], axis=0) print("Done...") print(X_train.shape)
- 注意:两种方案都要求所有输入图像的宽高完全一致,如果尺寸不匹配需要先做resize预处理再加入数组。
内容的提问来源于stack exchange,提问作者Aadhi Arun
相关产品推荐
相关产品推荐

