Python 使用不同的tf装置训练keras模型

Python 使用不同的tf装置训练keras模型,python,tensorflow,keras,Python,Tensorflow,Keras,我正在使用经过培训的模型表单keras。这个型号不适合GPU内存,所以我想把它分为CPU和GPU,可能在不同机器上的GPU上 1)因此,如果我想在我的CPU上获取所有tf.variable,并在GPU上进行计算,我该怎么做呢。因为有些文章显示,我们可以将tf.variable放在CPU上,将计算放在GPU上。(我说的是一款经过预培训的keras车型) 2)如果我想在不同的机器上将预先训练好的模型的层分离到不同的GPU中。将与tf.device一起使用,然后像这样将层添加到我的序列模型中,对吗 v

我正在使用经过培训的模型表单
keras
。这个型号不适合GPU内存,所以我想把它分为CPU和GPU,可能在不同机器上的GPU上

1)因此,如果我想在我的CPU上获取所有
tf.variable
,并在GPU上进行计算,我该怎么做呢。因为有些文章显示,我们可以将tf.variable放在CPU上,将计算放在GPU上。(我说的是一款经过预培训的
keras车型

2)如果我想在不同的机器上将预先训练好的模型的层分离到不同的GPU中。将
与tf.device一起使用,然后像这样将层添加到我的序列模型中,对吗

vgg16_model = keras.applications.vgg16.VGG16()
cnnModel = Sequential()

for layer in vgg16_model.layers[0:13]:
    cnnModel.add(layer)
for layer in vgg16_model.layers[14:16]:
    cnnModel.add(layer)
for layer in vgg16_model.layers[17:21]:
    cnnModel.add(layer)

with tf.device(........):
   cnnModel.add(Dense(2048, name="compress_1"))
   cnnModel.add(Dense(1024, name="compress_2"))
   cnnModel.add(Dense(512, name="compress_3"))

with tf.device(........):
    model = Sequential()
    model.add(keras.layers.TimeDistributed(cnnModel,input_shape=(10,224,224,3),name="CNN_Model"))

with tf.device(........):
    model.add(keras.layers.LSTM(256,name="lstm1",return_sequences=True))
    model.add(keras.layers.LSTM(128,name="lstm2",return_sequences=True))
    model.add(keras.layers.Flatten())
    model.add(keras.layers.Dense(528))
    model.add(keras.layers.Dense(64))
    model.add(keras.layers.Dense(39,activation='sigmoid'))
多谢各位

更新 我在想,我是否可以访问模型的张量变量中的属性
variable\u device
,并自行将其设置为CPU

顺便说一句,我正在使用tf.keras实现

更新2 我在张力板上试过一些,我可以看到:


这是否意味着计算和训练在CPU中,数据在GPU中?

是的,就是这样做的


请注意,因为在CPU和GPU以及其他机器之间复制变量需要时间。忽略GPU、使用一台机器或在完成多个批处理后仅在机器之间同步变量(异步SGD),您可能会获得更高的性能。

我确实需要这样做,因为网络有129.000.000个参数,无法放入GPU
4GO
内存。我提出的类似于代码的建议是共享权重和计算。如果我只想在CPU中设置权重,并在
GPU上进行计算,那么如何使用经过训练的'keras模型?如果我使用的是未经训练的NN,我只需要在
tf.device(CPU)中声明
tf.variable
但我不知道如何在经过培训的模型中访问这些变量保存的模型有两个组件:图形和会话。该图包含要执行的节点/操作。会话存储您拥有的变量的值。通常情况下,模型导出会清除设备的位置,因此当您导入它时,它运行的机器可以确定什么工作(如果您没有GPU)。您可以像前面提到的那样重新定义图形,将变量放置在CPU上,然后加载预训练模型的会话以获取变量值。您能在回答中进一步解释解决方案吗。谢谢你的帮助。我真的很欣赏,在像这样导入模型时,我没有弄清楚如何将
与cpu
结合使用:
vgg16\u model=keras.applications.vgg16.vgg16()