Невозможно использовать Предсказатель_генератора в загруженной модели. - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь загрузить модель Keras только для прогнозирования (т.е. мне не нужно компилировать модель, согласно сообщению Пепсли здесь ).

Когда я пытаюсь использовать model.predict_generator(), я получаю:

Using TensorFlow backend.
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/user/pkgs/anaconda2/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/user/pkgs/anaconda2/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/user/pkgs/anaconda2/lib/python2.7/site-packages/keras/utils/data_utils.py", line 559, in _run
    sequence = list(range(len(self.sequence)))
ValueError: __len__() should return >= 0

Я работаю с Tensorflow версии 1.12.0, Keras версии 2.2.4. Мне нужно использовать эти версии для обеспечения совместимости с моей версией cuDNN, которую я не могу контролировать.

Как мне обойти эту ошибку?

EDIT

Меня попросили привести пример. К сожалению, здесь слишком много запатентованной информации, чтобы я мог дать больше подробностей, но вот голые кости (обратите внимание, что модель на самом деле не является LSTM):

class LSTMmodel():

    def __init__(self, hid1 = 10, batch_size=32, mode='test'):
        self.hid_dim_1 = hid1 

        self.t_per_e, self.test_generator = self.read_data()

        #Load the entire fitted model
        model_name = ''.join(glob.glob('*model.h5'))
        self.__model = load_model(model_name, compile=False)

    def read_data(self):

        num_test_minibatches = 10
        test_IDs = range(111, 111+10)
        params = {'list_IDs': test_IDs, 'batch_size': self.batch_size, 'n_vars': 354}

        test_generator = DataGenerator(test_IDs, **params)
        t_per_e = int(len(test_IDs) - self.batch_size + 1)

        return t_per_e, test_generator

    def lstm_model():
        #Model building here. Not needed, since not compiling the model
        return 0

    def lstm_predict(self):
        pred = self.__model.predict_generator(self.test_generator, self.t_per_e)
        return pred

class DataGenerator(keras.utils.Sequence):

    #Other methods in here as necessary

    def __len__(self):
        'Denotes the number of batches per epoch'
        batches_per_epoch = int(np.floor(len(self.list_IDs) - self.batch_size + 1))
        return batches_per_epoch

    def __data_generation(self, other_params_here):
        'Generates data containing batch_size samples'
        return preprocessed_data

def test_lstm():
    test_inst = LSTMmodel(hid1=10) #hid1 is a hyperparameter
    test_prediction = test_inst.lstm_predict()
    return test_prediction


if __name__ == '__main__':
    testvals = test_lstm()

В основном, рабочий процесс:

1) test_lstm() создает экземпляр класса LSTMmodel и затем вызывает lstm_predict.

2) lstm_predict использует predict_generator, который принимает генератор для набора тестов и количество примеров для генерации (steps из здесь ).

3) Генератор для тестового набора создается как экземпляр класса DataGenerator() в методе read_data() класса LSTMmodel(). Важно отметить, что генератор тестовых данных создается так же, как генератор обучающих данных и генератор проверочных данных.

4) self.__model создается путем загрузки полностью обученной модели в методе init класса LSTMmodel ().

Как мне избавиться от ошибки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...