Keras fit_generator проблема - PullRequest
0 голосов
/ 23 ноября 2018

Я следовал этому руководству , чтобы создать собственный генератор для моей модели Keras.Вот MWE, который показывает проблемы, с которыми я сталкиваюсь:

import sys, keras
import numpy as np
import tensorflow as tf
import pandas as pd
from keras.models import Model
from keras.layers import Dense, Input
from keras.optimizers import Adam
from keras.losses import binary_crossentropy

class DataGenerator(keras.utils.Sequence):
    'Generates data for Keras'
    def __init__(self, list_IDs, batch_size, shuffle=False):
        'Initialization'
        self.batch_size = batch_size
        self.list_IDs = list_IDs
        self.shuffle = shuffle
        self.on_epoch_end()

    def __len__(self):
        'Denotes the number of batches per epoch'
        return int(np.floor(len(self.list_IDs) / self.batch_size))

    def __getitem__(self, index):
        'Generate one batch of data'
        # Generate indexes of the batch
        #print('self.batch_size: ', self.batch_size)
        print('index: ', index)
        sys.exit()

    def on_epoch_end(self):
        'Updates indexes after each epoch'
        self.indexes = np.arange(len(self.list_IDs))
        print('self.indexes: ', self.indexes)
        if self.shuffle == True:
            np.random.shuffle(self.indexes)

    def __data_generation(self, list_IDs_temp):
        'Generates data containing batch_size samples' # X : (n_samples, *dim, n_channels)

        X1 = np.empty((self.batch_size, 10), dtype=float)
        X2 = np.empty((self.batch_size, 12),  dtype=int)

        #Generate data
        for i, ID in enumerate(list_IDs_temp):
            print('i is: ', i, 'ID is: ', ID)

            #Preprocess this sample (omitted)
            X1[i,] = np.repeat(1, X1.shape[1])
            X2[i,] = np.repeat(2, X2.shape[1])

        Y = X1[:,:-1]
        return X1, X2, Y

if __name__=='__main__':
    train_ids_to_use = list(np.arange(1, 321)) #1, 2, ...,320 
    valid_ids_to_use = list(np.arange(321, 481)) #321, 322, ..., 480

    params = {'batch_size': 32}

    train_generator = DataGenerator(train_ids_to_use, **params)
    valid_generator = DataGenerator(valid_ids_to_use, **params)

    #Build a toy model
    input_1 = Input(shape=(3, 10))
    input_2 = Input(shape=(3, 12))
    y_input = Input(shape=(3, 10))

    concat_1 = keras.layers.concatenate([input_1, input_2])
    concat_2 = keras.layers.concatenate([concat_1, y_input])

    dense_1 = Dense(10, activation='relu')(concat_2)
    output_1 = Dense(10, activation='sigmoid')(dense_1)

    model = Model([input_1, input_2, y_input], output_1)
    print(model.summary())

    #Compile and fit_generator
    model.compile(optimizer=Adam(lr=0.001), loss=binary_crossentropy)
    model.fit_generator(generator=train_generator, validation_data = valid_generator, epochs=2, verbose=2)

Я не хочу перетасовывать свои входные данные.Я думал, что это обрабатывается, но в моем коде, когда я печатаю index в __get_item__, я получаю случайные числа.Я хотел бы последовательные номера.Обратите внимание, что я пытаюсь завершить процесс, используя sys.exit внутри __getitem__, чтобы увидеть, что происходит.

Мои вопросы:

  1. Почему index нетидти последовательно?Как я могу это исправить?

  2. Когда я запускаю это в терминале с помощью экрана, почему он не реагирует на Ctrl + C?

1 Ответ

0 голосов
/ 25 ноября 2018

Вы можете использовать shuffle аргумент метода fit_generator для последовательного генерирования пакетов.Из fit_generator() документации :

shuffle: Boolean.Стоит ли перетасовывать порядок партий в начале каждой эпохи.Используется только с экземплярами Sequence (keras.utils.Sequence).Не действует, если steps_per_epoch не None.

Просто передайте shuffle=False на fit_generator:

model.fit_generator(generator=train_generator, shuffle=False, ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...