Pytorchは、ロードする前にトレーニングモデルの一部のパラメーターと、一部の凍結パラメーター(実際のプロジェクトコードで測定)をロードします。

私の要件は、さまざまなモデルを試し続けるため、モデルブロックが常に変化することです。毎回トレーニングを再開するには時間がかかります。

以前に実行したモデルはResNetでした-> 3つのResNetパラメーターが共有されました。

                              ResNet->中間モジュール->結果

                              ResNet->

 

ここで、再トレーニングするためにパラメーター共有なしでResNet 1-> 3つのResNetに変更したいと思います。前のモデルの中間モジュールのパラメーターをインポートしたいのですが、

                              ResNet2->中間モジュール->結果    

                              ResNet 3->

また、中央のモジュールのパラメーターをフリーズすると、トレーニング速度が速くなります。

2つの偉大な神々の2つのブログ投稿を参照してください:いくつかのパラメーターをロードするhttps://blog.csdn.net/weixin_41519463/article/details/101604662、いくつかのパラメーターをフリーズするhttps://blog.csdn.net/jdzwanghao/article/詳細/ 83239111

具体的なコードは次のとおりです。

net = MY_Net( )
######导入部分参数
	model_dict = net.state_dict()
	for k, v in model_dict.items():
		print(k)

	pretrained_dict = torch.load(model_file1)#model_file1是之前模型的模型保存路径,这里只是加载参数而已
	for k, v in pretrained_dict.items():
		print(k)
	pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}

	model_dict.update(pretrained_dict)  # 用预训练模型参数更新new_model中的部分参数

	net.load_state_dict(model_dict)  # 将更新后的model_dict加载进new model中


##### 冻结部分参数
	for param in net.parameters():
		param.requires_grad = False#设置所有参数不可导,下面选择设置可导的参数
	for param in net.ResNet1.parameters():
		param.requires_grad = True
	for param in net.ResNet2.parameters():
		param.requires_grad = True
	for param in net.ResNet3.parameters():
		param.requires_grad = True

optimizer = optim.SGD(filter(lambda p: p.requires_grad, net.parameters()), lr = 0.0001, momentum=0.90,weight_decay=0.0005)#关键是优化器中通filter来过滤掉那些不可导的参数

 

おすすめ

転載: blog.csdn.net/qq_36401512/article/details/105076090