pytorch-resnet提取特征

1、利用resnet提取特征

根据ResNet的网络结构,fc充当分类器的角色,那么特征就是fc前一层的输出(fc层的输入)

作为分类器,fc的输入是512(这个由Resnet的层数决定,resnet18=512,resnet50=2048),fc的输出为nb-classes(由数据集决定):

输出特征,就把输出也改为512,那么输出的就是大小为[batch-size, 512]的特征。

for i, (images, target) in enumberate(train_loader):
	# ……
	resnet50_feature_extractor = models.resnet18(pretrained=True)
	resnet50_feature_extractor.fc = nn.Linear(512, 512)
	# y_features是特征:
	y_features = resnet50_feature_extractor(images)

2、引用模型中指定层

如果加载model和更改model参数不在一起执行,那么直接用resnet50_feature_extractor.fc形式引用fc层可能不准确(程序找不到你想更改的fc层)
因为model在pytorch是存成DataParallel格式的,此时要用:

	resnet50_feature_extractor.module.fc

3、边训练边输出特征

有时候,我们可能需要边训练边输出features。但我们希望还是针对分类模型进行优化,不针对features进行优化。
也就是说,我不打算改变优化函数(optimizer、loss,etc.)但我希望能同步输出当前的features。

for i, (images, target) in enumberate(train_loader):
	# ……
	resnet50_feature_extractor = copy.deepcopy(model)
	resnet50_feature_extractor.fc = nn.Linear(512, 512)
	# ---以下几行必须要有:---
	torch.nn.init.eye_(resnet50_feature_extractor.module.fc.weight)
	torch.nn.init.zeros_(resnet50_feature_extractor.module.fc.bias)
	for param in resnet50_feature_extractor.parameters():
	    param.requires_grad = False
	# ---------------------
	# y_features是特征:
	resnet50_feature_extractor = resnet50_feature_extractor.cuda()
	y_features = resnet50_feature_extractor(images)

	# 这两个output是一样的:
	output_from_features = model.module.fc(y_features )
	output_from_Img = model(images)

4、复制模型

需要deepcopy,否则还是修改原模型:

resnet50_feature_extractor = copy.deepcopy(model)
  • 3
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值