El modelo personalizado (modificado) en Pytorch carga la parte requerida de los parámetros del modelo de entrenamiento previo y se congela

Parte de este artículo se refiere a https://zhuanlan.zhihu.com/p/34147880

1. Este método es más versátil, carga los parámetros del modelo de preentrenamiento según los parámetros de su propio modelo y le asigna el mismo nombre. Si agrega algunas capas al modelo original, no se cargará

dict_trained=torch.load(self.args.load_path, map_location=torch.device('cpu'))
dict_new=model.state_dict()
# 1. filter out unnecessary keys
dict_trained = {
    
    k: v for k, v in dict_trained.items() if k in dict_new}
# 2. overwrite entries in the existing state dict
model_dict.update(dict_trained)
model.load_state_dict(dict_new)

2. Esto es mucho más complicado y puedes cambiarlo según tus propias necesidades. Por ejemplo, en el mío, este modelo agrega cuatro capas de 'dense', 'unary_affine', 'binary_affine', 'classifier', pass j+ =8, omita Su peso y sesgo, esto puede referirse a la disminución del peso. Al mismo tiempo, la parte 'crf' de los parámetros del modelo original no se cargará.

dict_trained = torch.load(self.args.load_path, map_location=torch.device('cpu'))
dict_new = self.model.state_dict().copy()
trained_list = list(dict_trained.keys())
new_list = list(dict_new.keys())
j = 0
no_loda = {'dense', 'unary_affine', 'binary_affine', 'classifier'}
for i in range(len(trained_list)):
     flag = False
     if 'crf' in trained_list[i]:
         continue
     for nd in no_loda:
         if nd in new_list[j] and 'bert' not in new_list[j]:
             flag = True
     if flag:
         j += 8  # no_loda的dense和bias掠过
     else:
         dict_new[new_list[j]] = dict_trained[trained_list[i]]
         if new_list[j] != trained_list[i]:
             print("i:{},new_state_dict: {}  trained state_dict: {}不一致".format(i, new_list[j], trained_list[i]))
     j += 1 #keys不对齐
model.load_state_dict(dict_new)

Más tarde se enteró de que hay una manera más fácil :

Es decir, después de configurar su propio modelo, si solo desea utilizar los parámetros de la misma estructura del modelo preentrenado, es decir, establezca el parámetro estricto en Falso al cargar . El valor de este parámetro es True por defecto, lo que significa que la capa del modelo pre-entrenado se corresponde estrictamente con la capa de estructura de red definida por sí mismo (como el nombre y la dimensión de la capa), de lo contrario no se puede cargar. como sigue:

model.load_state_dict(torch.load(self.args.load_path, strict=False))

PD: si encuentra un error, es posible que desee imprimir las claves de los parámetros del modelo que ha modificado y las claves para cargar los parámetros del modelo para echar un vistazo y recetar el medicamento correcto.

3. Congele estas capas de parámetros

Simplemente pon

for k in model.paramers:
	k.requires_grad=False

Hay muchos métodos, aquí usamos el método de congelación correspondiente al método anterior

Se recomienda echar un vistazo a
https://discuss.pytorch.org/t/how-the-pytorch-freeze-network-in-some-layers-only-the-rest-of-the-training/7088
o
https://discuss .pytorch.org/t/correct-way-to-freeze-layers/26714
o
correspondientemente, durante el entrenamiento, solo el parámetro que require_grad = True puede actualizarse en el optimizador, por lo que

optimizer = torch.optim.Adam( filter(lambda p: p.requires_grad, net.parameters(),lr) )

Supongo que te gusta

Origin blog.csdn.net/weixin_42455006/article/details/125459110
Recomendado
Clasificación