噼里啪啦 图像分类篇

news2024/9/28 21:29:31

1. LeNet初始化权重的问题

  • 由于我使用的是torch 1.10.0的版本,其Conv2d的init是使用a=sqrt(5)
    • 我将这里的torch默认初始化改为a=1之后,acc的对比如下:
  • 可以看出:更改初始化之后,5个epoch,acc提高了3个点。
  • 改为a=0后,继续上升了,loss也下降了,acc也提高了,所以初始化还是很重要的,这才5个epoch。
    • 更重要的是初始化影响了后面的训练过程。
# 这是init a=sqrt(5)初始化后的情况
[1,   500] train_loss: 1.756  test_accuracy: 0.458
[1,  1000] train_loss: 1.434  test_accuracy: 0.515
[2,   500] train_loss: 1.191  test_accuracy: 0.573
[2,  1000] train_loss: 1.173  test_accuracy: 0.600
[3,   500] train_loss: 1.037  test_accuracy: 0.624
[3,  1000] train_loss: 1.017  test_accuracy: 0.626
[4,   500] train_loss: 0.917  test_accuracy: 0.638
[4,  1000] train_loss: 0.916  test_accuracy: 0.645
[5,   500] train_loss: 0.851  test_accuracy: 0.666
[5,  1000] train_loss: 0.839  test_accuracy: 0.655
Finished Training

# conv2d权重重新初始化后,看看效果: 重新初始化a=1,因为没有ReLU
[1,   500] train_loss: 1.693  test_accuracy: 0.479
[1,  1000] train_loss: 1.397  test_accuracy: 0.538
[2,   500] train_loss: 1.171  test_accuracy: 0.583
[2,  1000] train_loss: 1.110  test_accuracy: 0.612
[3,   500] train_loss: 0.988  test_accuracy: 0.649
[3,  1000] train_loss: 0.966  test_accuracy: 0.658
[4,   500] train_loss: 0.862  test_accuracy: 0.657
[4,  1000] train_loss: 0.872  test_accuracy: 0.684
[5,   500] train_loss: 0.769  test_accuracy: 0.680
[5,  1000] train_loss: 0.797  test_accuracy: 0.684
Finished Training

# 搞错了,forward中有ReLU,所以还得改为a=0,看结果
[1,   500] train_loss: 1.640  test_accuracy: 0.522
[1,  1000] train_loss: 1.338  test_accuracy: 0.554
[2,   500] train_loss: 1.126  test_accuracy: 0.595
[2,  1000] train_loss: 1.074  test_accuracy: 0.638
[3,   500] train_loss: 0.951  test_accuracy: 0.646
[3,  1000] train_loss: 0.935  test_accuracy: 0.652
[4,   500] train_loss: 0.832  test_accuracy: 0.675
[4,  1000] train_loss: 0.844  test_accuracy: 0.679
[5,   500] train_loss: 0.746  test_accuracy: 0.691
[5,  1000] train_loss: 0.771  test_accuracy: 0.690
Finished Training

# 改为BCEloss,多标签(虽然只会有一个标签),但是要去掉softmax的绝对地位,所以看下效果呢
[1,   500] train_loss: 0.267  test_accuracy: 0.454
[1,  1000] train_loss: 0.221  test_accuracy: 0.524
[2,   500] train_loss: 0.190  test_accuracy: 0.575
[2,  1000] train_loss: 0.183  test_accuracy: 0.609
[3,   500] train_loss: 0.164  test_accuracy: 0.640
[3,  1000] train_loss: 0.163  test_accuracy: 0.650
[4,   500] train_loss: 0.150  test_accuracy: 0.662
[4,  1000] train_loss: 0.149  test_accuracy: 0.666
[5,   500] train_loss: 0.139  test_accuracy: 0.681
[5,  1000] train_loss: 0.140  test_accuracy: 0.676
Finished Training

  • 没看到下面forward是加了ReLU的,所以还要改为a=0,测试一下。
import torch.nn as nn
import torch.nn.functional as F


class LeNet(nn.Module):
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, 5)
        self.pool1 = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(16, 32, 5)
        self.pool2 = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(32*5*5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, a=1, mode='fan_out') # 没有ReLU,a=1,有ReLU, a=0
            elif isinstance(m, nn.Linear):
                nn.init.kaiming_normal_(m.weight, a=1, mode='fan_in')


    def forward(self, x):
        x = F.relu(self.conv1(x))    # input(3, 32, 32) output(16, 28, 28)
        x = self.pool1(x)            # output(16, 14, 14)
        x = F.relu(self.conv2(x))    # output(32, 10, 10)
        x = self.pool2(x)            # output(32, 5, 5)
        x = x.view(-1, 32*5*5)       # output(32*5*5)
        x = F.relu(self.fc1(x))      # output(120)
        x = F.relu(self.fc2(x))      # output(84)
        x = self.fc3(x)              # output(10)
        return x


up主的结果是:68.6% 

 2. AlexNet初始化网络权重的问题

  • 在改了conv2d和linear的初始化为a=0后,因为后面都跟了ReLU的,acc都有上升的。
[epoch 1] train_loss: 1.356  val_accuracy: 0.429
[epoch 2] train_loss: 1.187  val_accuracy: 0.500
[epoch 3] train_loss: 1.095  val_accuracy: 0.544
[epoch 4] train_loss: 1.037  val_accuracy: 0.593
[epoch 5] train_loss: 0.993  val_accuracy: 0.577
[epoch 6] train_loss: 0.923  val_accuracy: 0.618
[epoch 7] train_loss: 0.908  val_accuracy: 0.640
[epoch 8] train_loss: 0.878  val_accuracy: 0.676
[epoch 9] train_loss: 0.847  val_accuracy: 0.646
[epoch 10] train_loss: 0.831  val_accuracy: 0.670
Finished Training

# 改初始化方式:为a=0之后
[epoch 1] train_loss: 1.350  val_accuracy: 0.486
[epoch 2] train_loss: 1.163  val_accuracy: 0.508
[epoch 3] train_loss: 1.086  val_accuracy: 0.571
[epoch 4] train_loss: 1.012  val_accuracy: 0.640
[epoch 5] train_loss: 0.955  val_accuracy: 0.651
[epoch 6] train_loss: 0.920  val_accuracy: 0.657
[epoch 7] train_loss: 0.907  val_accuracy: 0.684
[epoch 8] train_loss: 0.847  val_accuracy: 0.690
[epoch 9] train_loss: 0.831  val_accuracy: 0.670
[epoch 10] train_loss: 0.805  val_accuracy: 0.695
Finished Training

# 改为BCEloss后,acc也提高了介个点
[epoch 1] train_loss: 0.449  val_accuracy: 0.522
[epoch 2] train_loss: 0.400  val_accuracy: 0.538
[epoch 3] train_loss: 0.357  val_accuracy: 0.629
[epoch 4] train_loss: 0.341  val_accuracy: 0.618
[epoch 5] train_loss: 0.319  val_accuracy: 0.613
[epoch 6] train_loss: 0.307  val_accuracy: 0.670
[epoch 7] train_loss: 0.321  val_accuracy: 0.648
[epoch 8] train_loss: 0.285  val_accuracy: 0.681
[epoch 9] train_loss: 0.286  val_accuracy: 0.692
[epoch 10] train_loss: 0.266  val_accuracy: 0.703
Finished Training

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/853222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数组相关练习

数组练习 将数组转化成字符串数组拷贝求数组元素的平均值查找数组中指定元素(顺序查找)二分查找冒泡排序数组逆序 将数组转化成字符串 import java.util.Arrays;public class Text1 {public static void main(String[] args) {int[] arr {5, 6, 4, 2};System.out.println(Arr…

机器学习中训练数据的重要性

人工智能技术发展至今,训练数据的重要性已经是我们老生常谈的问题。在重声训练数据为什么重要之前,我们先重新回顾下AI技术大爆炸的三大初始概念:机器学习是什么?人工智能是什么?训练数据又是什么? 机器学…

《Kali渗透基础》14. 无线渗透(四)

kali渗透 1:相关工具1.1:Aircrack-ng1.1.1:airmon-ng1.1.2:airodump-ng1.1.3:aireplay-ng1.1.4:airolib-ng1.1.5:bessid-ng 1.2:JTR1.3:Evil Twin Attacker1.4&#xff1…

Vue 中使用 WebWorker

目录 安装 loader 应用场景 打包时错误处理 安装 loader npm install worker-loader -D 如果直接把worker.js放到public目录下,则不需要安装loader vue.config.js const { defineConfig } require(vue/cli-service)module.exports defineConfig({transpileDe…

JS逆向系列之猿人学爬虫第14题-备而后动-勿使有变

文章目录 题目地址参数分析参考jspython 调用往期逆向文章推荐题目地址 https://match.yuanrenxue.cn/match/14题目难度标的是困难,主要难在js混淆部分。 参数分析 初始抓包有无限debugger反调试,可以直接hook 函数构造器过掉无限debugger Function.prototype.__construc…

C++异常体系

文章目录 一.C对运行时错误的处理方式函数调用链中的异常机制 二.异常的使用规范三.C异常体系C标准库中的异常体系 四.关于C异常的注意事项 一.C对运行时错误的处理方式 传统的C语言处理运行时错误采用的是assert或者错误码的方式,这种异常处理机制对错误信息的定位和描述能力…

ArcGIS Pro技术应用(暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合)

GIS是利用电子计算机及其外部设备,采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲,它是在一定的地域内,将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来,达到对地理和属性信息的综合管理。GIS的…

lc137. 只出现一次的数字 II

数组排序,既和前不一样又和后不一样的就是唯一的一个 public static int numberOnce(int[] nums) {Arrays.sort(nums);if (nums.length > 2 && nums[0] ! nums[1]) {//避免只有一个元素的数组return nums[0];}if (nums.length > 2 && nums[nu…

994. 腐烂的橘子

题目描述&#xff1a; 主要思路&#xff1a; 宽度优先搜索&#xff0c;利用队列实现。 需要注意的是放进队列的时候就需要标记&#xff0c;而不是取出的时候再标记。 class Solution { public:int orangesRotting(vector<vector<int>>& grid) {int ngrid.siz…

解决Spring Boot 2.6及之后版本取消了循环依赖的支持的问题

目录 1、问题&#xff1a; 2、报错&#xff1a; 3、解决方案&#xff1a; 1、问题&#xff1a; 循环依赖指的是两个或者多个bean之间相互依赖,形成一个闭环。直接表现为两个service层互相调用对方。 此时会遇到以下问题&#xff1a; 2、报错&#xff1a; 当启动项目时&…

Smartbi 权限绕过漏洞复现(QVD-2023-17461)

0x01 产品简介 Smartbi大数据分析产品融合BI定义的所有阶段&#xff0c;对接各种业务数据库、数据仓库和大数据分析平台&#xff0c;进行加工处理、分析挖掘和可视化展现&#xff1b;满足所有用户的各种数据分析应用需求&#xff0c;如大数据分析、可视化分析、探索式分析、复杂…

odoo-033 比较 float 浮点数大小之精度坑

文章目录 前提原因问题 前提 产品单位精确到6位小数生产制造模块&#xff0c;重写了完成的方法&#xff0c;在点击完成的时候报错如下&#xff1a; &#xff08;解释下&#xff1a;就是很奇怪&#xff0c;明明都是必填字段&#xff0c;也都赋值了但是就是拿不到值&#xff09;…

2.若依前后端分离版第一个增删查改

1.介绍 若依提供了代码生成功能&#xff0c;单表的CRUD可以直接用若依框架提供的代码生成进行创建。 2.实现 2.1 在数据库创建业务表test_teacher 2.2 生成代码 运行系统&#xff0c;进入菜单[系统工具]-》[代码生成],点击导入按钮&#xff0c;选择需要生成代码的表进行导…

Redis储存结构

Redis怎么储存的 这个redisDb是数据库对象 里面的其他字段忽略了 然后里面有个dict列表(字典列表) 我们随便来看一个redisObject 区分一下子啊 他这个dict里面没有存redisObject的对象 也没有存dict对象 它只是存了个数据指针 你看那个redis每个底层编码 抠搜的 这块要是再保存…

信道复用技术

信道划分介质访问控制将使用介质的每个设备与来自同一通信信道上的其他设备的通信隔离开来&#xff0c;把时域和频域资源合理地分配给网络上的设备 多路复用&#xff1a;就是将多个信号组合在一条物理信道上进行传输&#xff0c;使多个计算机或终端设备共享信道资源&#xff0c…

分班查询系统学生信息在线采集方法和具体操作教程

作为教师&#xff0c;特别是临近新学年&#xff0c;我们经常需要进行学生分班工作&#xff0c;这是一项繁琐但非常重要的工作。为了提高工作效率&#xff0c;我们可以利用易查分轻松生成一个学生分班查询系统。本文将介绍如何利用易查分设计和开发这样一个系统。 我们可以选择使…

vue+element 下载压缩包和导出

export function goodsInspectionReportDwnloadZip (params) {return axios({url: "/warehouse-entry-server/v1/goodsInspectionReport/downloadZip",method: "get",params,responseType: "blob"}) } //下载handleDownloadFile() {if (!this.$r…

【LeetCode】删除并获得点数

删除并获得点数 题目描述算法分析编程代码空间优化 链接: 删除并获得点数 题目描述 算法分析 编程代码 class Solution { public:int deleteAndEarn(vector<int>& nums) {const int N 10001;int arr[N] {0};for(const auto& n : nums){arr[n]n;}vector<in…

小红书数据分析丨现实版模拟人生,这届网友热衷于“云开店”?

近期&#xff0c;小红书出现的一个神秘的热心群体&#xff0c;他们经常活跃在各种小店店主发布的求助帖评论区中&#xff0c;积极地帮助店主出谋划策&#xff0c;寻找小店经营的优化之道&#xff0c;成功帮助小店成功转亏为盈&#xff01;江湖人称一一云股东。小红书话题#爱上帮…

微信小程序启动自动检测版本更新,检测到新版本则提示更新

UpdateManager 对象&#xff0c;用来管理更新&#xff0c;可通过 wx.getUpdateManager 接口获取实例 在app.js中的示例代码 onShow() {// 获取小程序更新机制的兼容&#xff0c;由于更新的功能基础库要1.9.90以上版本才支持&#xff0c;所以此处要做低版本的兼容处理if (wx.c…