上周工作
SVInvNet论文研读
本周计划
加入DenseNet,修改网络架构,跑代码
总结
DenseNet
- 密集块:DenseNet将网络分成多个密集块(Dense Block)。在每个密集块内,每一层都连接到前面所有的层。这种跳跃连接有助于解决梯度消失问题,因为每一层都可以直接访问之前层的梯度信息,使得训练更加稳定。
- 特征重用性:由于每一层都与前面所有层连接,网络可以自动地学习到更加丰富和复杂的特征表示。有助于提高网络的性能,同时减少了需要训练的参数数量。
- 过渡层:在密集块之间,通常会使用过渡层来控制特征图的大小,从而减少计算量。
优点:
- 网络可以更好地利用浅层特征信息,从而提高网络的性能。
- 网络具有更强的特征重用能力,可以减少参数数量,降低过拟合风险。
- 网络训练更加稳定,可以缓解梯度消失和梯度爆炸等问题。
实验1——引入密集连接在编码器部分
前期太混乱,没有把densenet代码理解透彻,密集快和过渡块他们的通道数和尺寸具体每一层是如何变化的
后面自己先计算了尺寸以及通道变化,因为密集块部分根据Bottleneck层数来改变通道数,过渡层(BN+ReLU+1×1Conv+2×2AvgPooling)是通道数减半并且尺寸减半。
- 先采用(kernel_size=(7, 1), stride=(2, 1), padding=(3, 0)的卷积)将(,5,1000,70)变化到(,32,500,70),
- 再使用三个(kernel_size=(3, 1), stride=(2, 1), padding=(1, 0)卷积)变化到(,64,63,70),使尺寸近似方形
- 接着使用三个(密集块+过渡层),密集块层数是(6,12,8),变化到(,256,7,8)
- 再使用卷积变化到(,512,1,1)
self.convblock5 = ConvBlock(256, 512, kernel_size=(7, ceil(50 * sample_spatial/ 7)), padding=0)
- 解码部分跟InversionNet一致,未做改变
数据集:curvevel-a
Epochs = 120
Trainsize = 5000ValSize = 500
Testsize = 500TestBatchsize = 50
Batchsize = 64
但目前感觉网络架构有问题后续需要修改,比InversionNet一个epoch慢了1min。——因为DenseNet缺点有:
- 要进行多次Concatenate操作,数据需要被复制多次,显存容易增加得很快,需要一定的显存优化技术。
- 网络结构较为复杂,需要更多的计算资源和时间来训练。
- 在一些应用场景下,由于特征传递的过多,会导致内存占用较大。
使用以下预训练模型进行测试:
PreModelname = 'InversionNet_DenseNet_TrainSize5000_Epoch120_BatchSize64_LR0.001_epoch200.pkl'
测试结果如下:第三行
实验结果如下:
实验2——使用aba跑InversionNet
数据集:curvevel-a
Epochs = 120
Trainsize = 5000ValSize = 500
Testsize = 500TestBatchsize = 50
Batchsize = 64
Trained model saved: 100 percent completed
Training complete in 41m 43s
测试结果如下:
后续跑24000再看看结果
遇到的问题及解决
1.使用torchsummary时报错AttributeError: ‘list‘ object has no attribute ‘size‘:
查看torchsummary的源码,发现处理input的方法都是粗暴使用如下语句:
summary[m_key]["input_shape"] = list(input[0].size())
修改后:
# summary[m_key]["input_shape"] = list(input[0].size())if isinstance(input[0], torch.Tensor):summary[m_key]["input_shape"] = list(input[0].size())elif isinstance(input[0], list):summary[m_key]["input_shape"] = list(item.size() for item in input[0])
2.RuntimeError: Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.
原因:待转换类型的PyTorch Tensor变量带有梯度,直接将其转换为numpy数据将破坏计算图,因此numpy拒绝进行数据转换,实际上这是对开发者的一种提醒。如果自己在转换数据时不需要保留梯度信息,可以在变量转换之前添加detach()
调用。
解决办法:
y.numpy() ---> y.detach().numpy()
3.RuntimeError: Given groups=1, weight of size [64, 3, 7, 7], expected input[10, 5, 1000, 70] to have 3 channels, but got 5 channels instead
原因:通道数不匹配
4.TypeError: 'module' object is not callable
原因:Python导入模块的方法有两种——import module 和 from module import,区别是前者所有导入的东西使用时需加上模块名的限定,而后者不要。
5.UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.解决办法 - 欣杰科技 - 博客园 (cnblogs.com)
6.TypeError: empty() received an invalid combination of arguments - got (tuple, dtype=NoneType, device=NoneType), but expected one of:
原因:在python3中两个整型相除得到的是浮点型,例如:4/2=2.0,而在构建卷积时的参数要求时整型。
解决:传参时加上int转换: