首先所有网络都要继承nn.Module,不论是残差块还是网络主体。
然后写网络的时候涉及到几个简单的函数,没啥说的,简单提几句。
第一个函数时卷积函数,这里只说2d的卷积
nn.Conv2d(in_channel,out_channel, kernel,stride,padding)
#其中in_channel和out_channel分别代表输入、输出的网络通道数
另一个函数是bn层
nn.BatchNorm2d(num_channel)
#这个函数是利用高斯分布归一化数据,细节就是利用同一个数据通道求取均值和方差
#这个num_channel参数实际上就是总体通道数参数
下一个函数是激活函数relu
nn.Relu(inplace=True)
#这个函数的参数是一个布尔值,当他为True时会把结果直接覆盖给输入,
#这样就避免了重复的内存读写和占用。
#一般设置为True。
这个函数是用在残差块相加的函数
residual = x
x = self.bn(self.conv1(x))
x = torch.add(x, residual)
最后一个函数是:
nn.PixelShuffle(upscale_factor)
#这个函数看过那篇论文的就懂了,就是espcn
剩下的就是总结一下:
- 网络的继承都是nn.Module
- 一般网络的class要有in_channel,out_channel,upscal_factor,kernel,stride,padding这些参数
- 在__init__里面要写各种层的操作(通道数,卷积核,步长等等),以及层的命名
- 要重写forward函数
关于写完的网络的测试,可以用
torch,randn(batchnumber,channelnumber,h,w)
#这个函数可以随机一个类型的tensor
方便测试网络输入输出!