K.eval()在keras中给出内存不足错误

我正在使用keras.backend.eval()将从图像分类网络生成的超柱模型的输出张量转换为numpy数组,并且它在几个张量(例如120张量)上运行良好。我正在使用生成器将图像一张一张地加载到模型的输入中,但是仍然在运行120张量后,却给了我out of memory错误。这可能是潜在的问题,还有其他方法可以将张量转换为numpy数组。

代码如下:

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])
            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]])
    out = (activation('sigmoid'))(out)
    print(out.shape)
    out = (ZeroPadding2D((1,1)))(out)
    out = (Conv2D(20,3)))(out)
    print('conversion of tensor to numpy')
    outarray = tf.squeeze(out)
    outarray = K.eval(outarray)
    ourarray = np.array(outarray)
    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

这里的模型是像这样加载的图像分类模型:

model = load_model('ResnetTL4.h5',custom_objects={'precision_m': precision_m,'recall_m':recall_m})

图像由下面给出的生成器加载:

def initgenerator(batch_size,target_size,train_images_list):
        mean_pixel = np.array([104.0,117.0,123.0])
        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                                                                                                                             print(img.shape)                                                                                                                                                            img = nd.zoom(img.astype('float32'),(224/float(img.shape[0]),224/float(img.shape[1]),1.0),order=1)                                                                        
                img = img - mean_pixel                                                                                                                                                      
                img_out[i,:,:] = img.astype(np.float32)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
            yield(img_out)         

EDIT2:

    def gethypercols(model,image):
        model = hypercol_model(model)
        output = model.predict(image)                                                                                                                                               
        print(len(output))
        gen = gen_model(model)
        outarray = gen.predict(image)
        print(outarray.shape)
        print(type(outarray))
        outarray = np.squeeze(outarray)
        return outarray

    def gen_model(model):
            output = model.output
            print(type(output))
            factor = 2
            print(len(output))
            for i in range(len(output)):
                    output[i] = (ZeroPadding2D((1,1)))(output[i])
                    output[i] = (Conv2D(100,3)))(output[i])
                    if i in (0,2):
                            output[i] = UpSampling2D(size = (factor**2,interpolation='bilinear')(output[i])
                    elif i in (3,6):
                            output[i] = UpSampling2D(size = (factor**3,interpolation='bilinear')(output[i])
                    elif i in (7,12):
                            output[i] = UpSampling2D(size = (factor**4,interpolation='bilinear')(output[i])
                    else:
                            output[i] = UpSampling2D(size = (factor**5,interpolation='bilinear')(output[i])
            out = Add(name='add100')([output[0],output[15]])
            out = (activation('sigmoid',name='act2'))(out)
            out = (ZeroPadding2D((1,1)))(out)
            out = (Conv2D(20,3)))(out)
            model = Model(inputs=[model.input],outputs=[out])
            return model

    def hypercol_model(model):
            hypercol_model = Model(inputs=[model.input],model.get_layer('add_16').output])
            return hypercol_model
liyunfei97 回答:K.eval()在keras中给出内存不足错误

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3134940.html

大家都在问