【问题标题】:How to determine the optimal number of "Steps" and "Batch Size" for test dataset in Keras ImageDataGenerator?如何确定 Keras ImageDataGenerator 中测试数据集的最佳“步数”和“批量大小”?
【发布时间】:2020-05-10 04:41:36
【问题描述】:

我已经训练了一个图像相似度网络。该网络旨在区分相似/不相似的图像对。

一对包含相机图像及其对应的草图图像。

测试数据集包含 4 个图像目录(camera_positive、sketch_positive、camera_negative、sketch_negative)。

我在评估测试数据集上的网络性能时遇到问题。

由于测试数据集很大,无法放入内存,我决定使用 Keras ImageDataGenerator。

我实现了以下代码。每个目录包含 20 张图片(用于小型演示)。

因此,总共有 80 张图像和 40 个预测。

由于 ImageDataGenerator 为我们提供了保存图像的选项,因此我使用了“save_to_dir”参数,如以下代码所示,以验证是否正常工作。

每个目录包含 20 张图像,因此,我希望在运行预测后,它会将相同的图像保存到指定的目录中。

运行代码后,每个文件夹生成31张图片,而不是20张!

我尝试了不同的步长,但没有人给出准确的结果。

这段代码有什么问题。请推荐!

import os
import numpy as np
from keras.models import load_model
from keras.preprocessing.image import ImageDataGenerator

batch_size = 1
image_size = 224
class_mode = None

"""
c_pos/neg: camera positive/neg image
s_pos/neg: sketch positive/neg image
"""
c_pos = r"testing\c_pos"
c_neg = r"testing\c_neg"
s_pos = r"testing\s_pos"
s_neg = r"testing\s_neg"

datagen_constructor = ImageDataGenerator()

def initialize_generator(generator, c_pos, s_pos, c_neg, s_neg):
    camera_pos=generator.flow_from_directory(
            c_pos, 
            target_size=(image_size, image_size),
            color_mode="rgb",
            batch_size=batch_size,
            class_mode=class_mode,
            shuffle = False,
            seed=7,
            save_to_dir='results/c_pos', 
            save_format='jpeg', 
            save_prefix='CPOS'
            )

    sketch_pos=generator.flow_from_directory(
            s_pos, 
            target_size=(image_size, image_size),
            color_mode="rgb",
            batch_size=batch_size,
            class_mode=class_mode,
            shuffle = False,
            seed=7,
            save_to_dir='results/s_pos', 
            save_format='jpeg', 
            save_prefix='SPOS'
            )

    camera_neg=generator.flow_from_directory(
            c_neg, 
            target_size=(image_size, image_size),
            color_mode="rgb",
            batch_size=batch_size,
            class_mode=class_mode,
            shuffle = False,
            seed=7,
            save_to_dir='results/c_neg', 
            save_format='jpeg', 
            save_prefix='CNEG'
            )

    sketch_neg=generator.flow_from_directory(
            s_neg, 
            target_size=(image_size, image_size),
            color_mode="rgb",
            batch_size=batch_size,
            class_mode=class_mode,
            shuffle = False,
            seed=7,
            save_to_dir='results/s_neg', 
            save_format='jpeg', 
            save_prefix='SNEG'
            )

    while True:
        camerapos = np.expand_dims(camera_pos.next(), axis=0)
        sketchpos = np.expand_dims(sketch_pos.next(), axis=0)
        cameraneg = np.expand_dims(camera_neg.next(), axis=0)
        sketchneg = np.expand_dims(sketch_neg.next(), axis=0)

        camera = np.concatenate((camerapos[0], cameraneg[0]))
        sketch = np.concatenate((sketchpos[0], sketchneg[0]))

        camera = np.asarray(list(camera), dtype=np.float32)
        sketch = np.asarray(list(sketch), dtype=np.float32)

        yield [camera, sketch]

test_datagen = initialize_generator(datagen_constructor, c_pos, s_pos, c_neg, s_neg)

# Load pre-trained model
model = load_model("model.h")

# Evaluating network performance on test dataset
predict = model.predict_generator(test_datagen, steps = 20)

【问题讨论】:

    标签: python-3.x keras dataset image-preprocessing


    【解决方案1】:

    您可以手动遍历每个文件夹并做出如下预测:

      model = load_model("model.h")
      image_paths = [image.path for image in os.scandir(path_to_my_folder)]
      for image_path in image_paths:
          image = cv2.imread(image_path)
          image_to_predict = np.expand_dims(image,axis=0) # this is important to add the batch index, keras only predicts on batches and here we have batch of size 1
          prediction = model.predict(image_to_predict)
    

    然后,您可以将每个预测与您​​知道它所属的基本事实标签进行比较。

    【讨论】:

    • 网络接受一对图像 [camera_image, sketch_imgae] 并预测 0/1,以防它们相似或不相似。我实现了一个类似类型的程序,但是当我使用整个测试数据集时出现问题,该数据集太大而无法放入内存。因此,我想用 ImageDataGenerator 来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2018-10-11
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多