【问题标题】:Keras: Load checkpoint weights HDF5 generated by multiple GPUsKeras:加载由多个 GPU 生成的检查点权重 HDF5
【发布时间】:2017-05-11 13:25:08
【问题描述】:

检查点sn-p:

checkpointer = ModelCheckpoint(filepath=os.path.join(savedir, "mid/weights.{epoch:02d}.hd5"), monitor='val_loss', verbose=1, save_best_only=False, save_weights_only=False)
hist = model.fit_generator(
    gen.generate(batch_size = batch_size, nb_classes=nb_classes), samples_per_epoch=593920, nb_epoch=nb_epoch, verbose=1, callbacks=[checkpointer], validation_data = gen.vld_generate(VLD_PATH, batch_size = 64, nb_classes=nb_classes), nb_val_samples=10000
)

我在多 GPU 主机上训练了我的模型,该主机以 HDF5 格式转储 mid 文件。当我使用 keras.load_weights('mid') 将它们加载到单个 GPU 机器上时,出现错误:

Using TensorFlow backend.
Traceback (most recent call last):
  File "server.py", line 171, in <module>
    model = load_model_and_weights('zhch.yml', '7_weights.52.hd5')
  File "server.py", line 16, in load_model_and_weights
    model.load_weights(os.path.join('model', weights_name))
  File "/home/lz/code/ProjectGo/meta/project/libpolicy-server/.virtualenv/lib/python3.5/site-packages/keras/engine/topology.py", line 2701, in load_weights
    self.load_weights_from_hdf5_group(f)
  File "/home/lz/code/ProjectGo/meta/project/libpolicy-server/.virtualenv/lib/python3.5/site-packages/keras/engine/topology.py", line 2753, in load_weights_from_hdf5_group
    str(len(flattened_layers)) + ' layers.')
ValueError: You are trying to load a weight file containing 1 layers into a model with 21 layers.

有没有办法在单个 GPU 机器上加载由多个 GPU 生成的检查点权重?似乎没有任何 Keras 问题讨论过这个问题,因此我们将不胜感激。

【问题讨论】:

  • 你能在同一个多GPU机器上加载吗?错误消息说有许多层不匹配。模型有多少层?
  • @YaoZhang 权重可以在源机器上仅加载 model.load_weights()model.yml 和多 GPU 机器上的模型都有 21 层。

标签: tensorflow hdf5 keras


【解决方案1】:

您可以像这样在单个 GPU 上加载模型:

from keras.models import load_model

multi_gpus_model = load_model('mid')
origin_model = multi_gpus_model.layers[-2]  # you can use multi_gpus_model.summary() to see the layer of the original model
origin_model.save_weights('single_gpu_model.hdf5')

'single_gpu_model.hdf5'是可以加载到单GPU机器模型的文件。

【讨论】:

  • 很好的解决方案。但是如果因为系统只有一个gpu而无法制作模型怎么办?也就是说,multi_gpus_model 不能制作?这是我的情况......我不能做第一步(加载多GPU模型)。
【解决方案2】:

试试这个功能:

def keras_model_reassign_weights(model_cpu,model_gpu):
    weights_temp ={}
    print('_'*5,'Collecting weights from GPU model','_'*5)
    for layer in model_gpu.layers:
        try:
            for layer_unw in layer.layers:
                #print('Weights extracted for: ',layer_unw.name)
                weights_temp[layer_unw.name] = layer_unw.get_weights()
            break
        except:
            print('Skipped: ',layer.name)
    print('_'*5,'Writing weights to CPU model','_'*5)
    for layer in model_cpu.layers:
        try:
            layer.set_weights(weights_temp[layer.name])
            #print(layer.name,'Done!')
        except:
            print(layer.name,'weights does not set for this layer!')
    return model_cpu

但您需要先将权重加载到您的 gpu 模型中:

#load or initialize your keras multi-gpu model
model_gpu = None 
#load or initialize your keras model with the same structure, without using keras.multi_gpu function
model_cpu = None 
#load weights into multigpu model
model_gpu.load_weights(r'gpu_model_best_checkpoint.hdf5') 
#execute function
model_cpu = keras_model_reassign_weights(model_cpu,model_gpu)
#save obtained weights for cpu model
model_cpu.save_weights(r'CPU_model.hdf5')

转移后,您可以在单个 GPU 或 CPU 模型上使用权重。

【讨论】:

  • 您能否将代码添加到您的答案中,而不是链接到您的 git-repository。
猜你喜欢
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
相关资源
最近更新 更多