Beispiel #1
0
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)))
Beispiel #2
0
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
Beispiel #3
0
    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')
Beispiel #4
0
            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))