def train(net, lr, trainloader, epoch): """ Train SSD @args net: (nn.Module) network lr: (float) learning rate trainloader: (DataLoader) dataloader epoch: (int) training epoch """ net.train() optimizer = optim.SGD(net.parameters(), lr=args.lr, momentum=0.9, weight_decay=1e-4) criterion = MultiBoxLoss(num_classes=config[args.dataset]['num_classes']+1) progress_bar = ProgressBar(total=len(trainloader)) train_loss = 0 torch.set_printoptions(threshold=10000) for batch_idx, (images, loc_targets, conf_targets) in enumerate(trainloader): images = Variable(images.cuda()) loc_targets = Variable(loc_targets.cuda()) conf_targets = Variable(conf_targets.cuda()) optimizer.zero_grad() loc_preds, conf_preds = net(images) loc_loss, conf_loss, loss = criterion(loc_preds, loc_targets, conf_preds, conf_targets) loss.backward() optimizer.step() writer.add_scalar('train/loss_loc', loc_loss, batch_idx + epoch * len(trainloader)) writer.add_scalar('train/loss_conf', conf_loss, batch_idx + epoch * len(trainloader)) writer.add_scalar('train/loss_total', loss, batch_idx + epoch * len(trainloader)) train_loss += loss.item() progress_bar.move(leftmsg="training epoch " + str(epoch), rightmsg="loss: %.6f" % (train_loss/(batch_idx+1)))
def test(net, testloader, epoch): net.eval() criterion = MultiBoxLoss(num_classes=config[args.dataset]['num_classes']+1) progress_bar = ProgressBar(total=len(testloader)) test_loss = 0 for batch_idx, (images, loc_targets, conf_targets) in enumerate(testloader): images = Variable(images.cuda()) loc_targets = Variable(loc_targets.cuda()) conf_targets = Variable(conf_targets.cuda()) with torch.no_grad(): loc_preds, conf_preds = net(images) _, _, loss = criterion(loc_preds, loc_targets, conf_preds, conf_targets) test_loss += loss.item() progress_bar.move(leftmsg="test epoch " + str(epoch), rightmsg="loss: %.6f" % (test_loss/(batch_idx+1))) writer.add_scalar('test/loss', loss, epoch) return test_loss / len(testloader) # average
def backtest(self, testlist='all', start='20110101', end=None, savepath=PATH + '/data/backtest_records.csv'): """ backtest(self, testlist='all', start='20110101', end=None): 回测系统,统计成功率和平均收益率和持有天数 # TODO: 对学习系统还应该有准确率和召回率 Input: testlist: ('all' or list of code): 要进行回测的股票列表, 'all'为全部股票 start: (string of date): 回测数据的起始时间(含start) end: (string of date): 回测数据的结束时间(含end) savepath: (string): 生成的记录报告的保存路径,为None则不保存 Return: None """ if testlist is 'all': testlist = [] for pool in ['0', '3', '6']: testlist.extend(get_stock_list(stock_pool=pool)) con0 = get_connection(stock_pool='0') con3 = get_connection(stock_pool='3') con6 = get_connection(stock_pool='6') con = {'0': con0, '3': con3, '6': con6} records, records_tmp = pd.DataFrame(), pd.DataFrame() cnt = 0 bar = ProgressBar(total=len(testlist)) for code in testlist: bar.log(code) sql = 'select distinct * from ' + code + ' where date>=' + start\ + ((' and date<='+end) if end is not None else '') + ';' df = pd.read_sql(sql, con[code[2]]) self.df = _sort(df) self.df['date'] = self.df['date'].apply(lambda x: Timestamp(x)) self.buy() self.sell() if self.record is not None and len(self.record) > 0: self.record = self.record.apply( lambda record: self.integrate(record), axis=1) if self.record is not None and len(self.record) > 0: records_tmp = self.record.append(records_tmp) cnt += 1 if cnt >= 100: records = records_tmp.append(records) records_tmp = pd.DataFrame() cnt = 0 bar.move() records = records_tmp.append(records) if len(records) > 0: self.avggainrate = round(records['gainrate'].mean(), 4) - self.gainbias self.successrate = round( len(records[records['gainrate'] > self.gainbias]) / len(records), 4) self.keepdays = round(records['keepdays'].mean(), 2) if savepath is not None: records.to_csv(savepath) print('records is saved at ' + savepath) else: print('No records')
transform = transforms.Compose([ transforms.Resize((300, 300)), transforms.ToTensor(), transforms.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)) ]) image = transform(img) image = Variable(image[None, :, :, :].cuda()) timer.tic() loc, conf = net(image) batch_time = timer.toc() boxes, labels, scores = data_encoder.decode( loc.squeeze(0), F.softmax(conf.squeeze(0), dim=1)) draw = ImageDraw.Draw(img) for i, box in enumerate(boxes): if int(labels[i].item()) == 0: continue box[::2] *= img.width box[1::2] *= img.height draw.rectangle(list(box), outline='red') draw.text( (box[0], box[1]), config[args.dataset]['class_name'][int(labels[i].item())] + ' %.3f' % scores[i].item()) img.save(os.path.join('./results', image_path)) progress_bar.move(leftmsg="test", rightmsg="fps: %.2f" % (1 / batch_time))