【NCC】TF版转Pytorch版

本文探讨了在使用PyTorch实现《Discovering causal signals in images》中NCC和NCC-ResNet50模块时遇到的问题,涉及数据格式调整、模型细节解析,以及如何调试和优化以接近原作者结果。
摘要由CSDN通过智能技术生成

GitHub - zzl421/NCC-pytorch: pytorch vision of NCC

目前在用pytorch复现Discovering causal signals in image这篇文章。

整篇文章大体分为两个部分:NCC,NCC-ResNet50。两个部分我复现的结果是0.73/0.93,对应作者代码是0.79/0.96,但当把两个模块组合使用时,无法复现原作者的结论。用作者的两个模块测试我复现的两个模块,发现都有问题。

一、NCC

1. 数据生成:用的论文作者提供的数据生成代码

2. NCC模型:四层,每一层包括Linear-Normalization-relu-dropout,前两层称为embeded layer,后两层称为classification layer.

输入 => embeded layer - reduce_mean - classificaiton layer - sigmoid => 输出

pytorch的Linear与TF的Dense不同,需要指定输入数据的维度;同时Normalizaiton层需要调换Linear输出的数据维度顺序,确保输入Normalization层的第二维长度是固定的(Linear输出维度)

二、NCC-ResNet50

输入 => vgg_preprocessing => ResNet50 => 512-512-20 

其中,ResNet50的最后一层fc需要去掉,使用global pooling输出的2048维特征。我在复现中没有使用vgg_preprocessing,之后考虑加入后重新测试:

vgg_preprocessing:

1. 面向训练的预处理形式,
随机获取短边长度在[256, 512]这个范围中,等比例resize图片。
resize_side = tf.random_uniform([], minval=_RESIZE_SIDE_MIN, _RESIZE_SIDE_MAX+1)
_aspect_preserving_resize(image, resize_side)
随机获取224x224的切片
image = __random_crop([image], output_height, output_width)[0]
image.set_shape([output_height, output_width, 3])
tf.to_float(image)
随机水平镜像
if,image.random_flip_left_right(image)
减去ImageNet训练集的RGB均值
_mean_image_subtraction(image, [_R_MEAN, _G_MEAN, _B_MEAN])

2. 面向测试的预处理形式
给定短边长度为256,等比例resize图片。
中心切片裁出来224x224的大小图像
减去ImageNet训练集的RGB均值

三、总结

1. NCC模型很简单,但我感觉输入的数据格式我还没有理解,我复现的Pytorch版,抖动非常厉害,我觉得出了和优化器有一定关系外,和数据输入应该关系也很大。

 2. NCC-ResNet50,有两个问题需要解决,一个是输入的features到底是resnet-50第几层的输出;没写数据预处理和增强的部分。

3. Debug小技巧

import pdb
pdb.set_trace()
n # 执行下一行
p self.xx.shape # 输出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值