Skip to content

Commit c2ddfee

Browse files
author
李振斌
committed
init
1 parent 2110d40 commit c2ddfee

9 files changed

+748
-66
lines changed

Image_recognition/config.py

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import warnings
2+
import torch as t
3+
# from distiller.quantization.range_linear import LinearQuantMode
4+
from utils.get_classes import get_classes
5+
6+
7+
class DefaultConfig(object):
8+
image_size = 224 # 图片尺寸
9+
model = 'EfficientNet' # 使用的模型,名字必须与models/__init__.py中的名字一致
10+
11+
data_root = "/home/thn/image/image" # 数据集存放路径
12+
load_model_path = None # 加载训练的模型的路径,为None代表不加载
13+
# load_model_path = './checkpoint/EfficientNet.pth.tar' # 加载训练的模型的路径,为None代表不加载
14+
batch_size = 12 # 每批训练数据的个数,显存不足,适当减少
15+
use_gpu = True # 是否使用GPU
16+
num_workers = 6 # 用于数据预处理的多处理工作器的数量
17+
print_freq = 100 # 数据可视化指数
18+
vis = False # 是否使用tensorboard可视化
19+
20+
cate_classes = get_classes(data_root)['class2num'] # 图像分类标签列表
21+
num_classes = len(cate_classes) # 图像分类个数
22+
new_train = None # 新训练图片的路径
23+
# pretrained = False # 不加载预训练
24+
pretrained = True # 加载预训练模型
25+
# pruning = True # 压缩计划表
26+
pruning = False # 是否修剪
27+
# compress = 'resnet152.schedule_sensitivity.yaml' # 压缩计划表
28+
compress = None # 压缩计划表
29+
# 量化 参数
30+
quantize_eval = False
31+
qe_calibration = None
32+
# qe_mode = LinearQuantMode.SYMMETRIC
33+
qe_bits_acts = 8
34+
qe_bits_wts = 8
35+
qe_bits_accum = 32
36+
qe_clip_acts = False
37+
qe_no_clip_layers = []
38+
qe_per_channel = False
39+
qe_stats_file = None
40+
qe_config_file = None
41+
output_dir = 'logs' # 日志输出
42+
name = 'opalus_recognltion' # 实验名
43+
sensitivity = 'element' # ['element', 'filter', 'channel'] # 神经网络敏感性分析
44+
sensitivity_range = [0.4, 0.9, 0.1] # 尝试修剪比例
45+
46+
max_epoch = 25 # 学习次数
47+
lr = 0.001 # 初始学习效率
48+
lr_gamma = 0.5 # 学习效率下降 lr*lr_decay
49+
lr_policy = 'multi' # 学习效率调度器 plateau,step,multi
50+
lr_epoch = [3, 5, 7] # 训练epoch达到milestones值时,初始学习率乘以gamma得到新的学习率;
51+
weight_decay = 0e-5 # 优化器权值衰减率
52+
# date_shuffle = True # 数据集有序False 随机True
53+
url = None # 识别图片
54+
error_img = 'error_img.csv'
55+
56+
def _parse(self, kwargs):
57+
"""
58+
根据字典kwargs 更新 config参数
59+
"""
60+
for k, v in kwargs.items():
61+
if not hasattr(self, k):
62+
warnings.warn("Warning: opt has not attribut %s" % k)
63+
setattr(self, k, v)
64+
65+
opt.device = t.device('cuda') if opt.use_gpu else t.device('cpu')
66+
67+
# print('user config:')
68+
for k, v in self.__class__.__dict__.items():
69+
if not k.startswith('_'):
70+
pass
71+
# print(k, getattr(self, k))
72+
73+
74+
opt = DefaultConfig()

Image_recognition/deploy.sh

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#!/usr/bin/zsh
2+
3+
current_path=$(cd $(dirname $0);pwd)
4+
# 切换环境
5+
# source `which virtualenvwrapper.sh`
6+
workon ai
7+
8+
case "$1" in
9+
start)
10+
# 可视化
11+
pids=`ps -ef | grep 'tensorboard'| grep -v 'grep' | awk '{print $2}'`
12+
if [ $pids ];then
13+
echo "tensorboard is runing http://tian-orc:6006"
14+
else
15+
echo "strat tensorboard http://tian-orc:6006"
16+
nohup tensorboard --logdir=runs &
17+
fi
18+
echo '训练'
19+
python main.py train
20+
echo '测试'
21+
python main.py test --load-path='checkpoints/ResNet152.pth.tar'
22+
echo '迁移'
23+
python utils/model_dict.py
24+
25+
;;
26+
stop)
27+
# 停止
28+
pids=`ps -ef | grep 'deploy.sh start'| grep -v 'grep' | awk '{print $2}'`
29+
if [ $pids ];then
30+
kill -9 $pids
31+
ps -ef | grep 'python'| grep -v 'grep' | awk '{print $2}' | xargs kill -9
32+
rm -r $current_path/runs
33+
echo "Stop [OK]"
34+
else
35+
echo "AI not start"
36+
fi
37+
;;
38+
*)
39+
echo "Usages: ./deploy.sh [start|stop]"
40+
;;
41+
esac

Image_recognition/main.py

+48-48
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,25 @@
22
import os
33
import operator
44
from datetime import datetime
5-
import distiller
6-
from distiller.data_loggers import *
5+
# import distiller
6+
# from distiller.data_loggers import *
77
from config import opt
88
import torch as t
99
import models
1010
from data.dataset import DatasetFromFilename
1111
from torch.utils.data import DataLoader
1212
from utils.image_loader import image_loader
1313
from utils.utils import AverageMeter, accuracy, write_err_img, config_pylogger, check_date, get_scheduler
14-
from utils.sensitivity import sensitivity_analysis, val
14+
from utils.sensitivity import val
1515
from utils.progress_bar import ProgressBar
1616
from tqdm import tqdm
1717
import numpy as np
18-
import distiller.quantization as quantization
18+
# import distiller.quantization as quantization
1919
from torch.utils.tensorboard import SummaryWriter
2020
from torchvision.utils import make_grid
2121

2222
t.backends.cudnn.benchmark = True
23-
# 如果我们的输入在每一次的iterate的时候都进行变化,那么benchmark就会在每次iterate的时候重新选择最优算法,当选选择是需要花费时间的,
23+
# 如果我们的输入在每一次的iterate的时候都进行变化,那么benchmark就会在每次iterate的时候重新选择最优算法,当选选择是需要花费时间的,pip freeze > requirements.txt
2424
# 反而速度会变慢,也就是说,如果我们每次训练的输入数据的size不变,那么开启这个就会加快我们的训练速度:
2525
seed = 1000
2626
t.manual_seed(seed) # 随机数种子,当使用随机数时,关闭进程后再次生成和上次得一样
@@ -44,11 +44,11 @@ def test(**kwargs):
4444
total = 0
4545
msglogger.info('测试数据集大小%s', len(test_dataloader))
4646
# 量化
47-
if opt.quantize_eval:
48-
model.cpu()
49-
quantizer = quantization.PostTrainLinearQuantizer.from_args(model, opt) # 量化模型
50-
quantizer.prepare_model()
51-
model.to(opt.device)
47+
# if opt.quantize_eval:
48+
# model.cpu()
49+
# quantizer = quantization.PostTrainLinearQuantizer.from_args(model, opt) # 量化模型
50+
# quantizer.prepare_model()
51+
# model.to(opt.device)
5252
model.eval() # 把module设成测试模式,对Dropout和BatchNorm有影响
5353
err_img = [('img_path', 'result', 'label')]
5454
for ii, (data, labels, img_path, tag) in tqdm(enumerate(test_dataloader)):
@@ -125,7 +125,7 @@ def train(**kwargs):
125125
pylogger = PythonLogger(msglogger)
126126
# step3: configure model
127127
model = getattr(models, opt.model)() # 获得网络结构
128-
compression_scheduler = distiller.CompressionScheduler(model)
128+
# compression_scheduler = distiller.CompressionScheduler(model)
129129
optimizer = model.get_optimizer(lr, opt.weight_decay) # 优化器
130130
if opt.load_model_path:
131131
# # 把所有的张量加载到CPU中
@@ -143,10 +143,10 @@ def train(**kwargs):
143143
optimizer = checkpoint['optimizer']
144144
model.to(opt.device) # 加载模型到 GPU
145145

146-
if opt.compress:
147-
compression_scheduler = distiller.file_config(model, optimizer, opt.compress,
148-
compression_scheduler) # 加载模型修剪计划表
149-
model.to(opt.device)
146+
# if opt.compress:
147+
# compression_scheduler = distiller.file_config(model, optimizer, opt.compress,
148+
# compression_scheduler) # 加载模型修剪计划表
149+
# model.to(opt.device)
150150
# 学习速率调整器
151151
lr_scheduler = get_scheduler(optimizer, opt)
152152
# step4: data_image
@@ -157,8 +157,8 @@ def train(**kwargs):
157157
# train
158158
for epoch in range(start_epoch, opt.max_epoch):
159159
model.train()
160-
if opt.pruning:
161-
compression_scheduler.on_epoch_begin(epoch) # epoch 开始修剪
160+
# if opt.pruning:
161+
# compression_scheduler.on_epoch_begin(epoch) # epoch 开始修剪
162162
train_losses.reset() # 重置仪表
163163
train_top1.reset() # 重置仪表
164164
# print('训练数据集大小', len(train_dataloader))
@@ -170,8 +170,8 @@ def train(**kwargs):
170170
lr = lr_scheduler.get_lr()[0]
171171
for ii, (data, labels, img_path, tag) in enumerate(train_dataloader):
172172
if not check_date(img_path, tag, msglogger): return
173-
if opt.pruning:
174-
compression_scheduler.on_minibatch_begin(epoch, ii, steps_per_epoch, optimizer) # batch 开始修剪
173+
# if opt.pruning:
174+
# compression_scheduler.on_minibatch_begin(epoch, ii, steps_per_epoch, optimizer) # batch 开始修剪
175175
train_progressor.current = ii + 1 # 训练集当前进度
176176
# train model
177177
input = data.to(opt.device)
@@ -182,21 +182,21 @@ def train(**kwargs):
182182
score = model(input) # 网络结构返回值
183183
# 计算损失
184184
loss = criterion(score, target)
185-
if opt.pruning:
186-
# Before running the backward phase, we allow the scheduler to modify the loss
187-
# (e.g. add regularization loss)
188-
agg_loss = compression_scheduler.before_backward_pass(epoch, ii, steps_per_epoch, loss,
189-
optimizer=optimizer,
190-
return_loss_components=True) # 模型修建误差
191-
loss = agg_loss.overall_loss
185+
# if opt.pruning:
186+
# # Before running the backward phase, we allow the scheduler to modify the loss
187+
# # (e.g. add regularization loss)
188+
# agg_loss = compression_scheduler.before_backward_pass(epoch, ii, steps_per_epoch, loss,
189+
# optimizer=optimizer,
190+
# return_loss_components=True) # 模型修建误差
191+
# loss = agg_loss.overall_loss
192192
train_losses.update(loss.item(), input.size(0))
193193
# loss = criterion(score[0], target) # 计算损失 Inception3网络
194194
optimizer.zero_grad() # 参数梯度设成0
195195
loss.backward() # 反向传播
196196
optimizer.step() # 更新参数
197197

198-
if opt.pruning:
199-
compression_scheduler.on_minibatch_end(epoch, ii, steps_per_epoch, optimizer) # batch 结束修剪
198+
# if opt.pruning:
199+
# compression_scheduler.on_minibatch_end(epoch, ii, steps_per_epoch, optimizer) # batch 结束修剪
200200

201201
precision1_train, precision5_train = accuracy(score, target, topk=(1, 5)) # top1 和 top5 的准确率
202202

@@ -219,14 +219,14 @@ def train(**kwargs):
219219
'loss': train_losses.avg}, ii * (epoch + 1))
220220
# train_progressor.done() # 保存训练结果为txt
221221
# validate and visualize
222-
if opt.pruning:
223-
distiller.log_weights_sparsity(model, epoch, loggers=[pylogger]) # 打印模型修剪结果
224-
compression_scheduler.on_epoch_end(epoch, optimizer) # epoch 结束修剪
222+
# if opt.pruning:
223+
# distiller.log_weights_sparsity(model, epoch, loggers=[pylogger]) # 打印模型修剪结果
224+
# compression_scheduler.on_epoch_end(epoch, optimizer) # epoch 结束修剪
225225
val_loss, val_top1, val_top5 = val(model, criterion, val_dataloader, epoch, value_writer, lr) # 校验模型
226-
sparsity = distiller.model_sparsity(model)
227-
perf_scores_history.append(distiller.MutableNamedTuple({'sparsity': sparsity, 'top1': val_top1,
228-
'top5': val_top5, 'epoch': epoch + 1, 'lr': lr,
229-
'loss': val_loss}, ))
226+
# sparsity = distiller.model_sparsity(model)
227+
# perf_scores_history.append(distiller.MutableNamedTuple({'sparsity': sparsity, 'top1': val_top1,
228+
# 'top5': val_top5, 'epoch': epoch + 1, 'lr': lr,
229+
# 'loss': val_loss}, ))
230230
# 保持绩效分数历史记录从最好到最差的排序
231231
# 按稀疏度排序为主排序键,然后按top1、top5、epoch排序
232232
perf_scores_history.sort(key=operator.attrgetter('sparsity', 'top1', 'top5', 'epoch'), reverse=True)
@@ -244,7 +244,7 @@ def train(**kwargs):
244244
"best_precision": best_precision,
245245
"optimizer": optimizer,
246246
"valid_loss": [val_loss, val_top1, val_top5],
247-
'compression_scheduler': compression_scheduler.state_dict(),
247+
# 'compression_scheduler': compression_scheduler.state_dict(),
248248
}) # 保存模型
249249
# update learning rate
250250
lr_scheduler.step(epoch) # 更新学习效率
@@ -260,18 +260,18 @@ def train(**kwargs):
260260

261261

262262
# 模型敏感性分析
263-
def sensitivity(**kwargs):
264-
opt._parse(kwargs)
265-
test_data = DatasetFromFilename(opt.data_root, flag='test')
266-
test_dataloader = DataLoader(test_data, batch_size=opt.batch_size, shuffle=False, num_workers=opt.num_workers)
267-
criterion = t.nn.CrossEntropyLoss().to(opt.device) # 损失函数
268-
model = getattr(models, opt.model)()
269-
if opt.load_model_path:
270-
checkpoint = t.load(opt.load_model_path)
271-
model.load_state_dict(checkpoint["state_dict"])
272-
model.to(opt.device)
273-
sensitivities = np.arange(opt.sensitivity_range[0], opt.sensitivity_range[1], opt.sensitivity_range[2])
274-
return sensitivity_analysis(model, criterion, test_dataloader, opt, sensitivities, msglogger)
263+
# def sensitivity(**kwargs):
264+
# opt._parse(kwargs)
265+
# test_data = DatasetFromFilename(opt.data_root, flag='test')
266+
# test_dataloader = DataLoader(test_data, batch_size=opt.batch_size, shuffle=False, num_workers=opt.num_workers)
267+
# criterion = t.nn.CrossEntropyLoss().to(opt.device) # 损失函数
268+
# model = getattr(models, opt.model)()
269+
# if opt.load_model_path:
270+
# checkpoint = t.load(opt.load_model_path)
271+
# model.load_state_dict(checkpoint["state_dict"])
272+
# model.to(opt.device)
273+
# sensitivities = np.arange(opt.sensitivity_range[0], opt.sensitivity_range[1], opt.sensitivity_range[2])
274+
# return sensitivity_analysis(model, criterion, test_dataloader, opt, sensitivities, msglogger)
275275

276276

277277
def help():

Image_recognition/main_class.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
import os
33
import operator
44
from datetime import datetime
5-
import distiller
6-
from distiller.data_loggers import *
5+
# import distiller
6+
# from distiller.data_loggers import *
77
from config import opt
88
import torch as t
99
import models
@@ -36,7 +36,7 @@ def __init__(self, **kwargs):
3636
# 4. 指数损失(Exponential Loss) :主要用于Adaboost 集成学习算法中;
3737
# 5. 其他损失(如0-1损失,绝对值损失)
3838
self.optimizer = self.model.get_optimizer(self.opt.lr, self.opt.weight_decay)
39-
self.compression_scheduler = distiller.CompressionScheduler(self.model)
39+
# self.compression_scheduler = distiller.CompressionScheduler(self.model)
4040
self.train_losses = AverageMeter() # 误差仪表
4141
self.train_top1 = AverageMeter() # top1 仪表
4242
self.train_top5 = AverageMeter() # top5 仪表
@@ -113,8 +113,8 @@ def quantize_model(self):
113113
def load_compress(self):
114114

115115
if self.opt.compress:
116-
self.compression_scheduler = distiller.file_config(self.model, self.optimizer, self.opt.compress,
117-
self.compression_scheduler) # 加载模型修剪计划表
116+
# self.compression_scheduler = distiller.file_config(self.model, self.optimizer, self.opt.compress,
117+
# self.compression_scheduler) # 加载模型修剪计划表
118118
self.model.to(self.opt.device)
119119

120120
def visualization_train(self, input, ii, epoch):
@@ -245,14 +245,14 @@ def train(self):
245245
if (ii + 1) % self.opt.print_freq == 0:
246246
self.visualization_train(input, ii, epoch)
247247
if self.opt.pruning:
248-
distiller.log_weights_sparsity(self.model, epoch, loggers=[pylogger]) # 打印模型修剪结果
248+
# distiller.log_weights_sparsity(self.model, epoch, loggers=[pylogger]) # 打印模型修剪结果
249249
self.compression_scheduler.on_epoch_end(epoch, self.optimizer) # epoch 结束修剪
250250
val_loss, val_top1, val_top5 = val(self.model, self.criterion, self.val_dataloader, epoch,
251251
self.value_writer) # 校验模型
252-
sparsity = distiller.model_sparsity(self.model)
253-
perf_scores_history.append(distiller.MutableNamedTuple({'sparsity': sparsity, 'top1': val_top1,
254-
'top5': val_top5, 'epoch': epoch + 1, 'lr': lr,
255-
'loss': val_loss}, ))
252+
# sparsity = distiller.model_sparsity(self.model)
253+
# perf_scores_history.append(distiller.MutableNamedTuple({'sparsity': sparsity, 'top1': val_top1,
254+
# 'top5': val_top5, 'epoch': epoch + 1, 'lr': lr,
255+
# 'loss': val_loss}, ))
256256
# 保持绩效分数历史记录从最好到最差的排序
257257
# 按稀疏度排序为主排序键,然后按top1、top5、epoch排序
258258
perf_scores_history.sort(key=operator.attrgetter('sparsity', 'top1', 'top5', 'epoch'), reverse=True)

0 commit comments

Comments
 (0)