python - 为感知损失计算 VGG 特征的正确方法
问题描述
在计算VGG Perceptual loss的时候,虽然没见过,但是感觉把 GT 图像的 VGG 特征的计算封装在里面就可以了torch.no_grad()
。
所以基本上我觉得以下就可以了,
with torch.no_grad():
gt_vgg_features = self.vgg_features(gt)
nw_op_vgg_features = self.vgg_features(nw_op)
# Now compute L1 loss
或者应该使用,
gt_vgg_features = self.vgg_features(gt)
nw_op_vgg_features = self.vgg_features(nw_op)
在这两种方法requires_grad
中,都设置了 VGG 参数False
并将 VGG 置于eval()
模式。
第一种方法将节省大量 GPU 资源,并且感觉应该在数值上等于第二种方法,因为不需要通过 GT 图像进行反向传播。但在大多数实现中,我发现第二种方法用于计算 VGG 感知损失。
那么在 PyTorch 中实现 VGG 感知损失时,我们应该选择哪个选项呢?
解决方案
第一种方式:
with torch.no_grad():
gt_vgg_features = self.vgg_features(gt)
nw_op_vgg_features = self.vgg_features(nw_op)
尽管 VGG 处于eval
模式并且其参数保持固定,但您仍然需要通过它将梯度从特征损失传播到输出nw_op
。但是,没有理由计算这些梯度 wrt gt
。
推荐阅读
- javascript - 在表格的顶部覆盖 SVG
- python - 将随机样本列添加到数据框中
- r - Purrr(或扫帚)用于计算分组数据集的比例测试(多比例测试)
- reactjs - arr[Symbol.iterator] 在使用 useState 和上下文时不是函数
- javascript - 通过环境变量设置代理以在 AWS EC2 上部署 React 应用程序
- apache-kafka - 将 Pcap 从 Suricata 发送到 Kafka
- wpf - 我可以在“x”命名空间中创建 XAML 属性吗
- python - 重命名 JSON 键名
- time - 用 php Carbon 转换 javascript 时间会返回奇怪的时间?
- java - 找不到来自另一个 maven 项目的 Bean/Component