4

我有 keras 预训练模型(model.h5)。我想用基于 tensorflow Magnitude 的 Keras 权重修剪来修剪该模型。一件奇怪的事情是,我的预训练模型是使用原始 keras 模型构建的 > 我的意思是这不是来自 tensorflow.keras。在 tensorflow 基于 Magnitude 的权重修剪与 Keras 示例中,他们展示了如何使用 tensorflow.keras 模型。我想问一下,我可以使用他们的工具来修剪我原来的 keras 预训练模型吗?

在他们的权重修剪工具包中,有两种方法。一是在训练时逐层修剪模型,二是修剪整个模型。我尝试了第二种方法来修剪整个预训练模型。下面是我的代码。在他们的权重修剪工具包中,有两种方法。一是在训练时逐层修剪模型,二是修剪整个模型。我尝试了第二种方法来修剪整个预训练模型。下面是我的代码。对于我原来的预训练模型,我从 model.h5 加载权重,并且在我应用 prune_low_magnitude() 后可以调用 model.summary() 模型中的任何方法都不能调用,包括 model.summary() 方法。并显示类似 AttributeError: 'NoneType' object has no attribute 'summary' 的错误

model = get_training_model(weight_decay)
model.load_weights('model/keras/model.h5')
model.summary()


epochs = 1
end_step = np.ceil(1.0 * 100 / 2).astype(np.int32) * epochs
print(end_step)

new_pruning_params = {
      'pruning_schedule': tfm.sparsity.keras.PolynomialDecay(initial_sparsity=0.1,
                                                   final_sparsity=0.90,
                                                   begin_step=40,
                                                   end_step=end_step,
                                                   frequency=30)
}

new_pruned_model = tfm.sparsity.keras.prune_low_magnitude(model, **new_pruning_params)
print(new_pruned_model.summary())

在他们的权重修剪工具包里面 输入链接描述,有两种方法。一是在训练时逐层修剪模型,二是修剪整个模型。我尝试了第二种方法来修剪整个预训练模型。下面是我的代码。对于我原来的预训练模型,我从 model.h5 加载权重,并且在我应用 prune_low_magnitude() 后可以调用 model.summary() 模型中的任何方法都不能调用,包括 model.summary() 方法。并显示错误

AttributeError:“NoneType”对象没有属性“摘要”

4

1 回答 1

1

我希望这个答案仍然有帮助,但我最近遇到了同样的问题,它prune_low_magnitude()返回了一个“无”类型的对象。也new_pruned_model.compile()行不通。

我一直使用的模型是一个预训练模型,可以从tensorflow.python.keras.applications.

对我来说,这很有效:

(0) 导入库:

from tensorflow_model_optimization.python.core.api.sparsity import keras as sparsity
from tensorflow.python.keras.applications.<network_type> import <network_type>

(1) 定义预训练模型架构

# define model architecture
loaded_model = <model_type>()
loaded_model.summary()

(2) 编译模型架构并加载预训练的权重

# compile model
opt = SGD(lr=learn_rate, momentum=momentum)
loaded_model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
loaded_model.load_weights('weight_file.h5')

(3) 设置剪枝参数并分配剪枝时间表

# set pruning parameters
pruning_params = {
  'pruning_schedule': sparsity.PolynomialDecay(...)
}

# assign pruning schedule
model_pruned = sparsity.prune_low_magnitude(loaded_model, **pruning_params)

(4) 编译模型并显示摘要

# compile model
model_pruned.compile(
loss=tf.keras.losses.categorical_crossentropy,
optimizer='SGD',
metrics=['accuracy'])

model_pruned.summary()

重要的是tensorflow.python.keras从 TensorFlow 库中专门导入库并使用这个 keras 模型。

此外,使用 TensorFlow Beta Release ( pip install tensorflow==2.0.0b1) 也很重要,否则仍然会返回类型为“None”的对象prune_low_magnitude

我使用 PyCharm 2019.1.3 (x64) 作为 IDE。这是导致我找到此解决方案的链接:https ://github.com/tensorflow/model-optimization/issues/12#issuecomment-526338458

于 2019-10-18T08:03:16.347 回答