PyTorch孪生网络实现疑问:view函数作用及替换CNN是否需保留
关于孪生网络中
view语句的作用及替换骨干网络后的处理 1. output = output.view(output.size()[0], -1)的作用
CNN模块输出的是4维张量,格式为(batch_size, 通道数, 特征图高度, 特征图宽度),而后续的全连接层nn.Linear只接受2维输入(格式为(batch_size, 总特征数))。
这条语句的核心就是特征展平:
output.size()[0]固定住batch维度,保证每个样本的独立性;-1是让PyTorch自动计算剩余维度的总元素数,把每个样本的3维特征图(通道+高+宽)压缩成1维向量,刚好匹配全连接层的输入要求。
举个例子:如果CNN输出是(32, 256, 11, 11),那view(32, -1)会自动把它转成(32, 256*11*11) = (32, 30976),正好对应你定义的第一个全连接层nn.Linear(30976, 1024)的输入维度。
2. 替换为ResNet/VGG等网络时是否需要保留?
需要分情况看:
- 如果只使用骨干网络的特征提取部分(去掉原网络的全连接层):
比如你把ResNet的最后一层fc砍掉,只保留前面的卷积、池化模块,此时输出还是4维张量(和原来的CNN模块输出格式一致),这时候必须保留展平操作(view或者用更直观的torch.flatten(output, start_dim=1)),否则全连接层会报错维度不匹配。 - 如果直接用带全连接层的预训练网络,且不想自己定义fc层:
这种情况很少出现在孪生网络里(孪生网络需要共享特征提取权重),但如果是直接用原网络的输出,那原网络内部已经做了展平(比如ResNet的avgpool之后会用view转成2维),这时候你就不需要额外加这条语句了。
总结:大部分孪生网络场景下,我们会用ResNet/VGG的backbone做特征提取,去掉原有的分类头,所以需要保留展平操作,只是要注意计算新的骨干网络输出的特征总长度,对应修改你自己定义的self.fc的第一个输入维度。
内容的提问来源于stack exchange,提问作者luân nguyễn
相关产品推荐
相关产品推荐

