Я пытаюсь загрузить модель 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 ().
Как мне избавиться от ошибки?