#!/usr/bin/env python
# coding: utf-8
# In[1]:
import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision import datasets, transforms
import torch.utils.data
import numpy as np
import math
# In[54]:
def to_var(x, requires_grad=False):
"""
Automatically choose cpu or cuda
"""
if torch.cuda.is_available():
x = x.cuda()
return x.clone().detach().requires_grad_(requires_grad)
class MaskedConv2d(nn.Conv2d):
def __init__(self, in_channels, out_channels, kernel_size, stride=1,
padding=0, dilation=1, groups=1, bias=True):
super(MaskedConv2d, self).__init__(in_channels, out_channels,
kernel_size, stride, padding, dilation, groups, bias)
self.mask_flag = False
def set_mask(self, mask):
self.mask = to_var(mask, requires_grad=False)
self.weight.data = self.weight.data*self.mask.data
self.mask_flag = True
def get_mask(self):
print(self.mask_flag)
return self.mask
def forward(self, x):
if self.mask_flag == True:
weight = self.weight*self.mask
return F.conv2d(x, weight, self.bias, self.stride,
self.padding, self.dilation, self.groups)
else:
return F.conv2d(x, self.weight, self.bias, self.stride,
self.padding, self.dilation, self.groups)
# In[55]:
class ConvNet(nn.Module):
def __init__(self):
super(ConvNet, self).__init__()
self.conv1 = MaskedConv2d(1, 32, kernel_size=3, padding=1, stride=1)
self.relu1 = nn.ReLU(inplace=True)
self.maxpool1 = nn.MaxPool2d(2)
self.conv2 = MaskedConv2d(32, 64, kernel_size=3, padding=1, stride=1)
self.relu2 = nn.ReLU(inplace=True)
self.maxpool2 = nn.MaxPool2d(2)
self.conv3 = MaskedConv2d(64, 64, kernel_size=3, padding=1, stride=1)
self.relu3 = nn.ReLU(inplace=True)
self.linear1 = nn.Linear(7*7*64, 10)
def forward(self, x):
out = self.maxpool1(self.relu1(self.conv1(x)))
out = self.maxpool2(self.relu2(self.conv2(out)))
out = self.relu3(self.conv3(out))
out = out.view(out.size(0), -1)
out = self.linear1(out)
return out
def set_masks(self, masks):
# Should be a less manual way to set masks
# Leave it for the future
self.conv1.set_mask(torch.from_numpy(masks[0]))
self.conv2.set_mask(torch.from_numpy(masks[1]))
self.conv3.set_mask(torch.from_numpy(masks[2]))
# In[56]:
def train(model, device, train_loader, optimizer, epoch):
model.train()
total = 0
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = F.cross_entropy(output, target)
loss.backward()
optimizer.step()
total += len(data)
progress = math.ceil(batch_idx / len(train_loader) * 50)
print("\rTrain epoch %d: %d/%d, [%-51s] %d%%" %
(epoch, total, len(train_loader.dataset),
'-' * progress + '>', progress * 2), end='')
# In[57]:
def test(model, device, test_loader):
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for data, target in test_loader:
data, target = data.to(device), target.to(device)
output = model(data)
test_loss += F.cross_entropy(output, target, reduction='sum').item() # sum up batch loss
pred = output.argmax(dim=1, keepdim=True) # get the index of the max log-probability
correct += pred.eq(target.view_as(pred)).sum().item()
test_loss /= len(test_loader.dataset)
print('\nTest: average loss: {:.4f}, accuracy: {}/{} ({:.0f}%)'.format(
test_loss, correct, len(test_loader.dataset),
100. * correct / len(test_loader.dataset)))
return test_loss, correct / len(test_loader.dataset)
# In[58]:
"""Reference https://github.com/zepx/pytorch-weight-prune/"""
def prune_rate(model, verbose=False):
"""
Print out prune rate for each layer and the whole network
"""
total_nb_param = 0
nb_zero_param = 0
layer_id = 0
for parameter in model.parameters():
param_this_layer = 1
for dim in parameter.data.size():
param_this_layer *= dim
total_nb_param += param_this_layer
# only pruning linear and conv layers
if len(parameter.data.size()) != 1:
layer_id += 1
zero_param_this_layer = np.count_nonzero(parameter.cpu().data.numpy()==0)
nb_zero_param += zero_param_this_layer
if verbose:
print("Layer {} | {} layer | {:.2f}% parameters pruned" .format(
layer_id,
'Conv' if len(parameter.data.size()) == 4 \
else 'Linear',
100.*zero_param_this_layer/param_this_layer,
))
pruning_perc = 100.*nb_zero_param/total_nb_param
if verbose:
print("Final pruning rate: {:.2f}%".format(pruning_perc))
return pruning_perc
def arg_nonzero_min(a):
"""
nonzero argmin of a non-negative array
"""
if not a:
return
min_ix, min_v = None, None
# find the starting value (should be nonzero)
for i, e in enumerate(a):
if e != 0:
min_ix = i
min_v = e
if not min_ix:
print('Warning: all zero')
return np.inf, np.inf
# search for the smallest nonzero
for i, e in enumerate(a):
if e < min_v and e != 0:
min_v = e
min_ix = i
return min_v, min_ix
def prune_one_filter(model, masks):
'''
Pruning one least ``important'' feature map by the scaled l2norm of
kernel weights
arXiv:1611.06440
'''
NO_MASKS = False
# construct masks if there is not yet
if not masks:
masks = []
NO_MASKS = True
values = []
for p in model.parameters():
if len(p.data.size()) == 4: # nasty way of selecting conv layer
p_np = p.data.cpu().numpy()
# construct masks if there is not
if NO_MASKS:
masks.append(np.ones(p_np.shape).astype('float32'))
# find the scaled l2 norm for each filter this layer
value_this_layer = np.square(p_np).sum(axis=1).sum(axis=1) .sum(axis=1)/(p_np.shape[1]*p_np.shape[2]*p_np.shape[3])
# normalization (important)
value_this_layer = value_this_layer / np.sqrt(np.square(value_this_layer).sum())
min_value, min_ind = arg_nonzero_min(list(value_this_layer))
values.append([min_value, min_ind])
assert len(masks) == len(values), "something wrong here"
values = np.array(values)
# set mask corresponding to the filter to prune
to_prune_layer_ind = np.argmin(values[:, 0])
to_prune_filter_ind = int(values[to_prune_layer_ind, 1])
masks[to_prune_layer_ind][to_prune_filter_ind] = 0.
# print('Prune filter #{} in layer #{}'.format(
# to_prune_filter_ind,
# to_prune_layer_ind))
return masks
def filter_prune(model, pruning_perc):
'''
Prune filters one by one until reach pruning_perc
(not iterative pruning)
'''
masks = []
current_pruning_perc = 0.
while current_pruning_perc < pruning_perc:
masks = prune_one_filter(model, masks)
model.set_masks(masks)
current_pruning_perc = prune_rate(model, verbose=False)
# print('{:.2f} pruned'.format(current_pruning_perc))
return masks
# In[61]:
def main():
epochs = 2
batch_size = 64
torch.manual_seed(0)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
train_loader = torch.utils

踟蹰横渡口,彳亍上滩舟。
- 粉丝: 2124
最新资源
- ytsteven_easyuseai_29388_1755583651296.zip
- 2025届浙江大学软件学院AI夏令营考核项目_包含Diffusion模型DDPM和DDIM与GAN模型EigenGAN的人脸生成对比实验_以及基于大模型文心一言的医疗智.zip
- beihanyu314_a_29388_1755583689244.zip
- wangguoshuang_Book-Pricing-System-Based-on-Python-3_7244_1755584812611.zip
- 保险行业客户信息管理及保单跟进系统_保险客户管理_保单到期提醒_业务员签单统计_Excel数据导入导出_基于宏达数据库平台开发_用于保险机构客户信息录入_保单跟进审核_业务数据统计.zip
- 软件工程课程教育云平台系统_面向高校软件工程课程的一体化教学与实践平台_整合学习管理与开发环境功能_支持自动化课程管理_作业评审_成绩统计_项目版本控制_分支管理_代码比对_构建部.zip
- 基于Python开发的运动热量计算与健康管理应用程序_卡路里计算器_运动热量算法_运动数据记录与日志管理_健康生活方式辅助工具_15a版本使用指南_MPL开源许可_支持多种运动方式.zip
- 基于PMP挣值管理理论的软件开发外包项目工时估算与进度监控系统_项目挣值估算工具_软件开发外包工时管理_人力资源投入分配_任务分解结构WBS管理_计划工时PV估算_实际工时.zip
- 2022中软杯A9智能创作平台标题生成算法模型_基于bert4keras与T5-pegasus的中文标题生成深度学习模型_使用jieba分词器优化中文预训练任务_支持ONNX模型导.zip
- 基于PaddlePaddle深度学习框架与PaddleSeg语义分割工具链的作物根系表型智能分析系统_集成U-Net_U-Net3_U2-Net等先进分割模型_支持根系图像智能分.zip
- shaweiwei_happy-chat_11052_1755584827725.zip
- 船舶航运信息管理系统_基于宏达数据库平台的船舶航运全流程管理软件_船舶资料管理_航次信息记录_船员证书管理_货物分类统计_港口航区设置_证书到期提醒_历史航运查询_报表打印功能_企.zip
- 健康护航保盾管理系统_基于Vue和SpringBoot的城乡居民大病保险报销平台_包含系统配置维护_参保管理_大病登记_保险审核五大模块_实现医保卡管理_医疗费用核算_报销比例计算.zip
- 基于SPMS开源项目管理系统的高效协同开发平台_包含开发计划文档部署说明指南和常见问题解答的全套解决方案_专为技术团队打造的敏捷开发与项目管理工具_采用SVG矢量图形技术构建品牌.zip
- 种植业全流程信息化管理系统_蔬菜瓜果花卉种植管理_大棚种植管理_员工考勤绩效_采购入库出库_库存损耗监控_成品采摘销售_财务收支统计_适用于中小型种植企业的综合管理解决方案_基于宏.zip
- 基于跨学科能力构建的大学生软技能培养创新平台_融合心理学测评与AI学习路径规划_通过游戏化任务系统与同伴互评机制提升沟通协作能力_适用于高校第二课堂与职场新人培训_采用机器学习算法.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



- 1
- 2
前往页