zoukankan      html  css  js  c++  java
  • AI艺术鉴赏挑战赛

    AI艺术鉴赏挑战赛 - 看画猜作者

    1. 亚军代码--000wangbo

      思路:主干网络resnest200,输入448尺寸,在不同loss下取得5组最好效果,最后进行投票,得到最后分数。

      网络代码:

      model =resnest200(pretrained=True)
      model.avgpool = torch.nn.AdaptiveAvgPool2d(output_size=1)
      model.fc = torch.nn.Linear(model.fc.in_features,49)
      
    2. 季军代码--今天没吃饭

      思路:基于Resnext50,eff-b3训练图像尺寸448,512,600的模型,取得分最高的4组结果进行投票。

      网络代码:

      class SELayer(nn.Module):
          def __init__(self, channel, reduction=16):
              super(SELayer, self).__init__()
              self.avg_pool = nn.AdaptiveAvgPool2d(1)
              self.fc = nn.Sequential(
                  nn.Linear(channel, channel // reduction, bias=False),
                  nn.ReLU(inplace=True),
                  nn.Linear(channel // reduction, channel, bias=False),
                  nn.Sigmoid()
              )
      
          def forward(self, x):
              b, c, _, _ = x.size()
              y = self.avg_pool(x).view(b, c)
              y = self.fc(y).view(b, c, 1, 1)
              return y
      
      
      class AdaptiveConcatPool2d(nn.Module):
          def __init__(self, sz=(1,1)):
              super().__init__()
              self.ap = nn.AdaptiveAvgPool2d(sz)
              self.mp = nn.AdaptiveMaxPool2d(sz)
              
          def forward(self, x):
              return torch.cat([self.mp(x), self.ap(x)], 1)
      
      
      class GeneralizedMeanPooling(nn.Module):
          def __init__(self, norm=3, output_size=1, eps=1e-6):
              super().__init__()
              assert norm > 0
              self.p = float(norm)
              self.output_size = output_size
              self.eps = eps
      
          def forward(self, x):
              x = x.clamp(min=self.eps).pow(self.p)
              
              return torch.nn.functional.adaptive_avg_pool2d(x, self.output_size).pow(1. / self.p)
      
          def __repr__(self):
              return self.__class__.__name__ + '(' 
                     + str(self.p) + ', ' 
                     + 'output_size=' + str(self.output_size) + ')'
      
      
      
      class BaseModel(nn.Module):
          def __init__(self, model_name, num_classes=2, pretrained=True, pool_type='max', down=True, metric='linear'):
              super().__init__()
              self.model_name = model_name
              
              if model_name == 'eff-b3':
                  backbone = EfficientNet.from_pretrained('efficientnet-b3')
                  plane = 1536
              elif model_name == 'resnext50':
                  backbone = nn.Sequential(*list(models.resnext50_32x4d(pretrained=pretrained).children())[:-2])
                  plane = 2048
              else:
                  backbone = None
                  plane = None
      
              self.backbone = backbone
              
              if pool_type == 'avg':
                  self.pool = nn.AdaptiveAvgPool2d((1, 1))
              elif pool_type == 'cat':
                  self.pool = AdaptiveConcatPool2d()
                  down = 1
              elif pool_type == 'max':
                  self.pool = nn.AdaptiveMaxPool2d((1, 1))
              elif pool_type == 'gem':
                  self.pool = GeneralizedMeanPooling()
              else:
                  self.pool = None
              
              if down:
                  if pool_type == 'cat':
                      self.down = nn.Sequential(
                          nn.Linear(plane * 2, plane),
                          nn.BatchNorm1d(plane),
                          nn.Dropout(0.2),
                          nn.ReLU(True)
                          )
                  else:
                      self.down = nn.Sequential(
                          nn.Linear(plane, plane),
                          nn.BatchNorm1d(plane),
                          nn.Dropout(0.2),
                          nn.ReLU(True)
                      )
              else:
                  self.down = nn.Identity()
              
              self.se = SELayer(plane)
              self.hidden = nn.Linear(plane, plane)
              self.relu = nn.ReLU(True)
              
              if metric == 'linear':
                  self.metric = nn.Linear(plane, num_classes)
              elif metric == 'am':
                  self.metric = AddMarginProduct(plane, num_classes)
              else:
                  self.metric = None
      
          def forward(self, x):
              if self.model_name == 'eff-b3':
                  feat = self.backbone.extract_features(x)
              else:
                  feat = self.backbone(x)
              
              feat = self.pool(feat)
              se = self.se(feat).view(feat.size(0), -1)
              feat_flat = feat.view(feat.size(0), -1)
              feat_flat = self.relu(self.hidden(feat_flat) * se)
      
              out = self.metric(feat_flat)
              return out
      

      投票:

      files = ['1.csv', '2.csv', '3.csv', '4.csv']
      weights = [1, 1, 1, 1]
      
      results = np.zeros((800, 49))
      for file, w in zip(files, weights):
          print(w)
          df = pd.read_csv(file, header=None).values
          for x, y in df:
              # print(x, y)
              results[x, y] += w
              # break
      
      print(results[0])
      
      submit = {
          'name': np.arange(800).tolist(),
          'pred': np.argmax(results, axis=1).tolist()
          }
      
      for k, v in submit.items():
          print(k, v)
      
      df = pd.DataFrame(submit)
      df.to_csv('vote.csv', header=False, index=False)
      
  • 相关阅读:
    python学习之老男孩python全栈第九期_day024知识点总结——单继承、多继承
    python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合
    校园管理系统 -- 登录部分
    cycloneii normal mode vs. arithmetic mode
    cycloneii LAB-wide signals
    关于Synthesis
    CycloneII lcell_comb 和 lcell_FF 的结构
    Verilog与VHDL的混合模块例化
    关于公式文件.eqn
    关于文本处理(1)
  • 原文地址:https://www.cnblogs.com/lixinhh/p/13933746.html
Copyright © 2011-2022 走看看