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
解决方案
推荐阅读
- postgresql - 如何将 postgres 中 ksuid 的默认值赋予列?postgres中是否有ksuid的替代品?
- r - 使用 ggplotly() 时删除构面之间的空白
- java - Spring JPA 实体映射 LocalDate 和 LocalDateTime 字段到 Sql Server
- dataweave - Mulesoft 条件语句
- terraform - 如何在 terraform 代码中访问 terragrunt 变量
- ubuntu - 即使我正确输入密码,Oracle VirtualBox Ubuntu OS 也无法打开我的虚拟机
- amazon-web-services - AWS 连接超时 + EC2 实例连接不起作用
- c# - 源更改时如何更新 Xamarin 数据绑定
- html - 多个绝对定位元素重叠
- r - 如何在棒棒糖图形上添加图例?