Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有内部tf模型的数据生成器的fit_生成器中的Tensorflow/Keras死锁_Python_Tensorflow_Keras_Deadlock_Python Multiprocessing - Fatal编程技术网

Python 具有内部tf模型的数据生成器的fit_生成器中的Tensorflow/Keras死锁

Python 具有内部tf模型的数据生成器的fit_生成器中的Tensorflow/Keras死锁,python,tensorflow,keras,deadlock,python-multiprocessing,Python,Tensorflow,Keras,Deadlock,Python Multiprocessing,任务 在本身包含tensorflow或keras模型的数据生成器上运行keras.model.fit_generator,并使用\u multiprocessing=True和多个辅助对象 这个问题非常相关: def create_minimal_keras_model(): #####创建模型A##### in1=keras.layers.Input(shape=(1,)) d=keras.层密(1)(in1) a=keras.Model(输入=in1,输出=d) opt=keras.opti

任务

在本身包含tensorflow或keras模型的数据生成器上运行
keras.model.fit_generator
,并使用\u multiprocessing=True和多个辅助对象

这个问题非常相关:

def create_minimal_keras_model():
#####创建模型A#####
in1=keras.layers.Input(shape=(1,))
d=keras.层密(1)(in1)
a=keras.Model(输入=in1,输出=d)
opt=keras.optimizers.Adam(lr=0.01)
损失=keras.loss.mse
a、 编译(选择,丢失)
#####
归还
类TestGenerator(keras.utils.Sequence):
定义初始化(自):
self.len=int(1e2)
self.model=None
#self.init_模型()
def初始_模型(自):
self.graph=tf.graph()
使用self.graph.as_default():
self.model=create_minimal_keras_model()
定义(自我):
"""
生成器的批数。
"""
返回self.len
定义uu获取项目uu(自身,索引):
"""
用于生成批次的Keras序列方法。
"""
如果不是self.model:
self.init_模型()
如果是self.model:
使用self.graph.as_default():
res=self.model.predict(np.array([1]))
返回(np.array([index]),np.array([-index/2+3]))
错误

训练在第二个纪元开始时暂停

我尝试的

  • 初始化数据生成器时的初始模型(主进程)
  • 第一代循环调用时的初始模型(子流程)
  • 调用tf.Session()和其他函数会在第一个历元开始时导致死锁
完整的示例代码:

将tensorflow导入为tf
将tensorflow.keras导入为keras
将numpy作为np导入
导入操作系统
def create_minimal_keras_model():
#####创建模型A#####
in1=keras.layers.Input(shape=(1,))
d=keras.层密(1)(in1)
a=keras.Model(输入=in1,输出=d)
opt=keras.optimizers.Adam(lr=0.01)
损失=keras.loss.mse
a、 编译(选择,丢失)
#####
归还
类TestGenerator(keras.utils.Sequence):
定义初始化(自):
self.len=int(1e2)
self.model=None
#self.init_模型()
def初始_模型(自):
self.graph=tf.graph()
使用self.graph.as_default():
self.model=create_minimal_keras_model()
定义(自我):
"""
生成器的批数。
"""
返回self.len
定义uu获取项目uu(自身,索引):
"""
用于生成批次的Keras序列方法。
"""
如果不是self.model:
self.init_模型()
如果是self.model:
使用self.graph.as_default():
res=self.model.predict(np.array([1]))
返回(np.array([index]),np.array([-index/2+3]))
os.environ['CUDA_VISIBLE_DEVICES']='
a=创建最小keras模型()
a、 摘要()
##########################################
#####函数在第一个纪元之前停止#####
##########################################
#tf.会议()
#a.保存权重(“tmp\U模型权重.h5”)
#a.负载重量('tmp\U型号重量.h5')
#a.save('tmp_model.h5')
#keras.models.load_model('tmp_model.h5'))
##########################################
##########################################
##########################################
##########################################
#####不会导致死锁的函数#####
##########################################
tf.get_default_session()
tf.Graph()
keras.\uuu版本__
使用tf.device('/cpu:0'):
_=tf.常数(0)
keras.utils.plot_model(a,to_file=('tmp_plot_model.png'),show_shapes=True)
[a.get_layer(l_名称)。在[a.layers[-1].name]中为l_名称输出
_=keras.backend.variable(4)
_=keras.backend.image\u data\u format()
_=keras.backend.shape(tf.constant(1,shape=(5,5,5)))
_=a.layers[0]。获取配置()
tf.random.set_random_seed(0)
##########################################
##########################################
##########################################
#训练将在第二阶段结束
a、 fit_generator(generator=TestGenerator(),每_epoch的步数=100,epoch=5,worker=4,使用_multiprocessing=True)
问题 对于在多进程培训中运行tensorflow模型的数据生成器,我有哪些选择

我确定的选择是:

  • 为数据生成器使用Pytork或其他环境
  • 在docker容器中作为服务运行模型
  • 预运行模型并创建数据集的修改副本
  • 创建为模型服务的独立python脚本,并通过ZeroMQ或类似工具进行通信

在您的第一个链接中,建议使用python 3.4+并更改多处理分叉的处理方式,您尝试过吗?是的,然后我得到以下错误:。。。。文件“/usr/lib/python3.5/multiprocessing/reduce.py”,第59行,在dump ForkingPickler(文件,协议)中。dump(obj)TypeError:cannotpickle\u thread.lock我不确定。但这可能是由于使用
keras.utils.Sequence
作为生成器的基类造成的。在您的第一个链接中,建议使用python 3.4+并更改多处理forks的处理方式,您尝试过吗?是的,然后我得到以下错误:。。。。文件“/usr/lib/python3.5/multiprocessing/reduce.py”,第59行,在dump ForkingPickler(文件,协议)中。dump(obj)TypeError:cannotpickle\u thread.lock我不确定。但这可能是由于使用
keras.utils.Sequence
作为生成器的基类造成的。