Ошибка CUDA OOM после успешного запуска на нескольких изображениях для модели keras - PullRequest
0 голосов
/ 21 октября 2019

У меня есть модель классификации изображений, и я выполняю некоторые преобразования выходных данных модели классификации изображений следующим образом: Здесь модель - модель классификации изображений.

def gethypercols(model,image):
        model = hypercol_model(model)
        output = model.predict(image)
        factor = 2
        for i in range(len(output)):
                output[i] = tf.convert_to_tensor(output[i],np.float32)
                output[i] = (ZeroPadding2D((1,1)))(output[i])
                output[i] = (Conv2D(100,(3,3)))(output[i])
#               with tf.device('/cpu:0'):
                if i in (0,1,2):
                        output[i] = UpSampling2D(size = (factor**2,factor**2),interpolation='bilinear')(output[i])
                elif i in (3,4,5,6):
                        output[i] = UpSampling2D(size = (factor**3,factor**3),interpolation='bilinear')(output[i])
                elif i in (7,8,9,10,11,12):
                        output[i] = UpSampling2D(size = (factor**4,factor**4),interpolation='bilinear')(output[i])
                else:                                                                                                                           output[i] = UpSampling2D(size = (factor**5,factor**5),interpolation='bilinear')(output[i])              out = Add()([output[0],output[1],output[2],output[3],output[4],output[5],output[6],output[7],output[8],output[9],output[10],output[11],output[12],output[13],output[14],output[15]])
        del output
        gc.collect()
        out = (Activation('sigmoid'))(out)
        out = (ZeroPadding2D((1,1)))(out)
        out = (Conv2D(20,(3,3)))(out)
        print('conversion of tensor to numpy')

        #with tf.device('/cpu:0'):
        outarray = K.eval(out)
        ourarray = np.array(outarray)
        outarray = np.squeeze(outarray)
        maxvalue = np.amax(outarray)
        print('maxvalue in hypercolumns is {}'.format(maxvalue))
        thresholdvalue = maxvalue*0.7
        outarray[np.where(outarray<thresholdvalue)] = 0
        return outarray

def hypercol_model(model):
        hypercol_model = Model(inputs=[model.input],outputs=[model.get_layer('add_1').output,model.get_layer('add_2').output,model.get_layer('add_3').output,model.get_layer('add_4').output,model.get_layer('add_5').output,model.get_layer('add_6').output,model.get_layer('add_7').output,model.get_layer('add_8').output,model.get_layer('add_9').output,model.get_layer('add_10').output,model.get_layer('add_11').output,model.get_layer('add_12').output,model.get_layer('add_13').output,model.get_layer('add_14').output,model.get_layer('add_15').output,model.get_layer('add_16').output])
        return hypercol_model

Я загружаю каждое изображение из генератора с batch_size = 1, но после запуска нескольких изображений выдает ошибку «Недостаточно памяти (OOM)». Я не мог понять потенциальную причину этой проблемы. Может кто-нибудь объяснить причину этого и что я должен сделать, чтобы избежать этой ошибки. Ошибка происходит для преобразования тензора в массив numpy outarray = K.eval(out) на этом этапе. Я не мог придумать какой-либо другой способ преобразовать тензор в ноль. Но я не понял, почему это преобразование не выдает никакой ошибки для самого первого изображения. Это мой генератор:

def initgenerator(batch_size,target_size,train_images_list):
        train_images_list = iter(train_images_list)
        target_size = target_size[:2]
        while True:
            img_out = np.zeros(((batch_size,)+target_size+(3,)))
            for i in range(batch_size):
                img_file = next(train_images_list)
                print(img_file)
                img_path = 'JPEGImages/'+img_file+'.jpg'
                print(img_path)
                # Read and resize image and mask
                img = cv2.imread(img_path, cv2.IMREAD_COLOR) # BGR
                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #RGB
                img = cv2.resize(img,target_size)
                img = preprocess_input(img)
                img_out[i,:,:,:] = img.astype(np.float32)


            yield(img_out)

Train_images_list - список имен файлов изображений. размер партии равен 1, а целевой размер равен (224,224,3)

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