Прогнозирование медленнее при загрузке модели, чем если бы оно подходило во время процесса - PullRequest
0 голосов
/ 12 ноября 2018

У меня странная проблема: метод DNN.predict гораздо медленнее, когда я загружаю вес своей модели, чем когда я тренируюсь с помощью метода подгонки. Я также отметил, что когда я запускаю прогноз для пакета изображений, прогнозирование становится все быстрее и быстрее.

Вот мой код

class Reseau(object):

def init(self, img_size, lr=-1, activation=" "):
tf.logging.set_verbosity(tf.logging.ERROR)
self.lr = lr
self.activation = activation
self.img_size = img_size
self.alreadySaved = 0

def setting(self, X, Y, test_x, test_y, nbEpoch):
tflearn.init_graph(num_cores=32, gpu_memory_fraction=1)
with tf.device("/device:GPU:0"):
convnet = input_data(shape=[None, self.img_size, self.img_size, 3], name='input')

        convnet = conv_2d(convnet, 32, 5, activation=self.activation)
        convnet = max_pool_2d(convnet, 5)

        convnet = conv_2d(convnet, 64, 5, activation=self.activation)
        convnet = max_pool_2d(convnet, 5)

        convnet = conv_2d(convnet, 128, 5, activation=self.activation)
        convnet = max_pool_2d(convnet, 5)

        convnet = conv_2d(convnet, 64, 5, activation=self.activation)
        convnet = max_pool_2d(convnet, 5)

        convnet = conv_2d(convnet, 32, 5, activation=self.activation)
        convnet = max_pool_2d(convnet, 5)

        convnet = flatten(convnet)

        convnet = fully_connected(convnet, 1024, activation=self.activation, name='last')
        convnet = fully_connected(convnet, 1024, activation=self.activation, name='last')
        convnet = fully_connected(convnet, 1024, activation=self.activation, name='last')
        convnet = fully_connected(convnet, 1024, activation=self.activation, name='last')
        convnet = dropout(convnet, 0.8)

        convnet = fully_connected(convnet, 2, activation='softmax')
        convnet = regression(convnet, optimizer='adam', learning_rate=self.lr, loss='categorical_crossentropy', name='targets')

        self.model = tflearn.DNN(convnet, tensorboard_dir='log')

        if self.alreadySaved == 0:
            self.model.fit({'input': X}, {'targets': Y}, n_epoch=nbEpoch, validation_set=({'input': test_x}, {'targets': test_y}), snapshot_step=500, show_metric=True, run_id="model")
            self.model.save("./model")
        else:
            self.model.load("./model", weights_only=True)
    return self.model

def predire(self, img, label):
image = array(img).reshape(1, self.img_size,self.img_size,3)
model_out = self.model.predict(image)
rep = 0

    if np.argmax(model_out) == np.argmax(label): rep = 1
    else: rep = 0

    return rep

Вот часть моего основного

reseau.setting(X, Y, test_x, test_y, NB_EPOCH)

X = np.array([i[0] for i in test]).reshape(-1,IMG_SIZE,IMG_SIZE,3)
Y = [i[1] for i in test]
cpt = 0

vrai = 0
start_time = time.time()

for i in range(20):
    cpt = 0

    vrai = 0
    start_time = time.time()
    for img in tqdm(X):
        prediction = reseau.predire(img, Y[cpt])
        cpt += 1
        if prediction == 1:
            vrai += 1

Как видите, я предсказываю одну и ту же серию изображений 20 раз. Первый раз всегда медленнее других (без подгонки, я предсказываю 82 изображения в первую очередь, а затем 340 в секунду, с подгонкой, это 255 изображений в первый раз и 340 затем во второй).

У меня действительно нет идей, чтобы это исправить.

...