我正在尝试利用tensorflow的预训练Bert模型,该模型具有大约1.1亿个参数,使用我的gpu几乎不可能训练这些参数。冻结整个图层会使所有这些参数都无法获取。
是否可以使该层部分可训练?比如有几百万个参数是可训练的,其余的是不可训练的吗?
input_ids_layer = tf.keras.layers.Input(shape=(max_len,), dtype=tf.int32, name='input_ids')
input_attention_layer = tf.keras.layers.Input(shape=(max_len,), dtype=tf.int32, name='attention_mask')
model = TFAutoModel.from_pretrained("bert-base-uncased")
for layer in model.layers:
for i in range(len(layer.weights)):
//assuming there are 199 weights
if i>150:
layer.weights[i]._trainable = True
else:
layer.weights[i]._trainable = False
我不知道如何在一层内训练一些重量,但我仍然建议你做"标准方式":在这种情况下,冻结图层通常是为了避免重新训练所有内容。但是,您不能冻结所有层,因为这将是无用的。你想做的是冻结除了最后几层之外的所有东西,然后训练神经网络。
这是因为第一层通常学习非常的抽象特征,因此在许多问题上都是可转移的。另一方面,最后一层通常基于当前数据集学习真正解决手头任务的功能。
因此,如果你想在另一个数据集中重新训练一个预训练的模型,你只需要重新训练最后几层。您还可以通过添加一些密集层并更改最后一层的输出来编辑神经网络的最后一层,例如,如果要预测的类的数量与原始数据集不同,则这很有用。有很多简短而简单的教程,你可以在网上学习。
总结:
- 冻结所有层除了最后一层
- (可选(创建新层并将其与倒数第二层的输出链接
- 培训网络