首页 > 其他分享 >李宏毅《机器学习》总结 - 2022 HW8(Anomaly Detection、ResNet) Strong Baseline

李宏毅《机器学习》总结 - 2022 HW8(Anomaly Detection、ResNet) Strong Baseline

时间:2024-02-20 16:00:30浏览次数:33  
标签:nn 李宏毅 self oc Detection stride 64 2022 128

重新学习了一下 ResNet。。这作业平均一跑就是3、4个小时
题目大意是让你做异常检测(anomaly detection),即给你一些正常的图片,再让你测试图片是正常的还是异常的(可以理解为 2 分类问题,只不过其中一个类别是无限大的)
image

代码:https://www.kaggle.com/code/skyrainwind/hw8-anomaly-detection

题目分析

调一下 fcn 的结构(比如加一层),调一下训练次数就能过 medium
再把 fcn 换成 cnn,发现 performance 并没有明显提高,考虑再换成 resnet,就达到 strong baseline 了,其中因为 decoder 没调好还多 train 了一次

代码分析

anomaly detection 的基本思想就是训练一个 encoder,一个 decoder,使得图片等输入到 encoder(encoder 的输出一般是一个比较小的向量,直观来说就是降维、选出了关键影响因素) 和 decoder 之后,与原输入的差距越小越好。
在过 medium 的 fcn 中,我加了一层 fcn,并调整 encoder 的输出为一个 10 维向量(而非 3 维):

class fcn_autoencoder(nn.Module):
    def __init__(self):
        super(fcn_autoencoder, self).__init__()
        self.encoder = nn.Sequential(
            nn.Linear(64 * 64 * 3, 1024),
            nn.ReLU(),
            nn.Linear(1024, 512),
            nn.ReLU(),
            nn.Linear(512, 256),
            nn.ReLU(), 
            nn.Linear(256, 64), 
            nn.ReLU(), 
            nn.Linear(64, 10)
        )
        self.decoder = nn.Sequential(
            nn.Linear(10, 64),
            nn.ReLU(), 
            nn.Linear(64, 256),
            nn.ReLU(),
            nn.Linear(256, 512),
            nn.ReLU(),
            nn.Linear(512, 1024),
            nn.ReLU(), 
            nn.Linear(1024, 64 * 64 * 3), 
            nn.Tanh()
        )

resnet(深度残差网络)在图像处理和 transformer 等领域都有着广泛应用,其核心是每一个 Residual_block 中的最后输出都加上输入,这个过程也叫 shortcut。而每个 Residual_block 都由好几个卷积层构成,这样可以有效避免产生网络退化的问题。在 transformer 中,encoder 和 decoder 都有在 attention 层之后的 add&norm 过程,这个 add 就是 shortcut 的过程。
在代码上的实现,就可以先实现一个 residual_block 包含几个 cnn 层,并加上 shortcut(值得注意的是,输出和对应的输入可能大小不同,需要额外 downsample 一下),在大的 resnet 中包含若干个小的 residual_block 作为 encoder 层,类似于一个“压缩”的过程,decoder 就是直接卷积层实现,注意一下最后直接连激活函数 tanh 即可,不用再 batch normalization 了!
卷积层的参数也要调一调,调的结果就是卷积层让图片长宽缩小一半,反卷积层扩大一倍。

class Residual_block(nn.Module):
    def __init__(self, ic, oc, stride=1): # 当传入 stride = 2 时,会把图片长宽缩小一倍
        super().__init__()
        self.conv1 = nn.Sequential(
            nn.Conv2d(ic, oc, stride=stride, padding=1, kernel_size=3), # stride=2: (H,W) -> (H/2, W/2)
            nn.BatchNorm2d(oc),
            nn.ReLU(inplace=True)
        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(oc, oc, stride=1, padding=1, kernel_size=3), # (H,W) -> (H,W)
            nn.BatchNorm2d(oc)
        )
        
        self.downsample = None # 让原来的 x 变成能和 forward(x) 相加的形状,包括 channel 和 (H,W) 都应相同
        if((stride != 1)  or (ic != oc)): # stride != 1 -> (H,W) 变小 ic != oc -> channel 不同
            self.downsample = nn.Sequential(
                nn.Conv2d(ic, oc, stride=stride, kernel_size=1),
                nn.BatchNorm2d(oc)
            )
            
    def forward(self, x):
        residual = x
        x = self.conv1(x)
        x = self.conv2(x)
        
        if(self.downsample != None):
            residual = self.downsample(residual)
        
        x = x + residual
        x = nn.ReLU(inplace = True)(x)
        return x

class ResNet(nn.Module):
    def __init__(self, block=Residual_block, num_layers = [2, 1, 1, 1]):
        super().__init__()
        self.preconv = nn.Sequential( # 3*64*64 --> 32*64*64
            nn.Conv2d(3, 32, kernel_size=3, padding=1, stride=1, bias=False),
            nn.BatchNorm2d(32),
            nn.ReLU(inplace=True)
        )
        
        def make_residual(block, ic, oc, num_layer, stride=1):
            layers = []
            layers.append(block(ic, oc, stride))
            for i in range(num_layer-1):
                layers.append(block(oc, oc))
            return nn.Sequential(*layers)

        self.layer0 = make_residual(block, ic=32, oc=64, num_layer=num_layers[0], stride=2)
        self.layer1 = make_residual(block, ic=64, oc=128, num_layer=num_layers[1], stride=2)
        self.layer2 = make_residual(block, ic=128, oc=128, num_layer=num_layers[2], stride=2)
        self.layer3 = make_residual(block, ic=128, oc=64, num_layer=num_layers[3], stride=2) 

        self.fc = nn.Sequential(
            nn.Flatten(), # 也可以用 .view(shape[0], -1)
            nn.Dropout(0.2),
            nn.Linear(64*4*4, 64),
            nn.BatchNorm1d(64),
            nn.ReLU(inplace = True)
        )
        
        # 关于 ConvTranspose2d 的介绍:https://blog.csdn.net/qq_36201400/article/details/112604740
        # 大概就是在原图相邻的两个格子之间插 stride-1 个 0(这样原图就会变大了),padding <- kernel-padding-1
        self.decoder = nn.Sequential(
            nn.Linear(64, 64*4*4), # (64) -> (64*4*4)
            nn.BatchNorm1d(64*4*4),
            nn.ReLU(),
            nn.Unflatten(1, (64, 4, 4)), # (64*4*4) -> (64, 4, 4)
            nn.ConvTranspose2d(64,128,kernel_size=4,stride=2,padding=1), # (64,4,4) -> (128,8,8)
            nn.BatchNorm2d(128),
            nn.ReLU(),
            nn.ConvTranspose2d(128,128,kernel_size=4,stride=2,padding=1), # (128,8,8) -> (128,16,16)
            nn.BatchNorm2d(128),
            nn.ReLU(),
            nn.ConvTranspose2d(128,128,kernel_size=4,stride=2,padding=1), # (128,16,16) -> (128,32,32)
            nn.BatchNorm2d(128),
            nn.ReLU(),
            nn.ConvTranspose2d(128,3,kernel_size=4,stride=2,padding=1), # (128,32,32) -> (3,64,64)
            nn.Tanh()
        )
    
    def encoder(self, x):
        x = self.preconv(x) # (3,64,64) -> (32,64,64)
        x = self.layer0(x) # (32,64,64) -> (64,32,32) 且通过 resnet(shortcut) 实现,下同
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x) # (128,8,8) -> (64,4,4)
        x = self.fc(x) # (64,4,4) -> (64*4*4) -> (64)
        return x
        
    def forward(self, x): # x : (3, 64, 64)
        x = self.encoder(x)
        x = self.decoder(x)
        return x

标签:nn,李宏毅,self,oc,Detection,stride,64,2022,128
From: https://www.cnblogs.com/SkyRainWind/p/18023310

相关文章

  • windows server 2019/2022安装WSUS更新服务器配置System.Runtime.InteropServices.COM
    现象: 2024-02-1814:41:10Postinstallstarted2024-02-1814:41:10Detectedroleservices:Api,UI,WidDatabase,Services2024-02-1814:41:10Start:LoadSettingsFromXml2024-02-1814:41:10Start:GetConfigValuewithfilename=UpdateServices-Services.xmlit......
  • 互联网信息服务算法推荐管理规定 (全文学习)2022年01月04日 本规定自2022年3月1日起施
    互联网信息服务算法推荐管理规定第一章总则第一条 为了规范互联网信息服务算法推荐活动,弘扬社会主义核心价值观,维护国家安全和社会公共利益,保护公民、法人和其他组织的合法权益,促进互联网信息服务健康有序发展,根据《中华人民共和国网络安全法》、《中华人民共和国数据安全法......
  • 上海市促进 人工智能产业发展条例 (全文学习)2022年10月01日 本条例自2022年10月1日
    上海市促进人工智能产业发展条例(2022年9月22日上海市第十五届人民代表大会常务委员会第四十四次会议通过)第一章 总则  第一条 为了促进人工智能产业高质量发展,强化新一代人工智能科技创新策源功能,推动人工智能与经济、生活、城市治理等领域深度融合,打造人工智能世界级产业......
  • BEV-IO: Enhancing Bird's-Eye-View 3D Detection with Instance Occupancy
    通过显式和隐式的Occupancy预测来做3D检测,用Occupancy弥补了深度图的局限性。设计了3D几何分支和特征传播分支,预测depth-occupancy权重来实现3D检测,由于点级Occupancy的构建依赖于bbox,使整个感知模型与检测任务强相关。Abstract传构建BEV表示的方法是基于显式预测的深度分布,将2D......
  • 【专题】2022数字化转型指数年度报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33471原文出处:拓端数据部落公众号数字化转型指数报告2022合集根据“基础设施-平台-应用”三层指标体系,对全国300余个城市、10余个行业的数字化发展规模进行了评估。该报告提供了覆盖全国范围的季度数字化转型指数,为各行各业推进数字化转型提供了有益......
  • 在 Visual Studio 2022 中创建一个类似于旧版本 Visual Studio 中的 Win32 Console Ap
    以下内容来自AI的回答,实测有效在VisualStudio2022中创建一个项目,其自动生成的源文件内容包含#include"stdafx.h"和使用_tmain作为入口点,意味着你需要创建一个基于Windows的传统控制台应用程序,这通常与旧版本的VisualStudio(如VisualStudio2005或更早)和使用预......
  • Unity 2022.3.20f1新功能,异步实例化预制体Object.InstantiateAsync
    今天查看Unity2022.3.20f1更新日志,发现新增了个异步实例化的功能,这个功能解决了Unity历史上实例化预制体卡顿的痛点,简直不要太爽。具体的API文档请点击跳转。做了个简单的实例化测试,实例化500*500个Cube,耗时9.2s。实例化过程之间不会卡顿,可以做其他事情,即便是在重度游戏加载场......
  • P8784 [蓝桥杯 2022 省 B] 积木画
    原题链接太妙了,请移步题解区,有用数学归纳法做的,也有用找规律做的L型积木一定是成对出现的code#include<bits/stdc++.h>usingnamespacestd;constintmod=1e9+7;longlongdp[10000005]={0};intmain(){intn;cin>>n;dp[0]=1;dp[1]=1;dp[2]=2;......
  • Windows Server 2022 新的服务管理 API 提供了更多的选项和功能,可以更灵活地进行服务
    sc 命令是Windows操作系统自带的一种命令行实用程序,用于创建、删除、启动、停止以及配置Windows服务。通过 sc 命令,您可以直接将可执行文件注册为服务,而不需要第三方工具的帮助。sc 命令提供了丰富的选项,如启动类型、依赖关系、服务描述等。instsrv 和 srvany 是两个......
  • 2022年全年回顾
    书接2021年全年回顾,继续参与部门的新产品。个人收获学习incredibuild的使用方法,不过经过评估和实战,没有在产品中使用。使用了各种方式改善流水线的构建效率和体验,对提升开发团队的效率有一定帮助。按照公司的发布流程,处理开源软件的漏洞,学习并掌握了很多开源软件的构建方法,输......