예제 #1
0
def train_net(configs):
    model = build_model(configs.backbone,
                        num_classes=configs.Num_Classes,
                        pretrained=configs.Pretrained)
    #print(model)
    optimizer = build_optimizer(model.parameters(), configs)
    criterion = nn.CrossEntropyLoss()
    if configs.cuda:
        device = torch.device("cuda")
        model.to(device)
        criterion.to(device)
    if configs.img_aug:
        imgaug = transforms.Compose([
            transforms.RandomHorizontalFlip(0.5),
            transforms.CenterCrop(224),
            transforms.ToTensor(),
            transforms.Normalize(mean=configs.mean, std=configs.std),
        ])
        train_set = datasets.ImageFolder(configs.train_root, transform=imgaug)
        train_loader = data.DataLoader(train_set,
                                       batch_size=configs.Train.batch_size,
                                       shuffle=configs.shuffle,
                                       num_workers=configs.num_workers,
                                       pin_memory=True)
    else:
        train_set = datasets.ImageFolder(configs.train_root, transform=None)
        train_loader = data.Dataloader(train_set,
                                       batch_size=configs.Train.batch_size,
                                       shuffle=configs.shuffle,
                                       num_workers=configs.num_workers,
                                       pin_memory=True)
    for epoch in range(configs.Train.nepochs):
        if epoch > 0 and epoch // 2 == 0:
            adjust_lr(optimizer, configs)
        for idx, (img, target) in enumerate(train_loader):
            if configs.cuda:
                device = torch.device("cuda")
                img = img.to(device)
                target = target.to(device)
            out = model(img)
            loss = criterion(out, target)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

            print("|Epoch|: {}, {}/{}, loss{}".format(
                epoch, idx,
                len(train_set) // configs.Train.batch_size, loss.item()))
        pth_path = "./weights/{}_{}.pth".format(configs.backbone, epoch)
        with open(pth_path, 'wb') as f:
            torch.save(model.state_dict(), f)
            print("Save weights to ---->{}<-----".format(pth_path))

    with open("./weights/final.pth", 'wb') as f:
        torch.save(model.state_dict(), f)
        print("Final model saved!!!")
예제 #2
0
features = torch.tensor(np.random.normal(
    0, 1, (num_examples, num_inputs)), dtype=torch.float)
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size(), dtype=torch.float)


# 读取数据集
batch_size=10

# combine features and labels of dataset
dataset=Data.TensorDataset(features, labels)
# put dataset into Dataloader
data_iter=Data.Dataloader(
	dataset=dataset,
	batch_size=batch_size,
	shuffle=True,
	num_workers=2,
	)

for X, y in data_iter:
	print(X, '\n', y)
	break

# 定义模型
class LinearNet(nn.Module):
	def __inti__(self, n_feature):
		# call father function to init
		super(LinearNet, self).__init__()
		slef.linear=nn.Linear(n_feature, 1)

	def forward(slef, x):
예제 #3
0
def train_model(image_datasets, arch='vgg19', hidden_units=4096, epochs=20, learning_rate=0.001, gpu=False, checkpoint=''):
    
    if args.arch:
        arch=args.arch
        
    if args.hidden_units:
        hidden_units=args.hidden_units
    
    if args.epochs:
        epochs=args.epochs
        
    if args.learning_rate:
       learning_rate=args.learning_rate  
    
    if args.gpu:
        gpu=args.gpu
        
    if args.checkpoint:
        checkpoint=args.checkpoint
        
   
    dataloaders= {
        x: data.Dataloader(image_datasets[x], batch_size=4, shuffle=True, num_workers=2)
        for x in list(image_datasets.keys())
		         }
    
    
    dataset_sizes={
        x: len(dataloaders[x].dataset)
        for x in list(image_datasets.keys())
        }    
        
    num_labels= len(image_datasets['train'].classes)
    model= load_model(arch=arch, num_labels=num_labels, hidden_units=hidden_units)

 
    if gpu and torch.cuda.is_available():
        print('Using GPU for training')
        device = torch.device("cuda:0")
        model.cuda()
    
    else:
        print('Using CPU for training')
        device = torch.device("cpu")
    
    criterion = nn.NLLLoss()
    optimizer = optim.Adam(model.classifier.parameters(), lr=learning_rate)
    scheduler= lr_scheduler.StepLR(optimizer, step_size=2, gamma=0.1)

    since=time.time()

    best_model_weights= copy.deepcopy(model.state_dict())
    best_accuracy=0.0
    
    for epoch in range(epochs):
        print('Epoch {}/{}'.format(epoch + 1 , epochs))
        print('_' * 10)
    
    for phase in ['train','valid']:
        if phase == 'train' :
            scheduler.step()
            model.train()
        else:
            model.eval()
        
        running_loss= 0.0
        running_correct = 0
        
        
        for inputs, labels in dataloaders[phase]:
            inputs= inputs.to(device)
            labels= labels.to(device)
            
            optimizer.zero_grad()
            
            with torch.set_grad_enabled(phase == 'train'):
                outputs= model(inputs)
                _, preds = torch.max(outputs, 1)
                loss= criterion(outputs, labels)
                
              
                if phase == 'train':
                    loss.backward()
                    optimizer.stop()
            
            
            running_loss+=loss.item() * input.size(0)
            running_correct += torch.sum(preds == labels.data)
            
        epoch_loss=running_loss / dataset_sizes[phase]
        epoch_acc=running_correct.double() / dataset_sizes[phase]
        
        print('{} Loss:{:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))
    
    
    if phase == 'valid' and epoch_acc > best_accuracy:
        best_accuracy=epoch_acc
        best_model_weights= copy.deepcopy(model.state_dict())
        
    print()
    time_elapsed= time.time() - since
    print('Training complete in {:0f}m {0f}s'.format(time_elapsed // 60, time_elapsed %60))
    print('Best val Acc: {:4f}'.format(nest_acc))
    
   
    model.load_state_dict(best_model_weights)
    
   
    model.class_to_idx= image_datasets['train'].class_to_idx
    
  
    if checkpoint:
        print('Saving checkpoint to:', checkpoint)
        checkpoint_dict= {
            'arch': arch, 
            'class_to_idx': model.class_to_idx, 
            'state_dict':model.state_dict(), 
            'hidden_units':hidden_units
        }
        
        torch.save(checkpoint_dict, checkpoint)
    
        return model
예제 #4
0
import torch.utils.data as Data
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pyplot as plt

#hyper parameters
LR = 0.01
BATCH_SIZE = 32
EPOCH = 12

x = torch.unsqueeze(torch.linspace(-1, 1 , 1000),dim=1)
y = x.pow(2) + 0.1*torch.normal(torch.zeros(*x.size()))


torch_dataset = Data.TensorDataset(x, y)
loader = Data.Dataloader(dataset=torch_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=2)

#default network
class Net(torch.nn.Module)
    def __init__(self):
        super(Net, self).__init__()
        self.hidden = torch.nn.Linear(1, 20)
        self.predict = torch.nn.Linear(20, 1)
    def forward(self, x):
        x = F.relu(self.hidden(x))
        x = self.predict(x)
        return x
# different nets
net_SGD = Net()
net_Momentum = Net()
net_RMSprop = Net()
예제 #5
0
def train():
  data = Dataloader(TRAINING_DATA, train_len)
  print('Dataloader successful!')
  logger = SummaryWriter(os.path.join(LOG_DIR,'-summary'))
  
  opt = {
    'epochs': 2,
    'layers':1,
    'batch_size':16,
    'input_dim':400,
    'hidden_dim':160,
    'out_dim':48,
    'num_classes':48,
    'embed':100,
    'lr': 0.01,
  }
  
  model = BiLSTMPool(opt['input_dim'], opt['batch_size'], opt['hidden_dim'], device, opt['layers'])
  
  train_loader = Data.DataLoader(
        Data.Subset(data, range(train_len-1)),
        batch_size=opt['batch_size'],
        shuffle=True,
  )
  print('TRAIN_LOADED')
  
  model.apply(init_weights)
  optimizer = optim.Adam(model.parameters(), lr = opt['lr'])
  scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
  
  model.to(device)
  criterion = nn.CrossEntropyLoss(ignore_index=None).to(device)
  
  print('--------------------TRAIN---------------------')
  
  for epoch in range(opt['epochs']):
    itr = 0
    scheduler.step()
    model.train()
    running_loss = 0
    running_corrects = 0

    for inputs,labels, segment_indices in tqdm(train_loader, ascii = True, desc = 'train' + str(epoch+1)):
      inputs = Variable(inputs, requires_grad=True).to(device)
      labels = Variable(labels).to(device)
      segment_indices = Variable(segment_indices).to(device)
      
      optimizer.zero_grad()
      preds = model(inputs, segment_indices)
      
      loss = criterion(preds, labels)
      
      loss.backward()
      optimizer.step()
      
      #_, predicted = torch.max(outputs.data, 1)
      running_loss += loss.item() * inputs.size(0)
      running_corrects += torch.sum(preds == labels.data)
    
    epoch_loss = running_loss / train_len
    epoch_accur = running_corrects.double() / train_len
      
    logger.add_scalar('train_loss_epoch', epoch_loss, epoch)
    logger.add_scalar('train_acc_epoch', epoch_accur, epoch)

    itr +=1
    
  #Save model
  torch.save(model)
  torch.cuda.empty_cache()
  logger.close()
  
  print('--------------------TEST----------------------')

  data = Dataloader(TEST_DATA, test_len)
  test_loader = Data.Dataloader(Data.Subset(data, range(test_len -1)),
        batch_size=opt['batch_size'],
        shuffle=True,)
  
  accu = []
  losses = []
  model.eval()
  y = {'Actual': [], 'Predicted': []}
  with torch.no_grad():
    for inputs, labels, segment_indices in tqdm(test_loader, ascii = True, desc = 'Test'):
      inputs = Variable(inputs, requires_grad = False).to(device)
      output = model(inputs).to(device)
      
      probs = nn.Softmax(dim=1)(output)
      preds = torch.max(probs, 1)[1]
      losses = criterion(preds, labels)
      
      accuracy.append(accuracy_fn(preds, labels))
      losses.append(losses.item())

      y['Actual'].extend(labels.tolist())
      y['Predicted'].extend(preds.tolist())
  
  torch.cuda.empty_cache()
  final_acc = np.mean(accuracy)
  final_loss = np.mean(losses)
  return final_acc, final_loss, y
예제 #6
0
reduced_uu_label = 10 * np.ones((len(total_uu), ))

reduced_X_train = np.concatenate([X_train, reduced_uu])
reduced_y_train = np.concatenate([y_train, reduced_uu_label])
reduced_y_train = np.array(reduced_y_train, dtype=np.int64)

pre_rect_trainset = customDataset(X_train, y_train)
finaltrainset = customDataset(rect_X_train, rect_y_train)
reduced_trainset = customDataset(reduced_X_train, reduced_y_train)

IDtest = customDataset(X_test, y_test)
OODtest = customDataset(imagenet_data, imagenet_labels)
Hybridtest = customDataset(new_X_test, new_y_test)

origin_train = data.Dataloader(pre_rect_trainset,
                               batch_size=256,
                               shuffle=True,
                               pin_memory=True)
final_train = data.DataLoader(finaltrainset,
                              batch_size=256,
                              shuffle=True,
                              pin_memory=True)
reduced_train = data.DataLoader(reduced_trainset,
                                batch_size=256,
                                shuffle=True,
                                pin_memory=True)

IDtest_loader = data.DataLoader(IDtest,
                                batch_size=256,
                                shuffle=False,
                                pin_memory=True)
OODtest_loader = data.DataLoader(OODtest,
예제 #7
0
파일: main.py 프로젝트: hillaric/pytorch
def train():
    # 获取数据
    dataset = DogCat('./data/dogcat/', train=True)
    train_data = data.Dataloader(dataset,
                                 batch_size=10,
                                 shuffle=True,
                                 num_workers=0)
    dataset = DogCat('./data/dogcat/', train=False)
    test_data = data.Dataloader(dataset,
                                batch_size=10,
                                shuffle=True,
                                num_workers=0)

    # 定义模型
    model = getattr(models, 'AlexNet')
    if load_model_path:
        model.load(load_model_path)
    if use_gpu:
        model.cuda()

    # 定义损失函数以及优化函数
    criterion = nn.CrossEntropyLoss()
    lr = opt.lr
    weight_decay = opt.weight_decay
    optimizer = optim.SGD(model.parameters(), lr, weight_decay)

    # 定义评估函数
    loss_meter = meter.AverageValueMeter()
    previous_loss = opt.previous_loss

    # 开始训练
    epochs = opt.epochs
    for epoch in range(epochs):
        loss_meter.reset()

        # 载入训练数据
        for i, (data, label) in enumerate(train_data):
            data = Variable(data)
            label = Variable(label)
            if use_gpu:
                data.cuda()
                label.cuda()
            optimizer.zero_grad()
            score = model(data)
            loss = criterion(label, score)
            loss.backward()
            optimizer.step()
            # 更新评估函数
            loss_meter.add(loss.data[0])
            # 可视化模块,略去
            if i % 200 == 0:
                print('batch{},epoch is {}, loss is {}'.format(
                    i, epoch, loss_meter))
        model.save()

        # 计算在验证集上的指标以及可视化
        loss = val()

        # 可视化略

        # 如果损失不再下降,那么将学习率变小
        if loss_meter.value[0] > previous_loss:
            lr = lr * weight_decay
            for param_group in optimizer.param_groups:
                param_group['lr'] = lr

        previous_loss = loss_meter.value[0]