c调用python keras模型_python-2.7 – keras模型的多处理用单GPU预测

背景

我想使用带有Inception-Resnet_v2的keras来预测病理图像.我已经训练了模型并得到了.hdf5文件.由于病理图像非常大(例如:20,000 x 20,000像素),因此我必须扫描图像以获得用于预测的小补丁.

我想使用python2.7的多处理库来加速预测过程.主要思想是使用不同的子进程扫描不同的行,然后将补丁发送到模型.

我看到有人建议在子进程中导入keras和加载模型.但我认为它不适合我的任务.使用keras.models.load_model()加载模型一次将花费大约47s,这非常耗时.因此,每次启动新的子进程时,我都无法重新加载模型.

我的问题是我可以在主进程中加载​​模型并将其作为参数传递给子进程吗?

我尝试过两种方法,但两种方法都不起作用.

方法1.使用multiprocessing.Pool

代码是:

import keras

from keras.models import load_model

import multiprocessing

def predict(num,model):

print dir(model)

print num

model.predict("image data, type:list")

if __name__ == '__main__':

model = load_model("path of hdf5 file")

list = [(1,model),(2,model),(3,model),(4,model),(5,model),(6,model)]

pool = multiprocessing.Pool(4)

pool.map(predict,list)

pool.close()

pool.join()

输出是

cPickle.PicklingError: Can't pickle : attribute lookup __builtin__.module failed

我搜索了错误,发现Pool无法映射无法填充的参数,所以我尝试方法2.

方法2.使用multiprocessing.Process

代码是

import keras

from keras.models import load_model

import multiprocessing

def predict(num,model):

print num

print dir(model)

model.predict("image data, type:list")

if __name__ == '__main__':

model = load_model("path of hdf5 file")

list = [(1,model),(2,model),(3,model),(4,model),(5,model),(6,model)]

proc = []

for i in range(4):

proc.append(multiprocessing.Process(predict, list[i]))

proc[i].start()

for i in range(4):

proc[i].join()

在方法2中,我可以打印dir(模型).我认为这意味着模型成功传递给子进程.但我得到了这个错误

E tensorflow/stream_executor/cuda/cuda_driver.cc:1296] failed to enqueue async memcpy from host to device: CUDA_ERROR_NOT_INITIALIZED; GPU dst: 0x13350b2200; host src: 0x2049e2400; size: 4=0x4

我使用的环境:

> Ubuntu 16.04,python 2.7

> keras 2.0.8(tensorflow后端)

>一个Titan X,驱动程序版本384.98,CUDA 8.0

期待回复!谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值