kerasвести предсказание_генератор перетасовывает свои выходные данные при использовании keras.utils.Sequence - PullRequest
0 голосов
/ 28 июня 2018

Я использую keras для построения модели, которая вводит изображения 720x1280 и выводит значение.

У меня проблема с keras.models.Sequential.predict_generator при использовании класса keras.utils.Sequence для получения значений, соответствующих изображениям на проверочных / обучающих наборах. Возвращенные значения перемешиваются, поэтому я не знаю, какой вывод соответствует какому изображению.

Вот так определяются мои генераторы

from skimage.io import ImageCollection, imread 
from keras.utils import Sequence

def load_images(f):
    return imread(f).astype(np.float64)

class DataSetImageKeras(Sequence):
    def __init__(self, image_collection, values, batch_size):
        self.images = image_collection
        self.hf = values
        self.batch_size = batch_size
        self.n = len(self.images)
        self.x_scale = 250
        self.y_scale = 1e4

    def __len__(self):
        return int(np.ceil(len(self.images) / float(self.batch_size)))

    def __getitem__(self, idx):
        # batch_x is a numpy.ndarray
        batch_x = (
                self.images[idx:min(idx + self.batch_size, self.n)]
                .concatenate()
                .reshape(self.batch_size, 720, 1280, 1)
                ) 
        batch_y = self.hf[idx:min(idx + self.batch_size, self.n)]


        return batch_x/self.x_scale, batch_y/self.y_scale

images_train = ImageCollection(images_paths_train, load_func=load_images)
images_val = ImageCollection(images_paths_test, load_func=load_images)

data_train = DataSetImageKeras(images_train, values_train, n_batch)
data_val = DataSetImageKeras(images_val, values_val, n_batch)


from keras.models import load_model
model = load_model('model001') #this model is already trained

Если я использую следующий код:

val_result = []
val_hf =[]
for (batch_x, batch_y) in data_val:
    val_result.append(model.predict_on_batch(batch_x))
    val_hf.append(batch_y)

val_result = np.concatenate(val_result)
val_hf = np.concatenate(val_hf)

plt.plot(val_hf, 
         val_result,
         marker='.',
         linestyle='')

Получен правильный результат (как видно на на этом изображении , где x - это желаемое значение, а y - это предсказанное значение)

Однако, если я использую функцию Предикат_Генератор, как показано ниже:

val_result = model.predict_generator(data_val, verbose=1,
                                     workers=1,
                                     max_queue_size=50,
                                     use_multiprocessing=False)

Вывод перетасовывается, как видно здесь .

Моя проблема похожа на # 5048 и # 6745 , которая должна быть решена # 6891 API, но я использую keras версии 2.1.6, и он все еще меняет мои прогнозы, даже при использовании workers=1.

Это также похоже на this , но я не нашел ничего, что могло бы сбросить генераторы, и эта проблема все еще присутствует, если я определяю новый генератор и пытаюсь запустить predict_generator.

Я также нашел кое-что, заявляющее, что это может иметь отношение к количеству партий, не делящих точно количество образцов, но эта проблема все еще присутствует, если я использую n_batch=1

В качестве примечания может оказаться, что Предикат_генератор не перетасовывает данные, а только возвращает их со смещением индекса, поскольку входные данные values и images_paths уже перетасованы.

1 Ответ

0 голосов
/ 02 июля 2018

predict_generator в конце концов не обманул мои прогнозы. Проблема была с методом __getitem__. Например, при использовании n_batch=32 метод будет давать значения от 1 до 32, затем от 2 до 33 и т. Д. Вместо от 1 до 32, от 33 до 64 и т. Д.

Изменение метода следующим образом решает проблему

 def __getitem__(self, idx):
    # batch_x is a numpy.ndarray
    idx_min = idx*self.batch_size
    idx_max = min(idx_min + self.batch_size, self.n)
    batch_x = (
            self.images[idx_min:idx_max]
            .concatenate()
            .reshape(self.batch_size, 720, 1280, 1)
            ) 
    batch_y = self.hf[idx_min:idx_max]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...