0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析卷积降维与池化降维的对比

jf_78858299 来源:算法与编程之美 作者:编程之美 2023-02-17 14:58 次阅读

**1 **问题

在学习深度学习中卷积网络过程中,有卷积层,池化层,全连接层等等,其中卷积层与池化层均可以对特征图降维,本次实验针对控制其他层次一致的情况下,使用卷积降维与池化降维进行对比分析,主要是看两种降维方式对精度的影响以,以及损失值的大小。与此同时还可以探究不同维度下对精度是否有影响。

**2 **方法

这里是所有的代码,每次只需要更改网络的模型,即使用卷积层,使其降维的维度最后是1x1、7x7、14x14,需要更改三次,其次是使用池化层降维,最后也需要达到1x1、7x7、14x14,这三种维度。

| import torchvision
from torchvision.transforms import ToTensor, transforms
from torch.utils.data import DataLoader
from torch import nn
import torch
from time import *
import xlwt
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

创建一个新的类继承nn.Module

class MyNet(nn.Module):

(5.2) 定义网络有哪些层,这些层都作为成员变量

def init (self):
super(). init ()

卷积

in_channels输入 out_channels输出 kernel_size 卷积核 stride 步长

self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, stride=1, padding=1, )

[-,16,28,28] [B, C, H, W] batch channel height weight

self.max_pool1 = nn.MaxPool2d(2)

self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=2, padding=1, )

self.max_pool2 = nn.MaxPool2d(2)

self.conv3 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=4, stride=2, padding=1, )

self.max_pool3 = nn.MaxPool2d(2)

[-,32,28,28]

全连接

self.fc = nn.Linear(in_features=32 * 14 * 14, out_features=10)

(5.3) 定义数据在网络中的流动

x - 1x28x28 CxHxW C表示通道数,H表示图像高度,W表示图像宽度

def forward(self, x):

x = torch.relu(self.conv1(x))

x = self.max_pool1(x)

x = torch.relu(self.conv2(x))

x = self.max_pool2(x)

x = torch.relu(self.conv3(x))

x = self.max_pool3(x)

x = torch.flatten(x, 1) #! 默认从0维开始拉伸 如果不设置1的话 会吧batch也拉伸进去

[B, C, H, W]

拉伸 C H W

out = torch.relu(self.fc(x))

return out

训练网络

loss_list: 统计每个周期的平均loss

def train(dataloader, net, loss_fn, optimizer):
size = len(dataloader.dataset)
epoch_loss = 0.0
batch_num = len(dataloader)
net.train()

精度=原预测正确数量/总数

correct = 0

一个batch一个batch的训练网络

for batch_idx, (x, y) in enumerate(dataloader):

--->

x, y = x.to(device), y.to(device) # 在GPU上运行x,y
pred = net(x)
loss = loss_fn(pred, y)

基于loss信息利用优化器从后向前更新网络全部参数

optimizer.zero_grad()
loss.backward()
optimizer.step()
epoch_loss += loss.item()
correct += (pred.argmax(1) == y).type(torch.float).sum().item()
if batch_idx % 100 == 0:

print(f'batch index:, loss:') # item()方法将单个tensor转化成数字

print(f'[ {batch_idx + 1 :>5d} / {batch_num :>5d} ] loss: {loss.item()}')

统计一个周期的平均loss

avg_loss = epoch_loss / batch_num
avg_accuracy = correct / size
return avg_accuracy, avg_loss

验证and评估

def test_and_val(dataloader, net, loss_fn):
size = len(dataloader.dataset)
batch_num = len(dataloader)
correct = 0
losses = 0
net.eval()
with torch.no_grad():
for x, y in dataloader:
x, y = x.to(device), y.to(device)
pred = net(x)
loss = loss_fn(pred, y)
losses += loss.item()
correct += (pred.argmax(1) == y).type(torch.int).sum().item()
accuracy = correct / size
avg_loss = losses / batch_num

print(f'The Accuracy =%')

return accuracy, avg_loss
if name == 'main':
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(0.1307, 0.3081)])

(0) 测试机器是否支持GPU

data_train_acc = []
data_train_loss = []
data_val_acc = []
data_val_loss = []
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

batch_size = [32,64,128,256]

batch_size = [64]
train_all_ds = torchvision.datasets.MNIST(root="data", download=True, train=True, transform=transform, )

将训练集划分为训练集+验证集

train_ds, val_ds = torch.utils.data.random_split(train_all_ds, [50000,10000])
test_ds = torchvision.datasets.MNIST(root="data", download=True, train=False, transform=transform, )
for each in range(len(batch_size)):
train_loader = DataLoader(dataset=train_ds,batch_size=batch_size[each], shuffle=True,)
val_loader = DataLoader(dataset=val_ds,batch_size=batch_size[each],)
test_loader = DataLoader(dataset=test_ds,batch_size=batch_size[each],)

(5) 网络的输入、输出以及测试网络的性能(不经过任何训练的网络)

net = MyNet().to(device)
optimizer = torch.optim.SGD(net.parameters(), lr=0.01)
loss_fn = torch.nn.CrossEntropyLoss()

(6)训练周期

begin_time = time()
train_accuracy_list = []
train_loss_list = []
val_accuracy_list = []
val_loss_list = []
epoch = 10
for t in range(epoch):
print(f"Epoch {t + 1}")
train_accuracy, train_loss = train(train_loader, net, loss_fn, optimizer)
train_accuracy_list.append(train_accuracy)
train_loss_list.append(train_loss)
print(f'Epoch {t + 1 :<2d} Train Acc = {train_accuracy * 100 :.2f}% || Epoch {t + 1} Train Loss = {train_loss}')
val_accuracy, val_loss = test_and_val(val_loader, net, loss_fn)
val_accuracy_list.append(val_accuracy)
val_loss_list.append(val_loss)
print(f'Epoch {t + 1 :<2d} Val Acc = {val_accuracy * 100 :.2f}% || Epoch {t + 1} Val Loss = {val_loss}')

print(f'Best_Train_Acc =% || Best_Val_Acc =%')

data_train_acc.append(train_accuracy_list)
data_train_loss.append(train_loss_list)
data_val_acc.append(val_accuracy_list)
data_val_loss.append(val_loss_list)
data_set = [data_train_acc,data_train_loss,data_val_acc,data_val_loss]
file = xlwt.Workbook('encoding = utf-8') # 设置工作簿编码
sheet1 = file.add_sheet('数据', cell_overwrite_ok=True) # 创建sheet工作表

要写入的列表的值

name = ['train_acc_batch','train_loss_batch','val_acc_batch','val_loss_batch']

for one in range(len(data_set)):

data = data_set[one]

id = name[one]

for i in range(len(data)):

for j in range(len(data[i])):

sheet1.write(j, i, data[i][j]) # 写入数据参数对应 行, 列, 值

file.save(f'CNN1_CH_.xls') # 保存.xls到当前工作目录

print(f'Best_Train_Acc = {max(train_accuracy_list) * 100 :.2f}%, Best_Val_Acc = {max(val_accuracy_list) * 100 :.2f}%')
test_accuracy,_ = test_and_val(test_loader, net, loss_fn)
print(f'Test Acc = {test_accuracy * 100}%')
end_time = time()
print('Time Consumed:',end_time-begin_time) |

卷积降维与池化降维对精度的影响

图片

图2.1训练集精度对比

图片

图2.2验证集精度对比

如图2.1和图2.2所示在使用卷积降维的情况下无论特征图尺寸在14x14、7x7、1x1在训练集下,精度最开始都是从80%多在10个周期以后均能达到99%左右,最终预测精度能达到99.99%,并且在10个周期以后就达到99%,再训练90个周期就是缓慢的从99%到99.99%几乎接近1的精度了。训练集也是如此,10个周期左右达到98%,最后稳定在98.40%左右。

池化降维,无论训练集还是验证集在14x14、7x7,1x1在首次只有60%多的准确率,在14x14的尺寸下,池化降维可以接近90%的准确率,大致在88%-89%,7x7、1x1均只能达到78%-79%左右,并且都是在10个周期左右趋于稳定,只有小幅波动。

图片

图2.3训练集损失值对比

卷积降维与池化降维对损失值****的影响

图片

图2.4验证集损失值对比

如图2.3和2.4所示,卷积降维训练集与验证集的损失值在首次就能达到池化降维的最小值,并且卷积降维随着训练次数的增加还在持续减小,几乎能够达到0.00几的损失值,最后稳定在这附近波动,代表预测值与真实值之间的差距非常小,几乎接近。

然后池化降维首次就是0.8-0.9左右,随着训练次数增加最低值也就只有0.5-0.6左右。但是池化降维在14x14尺寸下其损失值可以相对于在池化降维下7x7、1x1的尺寸下较小一些,可以达到0.3左右的损失值。

**3 **结语

针对卷积降维和池化降维,这里是对特征图14x14、7x7、1x1进行了精度对比和损失值对比的分析,最终得出在对于降维的方法使用下,卷积降维效果更佳,但需要人为去计算出该卷积出来的特征图大小,但是池化可以直接很简单的得出特征图大小,这是其中一个区别,也是池化特征的一个优点。但是对于实验结果的效果,卷积降维要更好与池化降维的。能够使训练集精度达到99.99%,验证集精度达到98.40%左右。这是卷积降维的优点所在。

在本次实验中,得出的最后的结论是,卷积降维对于结果精度要优于池化降维,但是卷积降维需要人为来计算卷积后的特征图大小,从而去更改卷积层的参数,有时候较为麻烦。池化降维则可以轻易的得出想要的特征图大小。

对于本次实验只是比较了特征图14x14、7x7、1x1,这三个尺寸对于精度的影响不同。还可以试着比较训练花费时间。以及不同尺寸是否对结果有什么影响。这次实验数据也有不同尺寸的结果,我也同时对比了一下在卷积层最后不同的尺寸对于精度的影响,最后发现只有前10个周期有一点区别,最终均能达到最优的效果,但是为了计算量的减少,在同等结果的情况下,尺寸小那么更节省时间吧。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 卷积
    +关注

    关注

    0

    文章

    95

    浏览量

    18412
  • 深度学习
    +关注

    关注

    73

    文章

    5239

    浏览量

    119927
  • 卷积网络
    +关注

    关注

    0

    文章

    41

    浏览量

    2129
收藏 人收藏

    评论

    相关推荐

    温度额的计算

    温度额的计算 结点到表面的热阻Rjc(℃/W) 10 开关管的最高工作温度Tmax-spec(℃) 150 高温测得的开关管表面温度Tmax(℃) 81.8 89.8 开关管的实际温度额(%) 59.9
    发表于 06-10 10:20

    IGBT饱和压Vsat实测值和官方参数对比

    IGBT 饱和压Vsat实测值和官方参数对比在国内电子市场上,鱼目混珠的产品太多,特别是大功率的IGBT,全新的和翻新的很难分辨出真假,标称的饱和压参数和实际的参数相差较大。工程师容易测试
    发表于 03-11 13:15

    普及从跑腿到云一体IT运管理的常识

    普及从跑腿到云一体IT运管理的常识运是一个名词相当丰富的领域,抛开各种丰富的技术名词,单就职位名称就很多:OP、SA、DBA、DEVOPS 、SRE、云工程师等等。这样一个领域,到底这些职位
    发表于 06-22 14:28

    求助,SVM分类时要不要先进行PCA呢?

    大家知道,既然SVM可以较好地解决小样本、非线性、高数等分类问题,那对于高样本输入,需不需要提前进行PCA呢?PCA
    发表于 10-27 20:13

    快速建模技术与三扫描建模的应用

    现场资料存档、现场数据快速逆向建模、施工质量对比、建筑变形监测等”。随着信息技术的发展,三扫描建模、三快速建模技术建设成为数字信息建设的趋势,三
    发表于 08-07 11:14

    广西扫描服务三检测三扫描仪

    、动态跟踪软件模块等,功能强大。中科院广州电子总部设在华南地区,供应广西三扫描仪,专业稳定的技术团队可提供广西扫描服务、广西三检测。传统的手工测量已经不能适应当下快速发展的工业进程,无法满足复杂曲面
    发表于 08-29 14:42

    HFSS二薄片边界设置应用技巧

    在许多电磁仿真应用中,导体厚度不是影响器件电性能的关键因素,并且去掉导体厚度还可以提高解决效率。今天小编就和大家聊聊HFSS二薄片或面上的的边界设置应用技巧。首先,我们来看两个例子:一、贴片天线铺铜厚度的影响二薄片和三实物
    发表于 06-28 06:38

    虚拟故障怎么办?虚拟怎么解决?

    团队能力和运工具!在此特殊时期,很多运人员面临着运工具的匮乏的难题,很多用户反映明辰智航云安虚拟业务性能监测管理工具,可以做到虚实结合,混合监控,多平台兼容,能大大提升他们的运
    发表于 02-21 21:32

    可视的应用和优势

      随着当下互联网快速发展,如今数据的维度变广、基数更大、结构越来越复杂,如今人们想要更加清晰快速的认知和理解数据的话,通过传统的二平面图表已经不能满足需求了。复杂的事情简单,更直观成为主流需求
    发表于 12-02 11:52

    采样的频率怎么是变化的啊

    原文地址:采样,过采样,欠采样,子采样,下采样作者:bluepig111111采样:2048HZ对信号来说是过采样了,事实上只要信号不混叠就好(满足尼奎斯特采样定理),所以可以对过采样的信号作
    发表于 08-09 08:14

    卷积神经网络一卷积的处理过程

    。本文就以一卷积神经网络为例谈谈怎么来进一步优化卷积神经网络使用的memory。文章(卷积神经网络中一卷.
    发表于 12-23 06:16

    低压肖特基二极管对比普通肖特基二极管的优势有哪些?

    的肖特基二极管(MBR20100)对比一下。参数如下:SBT20V100MBR20100普通的肖特基二极管(MBR20100)的压降为0.75V,而低压的肖特基二极管(SBT20V100)的压只有
    发表于 01-24 15:00

    电梯无纸化保管理更高效!

    管理更加需要相关部门及单位的重视,并不断推进和实施电梯相关政策,保障电梯安全监管和保行业的良性发展,从根本上杜绝保不规范、偷工减料、不按时保、保单作假、走过程形式
    发表于 06-09 11:34

    卷积神经网络简介:什么是机器学习?

    ,用于描述网络的方程中也有 32 个偏差和 32 个权重。CIFAR神经网络是一种广泛用于图像识别任务的CNN。它由两种主要类型的层组成:卷积层和层,它们在神经网络的训练中都发挥了很大的作用。
    发表于 02-23 20:11

    《 AI加速器架构设计与实现》+第一章卷积神经网络观后感

    卷积进行升维和(如图4),还可以调整直连的位置来对其做出调整,介绍图形结合,比较利于理解。对于初端块,举例了不同初端块结构(如图5),了解到神经网络中的\"跳跃连接块\"
    发表于 09-11 20:34