既然你说你的图片有不同的尺寸,那么当你从目录中读取它们时调整它们的大小,然后将它们附加到trainImages。
我建议两个选项:
选项 1:
修改loadFiles如下
def loadFiles(path):
trainImages = []
for r, d, f in os.walk(path):
for file in f:
filepath = os.path.join(r, file)
img = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)
# Resizing image to size (28, 28)
img = cv2.resize(img, (28, 28), interpolation=cv2.INTER_CUBIC)
trainImages.append(img)
trainImagesNumpy = np.ndarray(trainImages)
return trainImagesNumpy
train = loadFiles(trainPath)
您可以使用其他插值策略来调整大小。查看 OpenCV Python 文档。
此外,使用os.path.join 是加入基本目录路径和文件路径的好习惯,因为它独立于操作系统。它会自动处理 Windows(反斜杠)或 Unix/Linux(正斜杠)中的文件路径分隔符。
参考:cv2.resize
选项 2:使用 ImageDataGenerator keras 中的类
使用它有两个好处:
- 批量加载数据。
- 您可以使用内置参数非常轻松地执行数据扩充。
将您的数据组织到训练、验证和测试目录中。每个目录都必须包含 n 个类中每一个的子目录。
目录树如下所示(假设您正在对猫与狗进行二元分类):
.
├── 测试
│ ├── 猫
│ └── 狗
├── 火车
│ ├── 猫
│ └── 狗
└── 验证
├── 猫
└── 狗
然后初始化数据生成器,根据需要将图像从 0-255 重新缩放到 0-1 范围。
datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)
然后从flow_from_directory 方法中批量读取训练、验证和测试图像。
train = datagen.flow_from_directory('data/train', target_size=(28, 28), batch_size=32)
validation = datagen.flow_from_directory('data/validation', target_size=(28, 28), batch_size=32)
test = datagen.flow_from_directory('data/test', target_size=(28, 28), batch_size=32)
执行上述代码后,请确保它告诉您已找到正确数量的图像和正确的类数。
然后您可以将train、validation 和test 批次直接传递给您的keras 模型中的fit 方法。 确保在训练时指定 steps_per_epoch 和 validation_steps 的数量。这是因为生成器永远运行,不断生成图像,所以fit 需要知道何时停止。出于同样的原因,请确保您也将 steps 参数提供给 predict 方法。
参考:
Keras docs