栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pytorch 踩坑记录(特征融合踩坑)(AttributeError: ‘tuple‘ object has no attribute ‘view‘)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pytorch 踩坑记录(特征融合踩坑)(AttributeError: ‘tuple‘ object has no attribute ‘view‘)

最近在做一个特征融合,需要将卷积网络的最后一层的深度特征拼接起来(concat),搭建网络的时候遇到了一系列问题,记录方便以后查看

模型部分
from torch.nn import functional as F
import torch.nn as nn
import torch
import torchvision

class MyEnsemble(nn.Module):


    def __init__(self, nb_classes=2):
        super(MyEnsemble, self).__init__()
        self.model1 = torchvision.models.resnet18(pretrained=False)
        self.model2 = torchvision.models.resnet18(pretrained=False)
        self.model3 = torchvision.models.resnet18(pretrained=False)
        # Freeze the models
        for param in self.model1.parameters():
            param.requires_grad = True
        for param in self.model2.parameters():
            param.requires_grad = True
        for param in self.model3.parameters():
            param.requires_grad = True

        # create a new classifier
        self.model1.fc = nn.Identity()
        self.model2.fc = nn.Identity()
        self.model3.fc = nn.Identity()
        self.classifier = nn.Linear(512*3, nb_classes)

    def forward(self, x1, x2, x3):
        x1 = self.model1(x1),
        print(x1)
        x1 = x1.view(x1.size(0), -1),
        x2 = self.model2(x2),
        x2 = x2.view(x2.size(0), -1),
        x3 = self.model3(x3),
        x3 = x3.view(x3.size(0), -1),
        x = torch.cat((x1, x2, x3), dim=1),
        x = self.classifier(F.relu(x))

        return x


    x1 = torch.randn(2, 3, 224, 224)
    x2 = torch.randn(2, 3, 224, 224)
    x3 = torch.randn(2, 3, 224, 224)
    model = MyEnsemble()
    outputs = model(x1, x2, x3)
    print(outputs)

然后在测试输出时,得到了报错:AttributeError: 'tuple' object has no attribute 'view',报错的原因是网络经过pooling层之后的输出是一个tuple类型:如下为输出结果(print大法是真的香)

此时我们要做的是,将tuple里面的tensor提取出来,由于这里tuple里面只有一个元素,一个简单的语法就可以了:x1=x1[0],以下为将tuple中tensor提取出来后的前后对比
又认真研究了一下,原来是我太菜,在forward方法里面,每个语句后面都加了逗号,是不需要逗号的啊喂,好菜好菜!写在这里警醒自己,不过话说回来tuple提取方法也是可以的

除此之外,还有两个地方最初不是很理解

for param in self.model1.parameters():
            param.requires_grad = True

self.model3.fc = nn.Identity()

(1)param.requires_grad = True,表示允许参数更新,也就是说允许你在训练时通过反向传播来更新参数,反之就是冻结
(2)self.model3.fc = nn.Identity(),去pytorch的论坛找了一下,别人给出的解释是 “该模块将只返回输入,无需任何操作,可用于例如替换其他层”,我的理解是,在你需要替换掉网络时,你需要使用该语句nn.Identity(),将原有的网络结构保持,然后替换掉你想替换的层例如我的

self.model1.fc = nn.Identity()
        self.model2.fc = nn.Identity()
        self.model3.fc = nn.Identity()
        self.classifier = nn.Linear(512*3, nb_classes)

就是将卷积操作保持,然后将三个深度特征融合以后用一个新的全连接层替换掉原有全连接层

然后接下来我要查看我的模型到底是的组成的,有没有按照我预想的来:
torchsummary.summary方法
完整代码:
模型部分:

from torch.nn import functional as F
import torch.nn as nn
import torch
import torchvision

class MyEnsemble(nn.Module):


    def __init__(self, nb_classes=2):
        super(MyEnsemble, self).__init__()
        self.model1 = torchvision.models.resnet18(pretrained=False)
        self.model2 = torchvision.models.resnet18(pretrained=False)
        self.model3 = torchvision.models.resnet18(pretrained=False)
        # Freeze the models
        for param in self.model1.parameters():
            param.requires_grad = True
        for param in self.model2.parameters():
            param.requires_grad = True
        for param in self.model3.parameters():
            param.requires_grad = True

        # create a new classifier
        self.model1.fc = nn.Identity()
        self.model2.fc = nn.Identity()
        self.model3.fc = nn.Identity()
        self.classifier = nn.Linear(512*3, nb_classes)

    def forward(self, x1, x2, x3):
        x1 = self.model1(x1)
        # x1 = x1[0]
        x1 = x1.view(x1.size(0), -1)

        x2 = self.model2(x2)
        # x2 = x2[0]
        x2 = x2.view(x2.size(0), -1)

        x3 = self.model3(x3)
        # x3 = x3[0]
        x3 = x3.view(x3.size(0), -1)

        x = torch.cat((x1, x2, x3), dim=1)
        x = self.classifier(F.relu(x))

        return x

查看输出结果以及网络结构

import torch
from my_model import MyEnsemble
from torchsummary import summary

def train():
    device = torch.device('cuda:0')
    x1 = torch.randn(10, 3, 224, 224)
    x2 = torch.randn(10, 3, 224, 224)
    x3 = torch.randn(10, 3, 224, 224)
    model = MyEnsemble()
    outputs = model(x1, x2, x3)
    print(outputs)
    model.to(device)
    summary(model, [(3, 224, 224), (3, 224, 224), (3, 224, 224)])

if __name__=='__main__':
    train()

输出结果如下:可以看到完整的网络结构

tensor([[ 0.3332, -0.7907],
        [ 0.1526, -0.9038],
        [ 0.2006, -0.9861],
        [ 0.0889, -0.8982],
        [ 0.2047, -0.7573],
        [ 0.0432, -0.7982],
        [ 0.1041, -0.9219],
        [ 0.1470, -0.8201],
        [ 0.2360, -0.9237],
        [ 0.2444, -0.8210]], grad_fn=)
----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 112, 112]           9,408
       BatchNorm2d-2         [-1, 64, 112, 112]             128
              ReLU-3         [-1, 64, 112, 112]               0
         MaxPool2d-4           [-1, 64, 56, 56]               0
            Conv2d-5           [-1, 64, 56, 56]          36,864
       BatchNorm2d-6           [-1, 64, 56, 56]             128
              ReLU-7           [-1, 64, 56, 56]               0
            Conv2d-8           [-1, 64, 56, 56]          36,864
       BatchNorm2d-9           [-1, 64, 56, 56]             128
             ReLU-10           [-1, 64, 56, 56]               0
       BasicBlock-11           [-1, 64, 56, 56]               0
           Conv2d-12           [-1, 64, 56, 56]          36,864
      BatchNorm2d-13           [-1, 64, 56, 56]             128
             ReLU-14           [-1, 64, 56, 56]               0
           Conv2d-15           [-1, 64, 56, 56]          36,864
      BatchNorm2d-16           [-1, 64, 56, 56]             128
             ReLU-17           [-1, 64, 56, 56]               0
       BasicBlock-18           [-1, 64, 56, 56]               0
           Conv2d-19          [-1, 128, 28, 28]          73,728
      BatchNorm2d-20          [-1, 128, 28, 28]             256
             ReLU-21          [-1, 128, 28, 28]               0
           Conv2d-22          [-1, 128, 28, 28]         147,456
      BatchNorm2d-23          [-1, 128, 28, 28]             256
           Conv2d-24          [-1, 128, 28, 28]           8,192
      BatchNorm2d-25          [-1, 128, 28, 28]             256
             ReLU-26          [-1, 128, 28, 28]               0
       BasicBlock-27          [-1, 128, 28, 28]               0
           Conv2d-28          [-1, 128, 28, 28]         147,456
      BatchNorm2d-29          [-1, 128, 28, 28]             256
             ReLU-30          [-1, 128, 28, 28]               0
           Conv2d-31          [-1, 128, 28, 28]         147,456
      BatchNorm2d-32          [-1, 128, 28, 28]             256
             ReLU-33          [-1, 128, 28, 28]               0
       BasicBlock-34          [-1, 128, 28, 28]               0
           Conv2d-35          [-1, 256, 14, 14]         294,912
      BatchNorm2d-36          [-1, 256, 14, 14]             512
             ReLU-37          [-1, 256, 14, 14]               0
           Conv2d-38          [-1, 256, 14, 14]         589,824
      BatchNorm2d-39          [-1, 256, 14, 14]             512
           Conv2d-40          [-1, 256, 14, 14]          32,768
      BatchNorm2d-41          [-1, 256, 14, 14]             512
             ReLU-42          [-1, 256, 14, 14]               0
       BasicBlock-43          [-1, 256, 14, 14]               0
           Conv2d-44          [-1, 256, 14, 14]         589,824
      BatchNorm2d-45          [-1, 256, 14, 14]             512
             ReLU-46          [-1, 256, 14, 14]               0
           Conv2d-47          [-1, 256, 14, 14]         589,824
      BatchNorm2d-48          [-1, 256, 14, 14]             512
             ReLU-49          [-1, 256, 14, 14]               0
       BasicBlock-50          [-1, 256, 14, 14]               0
           Conv2d-51            [-1, 512, 7, 7]       1,179,648
      BatchNorm2d-52            [-1, 512, 7, 7]           1,024
             ReLU-53            [-1, 512, 7, 7]               0
           Conv2d-54            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-55            [-1, 512, 7, 7]           1,024
           Conv2d-56            [-1, 512, 7, 7]         131,072
      BatchNorm2d-57            [-1, 512, 7, 7]           1,024
             ReLU-58            [-1, 512, 7, 7]               0
       BasicBlock-59            [-1, 512, 7, 7]               0
           Conv2d-60            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-61            [-1, 512, 7, 7]           1,024
             ReLU-62            [-1, 512, 7, 7]               0
           Conv2d-63            [-1, 512, 7, 7]       2,359,296
      BatchNorm2d-64            [-1, 512, 7, 7]           1,024
             ReLU-65            [-1, 512, 7, 7]               0
       BasicBlock-66            [-1, 512, 7, 7]               0
AdaptiveAvgPool2d-67            [-1, 512, 1, 1]               0
         Identity-68                  [-1, 512]               0
           ResNet-69                  [-1, 512]               0
           Conv2d-70         [-1, 64, 112, 112]           9,408
      BatchNorm2d-71         [-1, 64, 112, 112]             128
             ReLU-72         [-1, 64, 112, 112]               0
        MaxPool2d-73           [-1, 64, 56, 56]               0
           Conv2d-74           [-1, 64, 56, 56]          36,864
      BatchNorm2d-75           [-1, 64, 56, 56]             128
             ReLU-76           [-1, 64, 56, 56]               0
           Conv2d-77           [-1, 64, 56, 56]          36,864
      BatchNorm2d-78           [-1, 64, 56, 56]             128
             ReLU-79           [-1, 64, 56, 56]               0
       BasicBlock-80           [-1, 64, 56, 56]               0
           Conv2d-81           [-1, 64, 56, 56]          36,864
      BatchNorm2d-82           [-1, 64, 56, 56]             128
             ReLU-83           [-1, 64, 56, 56]               0
           Conv2d-84           [-1, 64, 56, 56]          36,864
      BatchNorm2d-85           [-1, 64, 56, 56]             128
             ReLU-86           [-1, 64, 56, 56]               0
       BasicBlock-87           [-1, 64, 56, 56]               0
           Conv2d-88          [-1, 128, 28, 28]          73,728
      BatchNorm2d-89          [-1, 128, 28, 28]             256
             ReLU-90          [-1, 128, 28, 28]               0
           Conv2d-91          [-1, 128, 28, 28]         147,456
      BatchNorm2d-92          [-1, 128, 28, 28]             256
           Conv2d-93          [-1, 128, 28, 28]           8,192
      BatchNorm2d-94          [-1, 128, 28, 28]             256
             ReLU-95          [-1, 128, 28, 28]               0
       BasicBlock-96          [-1, 128, 28, 28]               0
           Conv2d-97          [-1, 128, 28, 28]         147,456
      BatchNorm2d-98          [-1, 128, 28, 28]             256
             ReLU-99          [-1, 128, 28, 28]               0
          Conv2d-100          [-1, 128, 28, 28]         147,456
     BatchNorm2d-101          [-1, 128, 28, 28]             256
            ReLU-102          [-1, 128, 28, 28]               0
      BasicBlock-103          [-1, 128, 28, 28]               0
          Conv2d-104          [-1, 256, 14, 14]         294,912
     BatchNorm2d-105          [-1, 256, 14, 14]             512
            ReLU-106          [-1, 256, 14, 14]               0
          Conv2d-107          [-1, 256, 14, 14]         589,824
     BatchNorm2d-108          [-1, 256, 14, 14]             512
          Conv2d-109          [-1, 256, 14, 14]          32,768
     BatchNorm2d-110          [-1, 256, 14, 14]             512
            ReLU-111          [-1, 256, 14, 14]               0
      BasicBlock-112          [-1, 256, 14, 14]               0
          Conv2d-113          [-1, 256, 14, 14]         589,824
     BatchNorm2d-114          [-1, 256, 14, 14]             512
            ReLU-115          [-1, 256, 14, 14]               0
          Conv2d-116          [-1, 256, 14, 14]         589,824
     BatchNorm2d-117          [-1, 256, 14, 14]             512
            ReLU-118          [-1, 256, 14, 14]               0
      BasicBlock-119          [-1, 256, 14, 14]               0
          Conv2d-120            [-1, 512, 7, 7]       1,179,648
     BatchNorm2d-121            [-1, 512, 7, 7]           1,024
            ReLU-122            [-1, 512, 7, 7]               0
          Conv2d-123            [-1, 512, 7, 7]       2,359,296
     BatchNorm2d-124            [-1, 512, 7, 7]           1,024
          Conv2d-125            [-1, 512, 7, 7]         131,072
     BatchNorm2d-126            [-1, 512, 7, 7]           1,024
            ReLU-127            [-1, 512, 7, 7]               0
      BasicBlock-128            [-1, 512, 7, 7]               0
          Conv2d-129            [-1, 512, 7, 7]       2,359,296
     BatchNorm2d-130            [-1, 512, 7, 7]           1,024
            ReLU-131            [-1, 512, 7, 7]               0
          Conv2d-132            [-1, 512, 7, 7]       2,359,296
     BatchNorm2d-133            [-1, 512, 7, 7]           1,024
            ReLU-134            [-1, 512, 7, 7]               0
      BasicBlock-135            [-1, 512, 7, 7]               0
AdaptiveAvgPool2d-136            [-1, 512, 1, 1]               0
        Identity-137                  [-1, 512]               0
          ResNet-138                  [-1, 512]               0
          Conv2d-139         [-1, 64, 112, 112]           9,408
     BatchNorm2d-140         [-1, 64, 112, 112]             128
            ReLU-141         [-1, 64, 112, 112]               0
       MaxPool2d-142           [-1, 64, 56, 56]               0
          Conv2d-143           [-1, 64, 56, 56]          36,864
     BatchNorm2d-144           [-1, 64, 56, 56]             128
            ReLU-145           [-1, 64, 56, 56]               0
          Conv2d-146           [-1, 64, 56, 56]          36,864
     BatchNorm2d-147           [-1, 64, 56, 56]             128
            ReLU-148           [-1, 64, 56, 56]               0
      BasicBlock-149           [-1, 64, 56, 56]               0
          Conv2d-150           [-1, 64, 56, 56]          36,864
     BatchNorm2d-151           [-1, 64, 56, 56]             128
            ReLU-152           [-1, 64, 56, 56]               0
          Conv2d-153           [-1, 64, 56, 56]          36,864
     BatchNorm2d-154           [-1, 64, 56, 56]             128
            ReLU-155           [-1, 64, 56, 56]               0
      BasicBlock-156           [-1, 64, 56, 56]               0
          Conv2d-157          [-1, 128, 28, 28]          73,728
     BatchNorm2d-158          [-1, 128, 28, 28]             256
            ReLU-159          [-1, 128, 28, 28]               0
          Conv2d-160          [-1, 128, 28, 28]         147,456
     BatchNorm2d-161          [-1, 128, 28, 28]             256
          Conv2d-162          [-1, 128, 28, 28]           8,192
     BatchNorm2d-163          [-1, 128, 28, 28]             256
            ReLU-164          [-1, 128, 28, 28]               0
      BasicBlock-165          [-1, 128, 28, 28]               0
          Conv2d-166          [-1, 128, 28, 28]         147,456
     BatchNorm2d-167          [-1, 128, 28, 28]             256
            ReLU-168          [-1, 128, 28, 28]               0
          Conv2d-169          [-1, 128, 28, 28]         147,456
     BatchNorm2d-170          [-1, 128, 28, 28]             256
            ReLU-171          [-1, 128, 28, 28]               0
      BasicBlock-172          [-1, 128, 28, 28]               0
          Conv2d-173          [-1, 256, 14, 14]         294,912
     BatchNorm2d-174          [-1, 256, 14, 14]             512
            ReLU-175          [-1, 256, 14, 14]               0
          Conv2d-176          [-1, 256, 14, 14]         589,824
     BatchNorm2d-177          [-1, 256, 14, 14]             512
          Conv2d-178          [-1, 256, 14, 14]          32,768
     BatchNorm2d-179          [-1, 256, 14, 14]             512
            ReLU-180          [-1, 256, 14, 14]               0
      BasicBlock-181          [-1, 256, 14, 14]               0
          Conv2d-182          [-1, 256, 14, 14]         589,824
     BatchNorm2d-183          [-1, 256, 14, 14]             512
            ReLU-184          [-1, 256, 14, 14]               0
          Conv2d-185          [-1, 256, 14, 14]         589,824
     BatchNorm2d-186          [-1, 256, 14, 14]             512
            ReLU-187          [-1, 256, 14, 14]               0
      BasicBlock-188          [-1, 256, 14, 14]               0
          Conv2d-189            [-1, 512, 7, 7]       1,179,648
     BatchNorm2d-190            [-1, 512, 7, 7]           1,024
            ReLU-191            [-1, 512, 7, 7]               0
          Conv2d-192            [-1, 512, 7, 7]       2,359,296
     BatchNorm2d-193            [-1, 512, 7, 7]           1,024
          Conv2d-194            [-1, 512, 7, 7]         131,072
     BatchNorm2d-195            [-1, 512, 7, 7]           1,024
            ReLU-196            [-1, 512, 7, 7]               0
      BasicBlock-197            [-1, 512, 7, 7]               0
          Conv2d-198            [-1, 512, 7, 7]       2,359,296
     BatchNorm2d-199            [-1, 512, 7, 7]           1,024
            ReLU-200            [-1, 512, 7, 7]               0
          Conv2d-201            [-1, 512, 7, 7]       2,359,296
     BatchNorm2d-202            [-1, 512, 7, 7]           1,024
            ReLU-203            [-1, 512, 7, 7]               0
      BasicBlock-204            [-1, 512, 7, 7]               0
AdaptiveAvgPool2d-205            [-1, 512, 1, 1]               0
        Identity-206                  [-1, 512]               0
          ResNet-207                  [-1, 512]               0
          Linear-208                    [-1, 2]           3,074
================================================================
Total params: 33,532,610
Trainable params: 33,532,610
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 4096.00
Forward/backward pass size (MB): 188.38
Params size (MB): 127.92
Estimated Total Size (MB): 4412.30
----------------------------------------------------------------

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938664.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号