run里面配置参数,根据代码输入相应参数即可debug
train里面有个buld_model,跳进去 进入bulider。然后这时是build_model,调用的是这个实质的bulid函数(其他的都是build什么,比如有backone,loss啥的)
然后调用的是registry.py里面的函数
然后到basicsr.py的def --init--即构造器里面。java和python还是挺像的,比如继承父类,就算在这个类的括号(父类名)
之后就到这个BsicVsr网络了,这就是实质的网络结构了
这个大致debug倒是弄懂了。但是代码封装性太强 好难看 这里调用一下,那里调用下。
Backbone::
从字面意思来看,“backbone”的原意是“人的脊梁骨”,后来引申为“支柱,核心”。
在神经网络
中,尤其是CV领域,一般先利用主干网络对图像进行特征提取(常见的主干网络有vggnet,resnet,inception等)。
主干网络,用来做特征提取的网络,代表整个网络的一部分、前部分,一般是用于前端提取图片信息,生成特征图feature map,供后面的网络使用。这一部分是整个CV任务的基础、支柱、主干、核心和上游任务,因为后续的下游任务都是基于提取出来的图像特征去做文章(比如分类,生成等)。
这些“backbone”的特征提取能力很强,并且可以加载训练好的模型参数(比如官方在大型数据集(Pascal 、Imagenet)上训练好的),然后接自己的网络,进行微调(finetune)即可。
所以,将这一部分网络结构称为“backbone”十分形象。
Models和net的区别:
网络是一系列算法的集合或组合,它是某种预测的规则,例如按照什么方法去分析处理;而模型是网络+模型数据的产物,也就是说模型是包含了网络结构和训练数据的,网络是我们得到模型的工具;我们在做工程部署的时候一般会说部署模型,而不是网络;可见还是有一些差异的。
这个BasicVSR生成的网络:::::
BasicVSR(
(generator): BasicVSRNet(
(spynet): SPyNet(
(basic_module): ModuleList(
(0): SPyNetBasicModule(
(basic_module): Sequential(
(0): ConvModule(
(conv): Conv2d(8, 32, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(1): ConvModule(
(conv): Conv2d(32, 64, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(2): ConvModule(
(conv): Conv2d(64, 32, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(3): ConvModule(
(conv): Conv2d(32, 16, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(4): ConvModule(
(conv): Conv2d(16, 2, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
)
)
)
(1): SPyNetBasicModule(
(basic_module): Sequential(
(0): ConvModule(
(conv): Conv2d(8, 32, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(1): ConvModule(
(conv): Conv2d(32, 64, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(2): ConvModule(
(conv): Conv2d(64, 32, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(3): ConvModule(
(conv): Conv2d(32, 16, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(4): ConvModule(
(conv): Conv2d(16, 2, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
)
)
)
(2): SPyNetBasicModule(
(basic_module): Sequential(
(0): ConvModule(
(conv): Conv2d(8, 32, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(1): ConvModule(
(conv): Conv2d(32, 64, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(2): ConvModule(
(conv): Conv2d(64, 32, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(3): ConvModule(
(conv): Conv2d(32, 16, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(4): ConvModule(
(conv): Conv2d(16, 2, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
)
)
)
(3): SPyNetBasicModule(
(basic_module): Sequential(
(0): ConvModule(
(conv): Conv2d(8, 32, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(1): ConvModule(
(conv): Conv2d(32, 64, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(2): ConvModule(
(conv): Conv2d(64, 32, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(3): ConvModule(
(conv): Conv2d(32, 16, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(4): ConvModule(
(conv): Conv2d(16, 2, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
)
)
)
(4): SPyNetBasicModule(
(basic_module): Sequential(
(0): ConvModule(
(conv): Conv2d(8, 32, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(1): ConvModule(
(conv): Conv2d(32, 64, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(2): ConvModule(
(conv): Conv2d(64, 32, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(3): ConvModule(
(conv): Conv2d(32, 16, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(4): ConvModule(
(conv): Conv2d(16, 2, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
)
)
)
(5): SPyNetBasicModule(
(basic_module): Sequential(
(0): ConvModule(
(conv): Conv2d(8, 32, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(1): ConvModule(
(conv): Conv2d(32, 64, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(2): ConvModule(
(conv): Conv2d(64, 32, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(3): ConvModule(
(conv): Conv2d(32, 16, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
(activate): ReLU(inplace=True)
)
(4): ConvModule(
(conv): Conv2d(16, 2, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3))
)
)
)
)
)
(backward_resblocks): ResidualBlocksWithInputConv(
(main): Sequential(
(0): Conv2d(67, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): LeakyReLU(negative_slope=0.1, inplace=True)
(2): Sequential(
(0): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(1): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(2): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(3): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(4): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(5): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(6): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(7): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(8): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(9): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(10): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(11): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(12): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(13): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(14): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(15): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(16): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(17): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(18): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(19): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(20): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(21): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(22): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(23): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(24): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(25): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(26): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(27): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(28): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(29): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
)
)
)
(forward_resblocks): ResidualBlocksWithInputConv(
(main): Sequential(
(0): Conv2d(67, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): LeakyReLU(negative_slope=0.1, inplace=True)
(2): Sequential(
(0): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(1): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(2): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(3): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(4): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(5): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(6): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(7): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(8): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(9): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(10): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(11): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(12): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(13): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(14): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(15): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(16): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(17): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(18): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(19): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(20): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(21): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(22): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(23): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(24): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(25): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(26): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(27): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(28): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
(29): ResidualBlockNoBN(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(relu): ReLU(inplace=True)
)
)
)
)
(fusion): Conv2d(128, 64, kernel_size=(1, 1), stride=(1, 1))
(upsample1): PixelShufflePack(
(upsample_conv): Conv2d(64, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(upsample2): PixelShufflePack(
(upsample_conv): Conv2d(64, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(conv_hr): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv_last): Conv2d(64, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(img_upsample): Upsample(scale_factor=4.0, mode=bilinear)
(lrelu): LeakyReLU(negative_slope=0.1, inplace=True)
)
(pixel_loss): CharbonnierLoss()
)
感受野: