keras计算机内存不足,python - 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,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)

编辑2:

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,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(name='add100')([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',name='act2'))(out)

out = (ZeroPadding2D((1,1)))(out)

out = (Conv2D(20,(3,3)))(out)

model = Model(inputs=[model.input],outputs=[out])

return model

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值