对比tensorflow,从0开始学pytorch(三)--自定义层

上文虽然实现了GMS层的效果,但是前端代码太多,太ugly,也不好复用。今天抽空看了下pytorch中怎么自定义层,很简单,比tensorflow好用。

  1. 任意文件夹创建个文件,和所有编程语言一样
  1. 一样,集成nn.Module,然后自定义一个形参

这里需要花时间搞明白torch.nn.functional下的函数和torch.nn下的类的区别,一开始有点懵,想着为什么不做高级语言当中的静态函数,想明白了也就简单了。

图中的SPP_Sizes做了类型定义,python中一般情况不需要定义类型,但不定义在后面循环就会报错,看了下pytorch自带conv2d的源码,发现源码中非常严谨,每一个变量都定义了类型。

  1. 调用就非常简单了,上一篇笔记中的冗长的代码,就可以一行调用
  1. 简化后,代码看过去顺眼多了。附上GMS封装后的源码和训练结果
python 复制代码
import torch
import torch.nn as nn
import torch.nn.functional as F


class GMS(nn.Module):
    def __init__(self, Spp_Sizes:[]):
        super().__init__()
        if len(Spp_Sizes) == 0:
            self.SPP_Sizes = [2, 3, 4]
        else:
            self.SPP_Sizes = Spp_Sizes

    def forward(self, x):
        x_gap = F.adaptive_avg_pool2d(x, (1, 1))
        x_gap = torch.flatten(x_gap, 1)

        x_gmp = F.adaptive_max_pool2d(x, (1, 1))
        x_gmp = torch.flatten(x_gmp, 1)

        x_gms = torch.cat((x_gap, x_gmp), dim=1)

        for spp_size in self.SPP_Sizes:
            x_spp = F.adaptive_max_pool2d(x, (spp_size,spp_size))
            x_spp = torch.flatten(x_spp, 1)
            x_gms = torch.cat((x_gms, x_spp), dim=1)
        return x_gms
相关推荐
irislinAmelia6 小时前
缺陷检测AI关键点在哪
人工智能·嵌入式硬件·1024程序员节
Ai-_Man6 小时前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
安托智造6 小时前
MBD:从二维图纸到三维模型的制造革命(下)
大数据·人工智能·制造·mbd
火山引擎开发者社区6 小时前
VeOps 深度调查:让 AI 排障从“能用”走向“可靠”
人工智能
梓豪csd6 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
王中阳Go6 小时前
两个入口答案不一致先别调模型:6 行入口口径对账表(附脚本)
人工智能·后端·python·大语言模型·1024程序员节
武天旭6 小时前
AI安全--AI大模型的隐私保护与法律法规
人工智能·安全
Solange__6 小时前
影视预演怎么用AI生成3D场景?从分镜、Blockout到镜头交付的完整流程
人工智能·游戏·3d·ai·自然语言处理·aigc·游戏策划
冬奇Lab7 小时前
一次 Skill 评测的复盘:我推翻了一份现成的模型选型结论,然后自己造了个评测平台
人工智能·llm·agent
不脱发的程序猿8 小时前
纳指ETF量化策略
数据库·人工智能·1024程序员节