Почему эпоха 2 занимает в 18 раз больше времени, чем эпоха 1? - PullRequest
1 голос
/ 26 января 2020

У меня есть следующая нейронная сеть в кератах (обзор ее, вероятно, не является необходимостью, чтобы ответить на мой вопрос:

Краткое резюме: Это нейронная сеть, которая принимает изображения в качестве входных данных и выводит изображения тоже. Нейронные Сеть в основном сверточная. Я использую генераторы. Также у меня есть два обратных вызова: один для TensorBoard и один для сохранения chechpoint

class modelsClass(object):
    def __init__(self, img_rows = 272, img_cols = 480):

        self.img_rows = img_rows
        self.img_cols = img_cols

    def addPadding(self, layer, level): #height, width, level):

        w1, h1 = self.img_cols, self.img_rows
        w2, h2 = int(w1/2), int(h1/2)
        w3, h3 = int(w2/2), int(h2/2)
        w4, h4 = int(w3/2), int(h3/2)
        h = [h1, h2, h3, h4]
        w = [w1, w2, w3, w4]

        # Target width and height
        tw = w[level-1]
        th = h[level-1]

        # Source width and height
        lsize = keras.int_shape(layer)
        sh = lsize[1]
        sw = lsize[2]

        pw = (0, tw - sw)
        ph = (0, th - sh)

        layer = ZeroPadding2D(padding=(ph, pw), data_format="channels_last")(layer)

        return layer

[Мне нужно разбить код с помощью некоторого текста здесь, чтобы задать вопрос]

    def getmodel(self):

        input_blurred = Input((self.img_rows, self.img_cols,3))

        conv1 = Conv2D(64, (3, 3), activation='relu', padding='same')(input_blurred)
        conv1 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv1)
        pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)

        conv2 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool1)
        conv2 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv2)
        pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)

        conv3 = Conv2D(256, (3, 3), activation='relu', padding='same')(pool2)
        conv3 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv3)
        pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)

        conv4 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool3)
        conv4 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv4)
        pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)

        conv5 = Conv2D(1024, (3, 3), activation='relu', padding='same')(pool4)
        conv5 = Conv2D(1024, (3, 3), activation='relu', padding='same')(conv5)

        up6 = Conv2DTranspose(512, (2, 2), strides=(2, 2), padding='same')(conv5)
        up6 = self.addPadding(up6,level=4)
        up6 = concatenate([up6,conv4], axis=3)
        conv6 = Conv2D(512, (3, 3), activation='relu', padding='same')(up6)
        conv6 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv6)

        up7 = Conv2DTranspose(256, (2, 2), strides=(2, 2), padding='same')(conv6)
        up7 = self.addPadding(up7,level=3)
        up7 = concatenate([up7,conv3], axis=3)
        conv7 = Conv2D(256, (3, 3), activation='relu', padding='same')(up7)
        conv7 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv7)

        up8 = Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(conv7)
        up8 = self.addPadding(up8,level=2)
        up8 = concatenate([up8,conv2], axis=3)
        conv8 = Conv2D(128, (3, 3), activation='relu', padding='same')(up8)
        conv8 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv8)

        up9 = Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(conv8)
        up9 = self.addPadding(up9,level=1)
        up9 = concatenate([up9,conv1], axis=3)
        conv9 = Conv2D(64, (3, 3), activation='relu', padding='same')(up9)
        conv9 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv9)

        conv10 = Conv2D(3, (1, 1), activation='linear')(conv9)

        model = Model(inputs=input_blurred, outputs=conv10)

        return model

Тогда код:

models = modelsClass(720, 1280)
model = models.getmodel()

model.compile(optimizer='adam', loss='mean_absolute_error')
model_checkpoint = ModelCheckpoint('checkpoints/cp.ckpt', monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', save_freq='epoch')
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir='some_dir', histogram_freq=1)
model_history = model.fit_generator(generator_train, epochs=3,
                          steps_per_epoch=900,
                          callbacks=[tensorboard_callback, model_checkpoint],
                          validation_data=generator_val, validation_steps=100)

, где generator_train.__len__ = 900, generator_val.__len__ = 100, размер партии для обоих = 1.
Время для эпохи 1 составляет 10 минут, а эпоха 2 занимает 3 часа. Я хочу знать, в чем может быть проблема

1 Ответ

0 голосов
/ 26 января 2020

Вот некоторые общие вещи, которые могут снизить скорость программы:

  • Процессор / графический процессор, используемый другой программой
  • Замена памяти: ваш компьютер перемещает данные из ОЗУ на диск, потому что существует недостаточно оперативной памяти Это может быть связано с тем, что в вашем скрипте вы пытаетесь сохранить все в памяти (например, список предыдущих выходных данных, возможно, даже с их градиентами), или потому, что другая программа также начала использовать много оперативной памяти.
  • компьютерное тепло (возможно, после первой эпохи стало жарко)
  • экономия батареи (возможно, если это ноутбук, а вы его отключили)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...