Beispiel #1
0
def test(**kwargs):
    opt.parse(kwargs)
    import ipdb
    ipdb.set_trace()
    # configure model
    model = getattr(models, opt.model)().eval()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu: model.cuda()

    # data
    train_data = DogCat(opt.test_data_root, test=True)
    test_dataloader = DataLoader(train_data,
                                 batch_size=opt.batch_size,
                                 shuffle=False,
                                 num_workers=opt.num_workers)
    results = []
    for ii, (data, path) in enumerate(test_dataloader):
        input = t.autograd.Variable(data, volatile=True)
        if opt.use_gpu: input = input.cuda()
        score = model(input)
        probability = t.nn.functional.softmax(score)[:, 0].data.tolist()
        # label = score.max(dim = 1)[1].data.tolist()

        batch_results = [(path_, probability_)
                         for path_, probability_ in zip(path, probability)]

        results += batch_results
    write_csv(results, opt.result_file)

    return results
Beispiel #2
0
def main():

    args = prepare_parse()
    model = resnet50(num_classes=2)
    optimizer = SGD(model.parameters(),
                    lr=args.learning_rate,
                    momentum=args.momentum,
                    weight_decay=args.weight_decay,
                    nesterov=args.nesterov)
    criterion = CrossEntropyLoss()

    train_data = DogCat(args.train_data_path, training=True)
    if args.distributed:
        train_sampler = torch.utils.data.distributed.DistributedSampler(
            train_data)
    else:
        train_sampler = None
    train_loader = torch.utils.data.DataLoader(train_data,
                                               batch_size=args.batch_size,
                                               shuffle=(train_sampler is None),
                                               num_workers=args.n_threads,
                                               pin_memory=True,
                                               sampler=train_sampler)

    for ii, (image, label) in enumerate(train_loader):
        image = image.cuda()
        label = label.cuda()
        pred = model(image)
        loss = criterion(pred, label)
        print(loss)
Beispiel #3
0
def test(**kwargs):
    """
    测试
    """
    opt.parse(kwargs)
    # ipdb.set_trace() # 设置断点,进行调试
    # 配置模型
    model = getattr(models, opt.model)().eval()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu:
        model.cuda()

    # 准备测试集
    test_data = DogCat(opt.test_data_root, test=True)
    test_data_loader = DataLoader(test_data,
                                  batch_size=opt.batch_size,
                                  shuffle=False,
                                  num_workers=opt.num_workers)
    results = []
    for ii, (data, test_id) in enumerate(test_data_loader):
        input = Variable(data)
        if opt.use_gpu:
            input = input.cuda()
        pred = model(input)
        probability = F.softmax(pred)[:, 0].data.tolist()
        batch_results = [
            (test_id_.item(), probability_)
            for test_id_, probability_ in zip(test_id, probability)
        ]
        results += batch_results
    write_csv(results, opt.result_file)
    return results
Beispiel #4
0
def test(**kwargs):
    opt._parse(kwargs)

    # configure model
    model = getattr(models, opt.model)().eval()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    model.to(opt.device)

    # data
    train_data = DogCat(opt.test_data_root, test=True)
    test_dataloader = DataLoader(train_data,
                                 batch_size=opt.batch_size,
                                 shuffle=False,
                                 num_workers=opt.num_workers)
    results = []
    for ii, (data, path) in tqdm(enumerate(test_dataloader)):
        input = data.to(opt.device)
        score = model(input)
        probability = t.nn.functional.softmax(score,
                                              dim=1)[:, 0].detach().tolist()
        # label = score.max(dim = 1)[1].detach().tolist()

        batch_results = [(path_.item(), probability_)
                         for path_, probability_ in zip(path, probability)]

        results += batch_results
    write_csv(results, opt.result_file)

    return results
Beispiel #5
0
def test(**kwargs):
    """
    testing for inference
    :param kwargs:
    :return:
    """
    opt.parse(kwargs)
    ipdb.set_trace()

    # model
    model = getattr(models, opt.model)().eval()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu:
        model.cuda()

    # data
    test_data = DogCat(root=opt.test_data_root, test=True)
    test_data_loader = DataLoader(test_data, batch_size=opt.batch_size, shuffle=False,
                                  num_workers=opt.num_workers)
    results = []
    for ii, (data, path) in enumerate(test_data_loader):
        input_ = Variable(data, volatile=True)
        if opt.use_gpu:
            input_ = input_.cuda()
        score = model(input_)
        probability = F.softmax(score)[:, 1].data.tolist()
        batch_results = [(path_, probability_) for path_, probability_ in zip(path, probability)]
        results += batch_results
    write_csv(results, opt.result_file)
    return results
Beispiel #6
0
def test(**kwargs):
    '''
    测试
    '''
    #加载配置
    opt.parse(kwargs)
    model = getattr(models, opt.model)()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu:
        model = model.cuda()

    #加载数据
    test_dataset = DogCat(opt.test_data_root, test=True)
    test_loader = DataLoader(test_dataset,
                             batch_size=opt.batch_size,
                             shuffle=False,
                             num_workers=opt.num_workers)
    results = []
    for i, data in enumerate(test_loader):
        inputs, labels = data
        if opt.use_gpu:
            inputs = inputs.cuda()
        outputs = model(inputs)
        #softmax将计算结果归一化为概率,batch_results记录每一组数据的(编号,概率)字典
        probability = t.nn.functional.softmax(outputs)[:, 0].tolist()
        batch_results = [(id_num, proba)
                         for id_num, proba in zip(labels, probability)]
        results += batch_results

    write_csv(results, opt.result_file)
Beispiel #7
0
def test(**kwargs):
	opt.parse(kwargs)

	#model
	model = getattr(models, opt.model).().eval()
	if opt.load_model_path:
		model.load(opt.load_model_path)
	if opt.use_gpu:
		model.cuda()

	#data
	train_data = DogCat(opt.test_data_root, test=True)
	test_dataloader = DataLoader(train_data,,batch_size=opt.batch_size,shuffle=False,num_workers=opt.num_workers)

	results = []

	for step, (data,path) in enumerate(test_dataloader):
	input = t.autograd.Variable(data, volatile=True)
	if opt.use_gpu:
	input = input.cuda()
	socre=model(input)
	probability = t.nn.functional.softmax(score)[:,1].data.tolist()
	batch_results = [(path_,probability_) \
	        for path_,probability_ in zip(path,probability) ]
        results += batch_results
    write_csv(results,opt.result_file)
    return results


if __name__ == '__main__':
	import fire
	fire.Fire()
Beispiel #8
0
def test(**kwargs):
    """
    计算每个样本属于狗的概率,并保存为CSV文件
    :return: 
    """
    opt.parse(kwargs)
    #模型
    model = getattr(models, opt.model)().eval()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu:
        model.cuda()
    #数据
    train_data = DogCat(opt.test_data_root, test=True)
    test_dataloader = DataLoader(dataset=train_data,
                                 batch_size=opt.batch_size,
                                 shuffle=False,
                                 num_workers=opt.num_workers)
    result = []
    for II, (data, path) in enumerate(test_dataloader):
        input = Variable(data, volatile=True)
        if opt.use_gpu:
            input = input.cuda()
        score = model(input)
        probability = F.softmax(score)[:, 1].data.tolist()
        batch_results = [(path_, probability_)
                         for path_, probability_ in zip(path, probability)]
        result += batch_results
        write_csv(result, opt.result_file)
    return result
def test(**kwargs):
    '''
    猫狗大战 测试集 预测完成后写入cvs中每张图片为狗的概率
    '''
    opt.parse(kwargs)
    # 通过config中模型名称来加载模型
    model = getattr(models, opt.model)().eval()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu: model.cuda()
    # data
    train_data = DogCat(opt.test_data_root, test=True)
    test_dataloader = DataLoader(train_data,
                                 batch_size=opt.batch_size,
                                 shuffle=False,
                                 num_workers=opt.num_workers)
    results = []
    # 测试集命名只有数字  data/test1/8973.jpg    path为8973
    for ii, (data, path) in tqdm(enumerate(test_dataloader)):
        input = t.autograd.Variable(data, volatile=True)
        if opt.use_gpu:
            input = input.cuda()
        score = model(input)
        #概率  通过softmax可得概率   [:, 0]行全要,列只要第一列
        probability = t.nn.functional.softmax(score)[:, 0].data.tolist()
        #zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同(两个对象 path,probability)
        #两个对象 path,probability  逐元素拿出来打包成一个元组,返回由这些元组组成的列表
        batch_results = [(path_, probability_)
                         for path_, probability_ in zip(path, probability)]
        results = results + batch_results
    #result_file 写入的文件地址
    write_csv(results, opt.result_file)
Beispiel #10
0
def test(opt):
    # 模型进入验证模式
    model = getattr(models, opt.model)().eval()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu: model.cuda()

    # 数据
    train_data = DogCat(opt.test_data_root, test=True)
    test_dataloader = DataLoader(train_data,
                                 batch_size=opt.batch_size,
                                 shuffle=False,
                                 num_workers=opt.num_workers)
    results = []
    # index (data, id)
    for ii, (data, path) in enumerate(test_dataloader):
        # 包装 data 并记录用在它身上的 operations
        input = t.autograd.Variable(data, volatile=True)
        if opt.use_gpu:
            input = input.cuda()
        score = model(input)
        probability = t.nn.functional.softmax(score)[:, 1].data.tolist()
        batch_results = [(path_, probability_)
                         for path_, probability_ in zip(path, probability)]
        results += batch_results
    write_csv(results, opt.result_file)
    return results
Beispiel #11
0
def test(**kwargs):
    # opt.parse(kwargs)
    # import ipdb;
    # ipdb.set_trace()
    # configure model
    #model = getattr(models, opt.model)().eval()
    model=models.resnet18(pretrained=True)
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu: model.cuda()

    # data
    test_data = DogCat(opt.test_data_root,test=True)
    test_dataloader = DataLoader(test_data,batch_size=opt.batch_size,shuffle=True,num_workers=opt.num_workers)
    #print(test_dataloader)
    print("come")
    results = []
    for ii,(data,path) in tqdm(enumerate(test_dataloader)):
        input = t.autograd.Variable(data,volatile = True)
        #print("data is {}".format(data))
        print("path is {}".format(path))
        if opt.use_gpu: input = input.cuda()
        score = model(input)
        print("score is :{}".format(score))
        probability = t.nn.functional.softmax(score)[:,0].data.tolist()
        print("probability is :".format(probability))
        label = score.max(dim = 1)[1].data.tolist()
        print("Label is {}".format(label))
        batch_results = [(path_,probability_) for path_,probability_ in zip(path,probability) ]
        results += batch_results
    write_csv(results,opt.result_file)
    print(results)
    val_data = DogCat(opt.test_data_root,train=False)
    val_dataloader = DataLoader(val_data,opt.batch_size,
                        shuffle=False,num_workers=opt.num_workers)
    val_cm, val_accuracy = val(model, val_dataloader)

    print("end val function")
    print(val_cm.value(),val_accuracy)
    print("test function end")
    return results
Beispiel #12
0
def train(**kwargs):
	opt._parse(kwargs)

	# step1: configure model
	model = getattr(models, opt.model)()
	if opt.load_model_path:
		model.load(opt.load_model_path)
	if opt.use_gpu: model.cuda()

	# step2: data
	train_data = DogCat(opt.train_data_root, train = True)
	val_data = DogCat(opt.train_data_root, train = False)
	train_dataloader = DataLoader(train_data, opt.batch_size,shuffle = True, num_workers = opt.num_workers)
	val_dataloader = DataLoader(val_data, opt.batch_size,shuffle=False,num_workers=opt.num_workers)

	# step3: loss & optimizer

	critetion = t.nn.CrossEntropyLoss()
	lr = opt.lr
	optimizer = t.optim.Adam(model.parameters(),
		lr = lr,
		weight_decay = opt.weight_decay)
Beispiel #13
0
def train():
    # 1 数据
    train_data = DogCat(opt.train_data_root)
    trainloader = DataLoader(train_data, batch_size=opt.batch_size)

    val_data = DogCat(opt.val_data_root, train=False)


    # 2 模型

    model = getattr(models, opt.model)()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu:
        model.cuda()

    # 3
    criterion = torch.nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=opt.lr, weight_decay=opt.weight_decay)

    for epoch in range(opt.max_epoch):
        for ii, (data, label) in enumerate(trainloader):
            input = Variable(data)
            target = Variable(label)
            if opt.use_gpu:
                input = input.cuda()
                target = target.cuda()
            optimizer.zero_grad()
            score = model(input)
            loss = criterion(score, target)
            loss.backward()
            optimizer.step()

            if ii % 20 == 0:
                print('epochs[{}] loss {}'.format(str(epoch),str(loss.data[0])))

    model.save()
Beispiel #14
0
def test(**kwargs):
    opt.parse(kwargs)

    #data
    test_data = DogCat(opt.test_data_root, test=True)
    test_dataloader = DataLoader(test_data,
                                 batch_size=1,
                                 shuffle=False,
                                 num_workers=opt.num_workers)
    results = []

    #model
    model = models.densenet161(pretrained=True)
    #model.fc = nn.Linear(2048,2)
    #model.fc = nn.Dropout(0.2)
    model.fc = nn.Linear(1000, 2)
    model.load_state_dict(t.load('./model.pth'))
    if opt.use_gpu:
        model.cuda()
    model.eval()

    for ii, (data, path) in enumerate(test_dataloader):
        #input = Variable(data,volatile=True)
        with torch.no_grad():
            input = Variable(data)
        if opt.use_gpu:
            input = input.cuda()
        score = model(input)
        #print(score)
        path = path.numpy().tolist()
        #print path
        #print score.data,"+++++"
        _, predicted = t.max(score.data, 1)
        print(predicted)
        #print "***************"
        #print predicted
        predicted = predicted.data.cpu().numpy().tolist()
        res = ""
        for (i, j) in zip(path, predicted):
            if j == 1:
                res = "CN"
            else:
                res = "AD"
            results.append([i, "".join(res)])
        #print results

    write_csv(results, opt.result_file)
    print('完成预测!')
    return results
Beispiel #15
0
def inference():
    """
    inference
    :return:
    """
    logging.debug('Begin to inference')

    # step1: configure model
    model = torchvision.models.densenet121(pretrained=False, num_classes=2)
    if config.use_gpu:
        model = torch.nn.DataParallel(model).cuda()

    logging.info(
        'Loading checkpoint from {path}'.format(path=config.load_model_path))
    state = model_util.load(config.load_model_path)
    model.load_state_dict(state['state_dic'])
    model.eval()
    logging.info(
        'Loaded checkpoint from {path}'.format(path=config.load_model_path))

    # dataset
    test_data = DogCat(config.test_data_root, test=True)
    test_dataloader = DataLoader(test_data,
                                 batch_size=config.batch_size,
                                 shuffle=False,
                                 num_workers=config.num_workers)

    results = []
    for ii, (data, path) in enumerate(test_dataloader):
        input_var = torch.autograd.Variable(data, volatile=True)
        if config.use_gpu:
            input_var = input_var.cuda()
        score = model(input_var)
        probability = torch.nn.functional.softmax(score)[:, 0].data.tolist()
        # label = score.max(dim = 1)[1].data.tolist()

        batch_results = [(path_, probability_)
                         for path_, probability_ in zip(path, probability)]

        results += batch_results
    write_csv(results, config.result_file)

    logging.debug('End to inference')

    return results
Beispiel #16
0
def test(**kwargs):
    opt.parse(kwargs)

    #data
    test_data = DogCat(opt.test_data_root, test=True)
    test_dataloader = DataLoader(test_data,
                                 batch_size=opt.batch_size,
                                 shuffle=False,
                                 num_workers=opt.num_workers)
    results = []

    #model
    model = models.resnet34(pretrained=True)
    model.fc = nn.Linear(512, 2)
    model.load_state_dict(t.load('./model.pth'))
    if opt.use_gpu:
        model.cuda()
    model.eval()

    for ii, (data, path) in enumerate(test_dataloader):
        input = Variable(data, volatile=True)
        if opt.use_gpu:
            input = input.cuda()
        score = model(input)
        path = path.numpy().tolist()
        #print path
        #print score.data,"+++++"
        _, predicted = t.max(score.data, 1)
        #print "***************"
        #print predicted
        predicted = predicted.data.cpu().numpy().tolist()
        res = ""
        for (i, j) in zip(path, predicted):
            if j == 1:
                res = "Dog"
            else:
                res = "Cat"
            results.append([i, "".join(res)])
        #print results

    write_csv(results, opt.result_file)
    return results
Beispiel #17
0
def Visualizer(**kwargs):
    #opt.parse(kwargs)
    # import ipdb;
    # ipdb.set_trace()
    # configure model
    model = getattr(models, opt.model)().eval()
    #model=models.resnet18(pretrained=True)
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu: model.cuda()

    # data
    test_data = DogCat(opt.visualize_data_root, test=True)
    test_dataloader = DataLoader(test_data, batch_size=opt.batch_size, shuffle=True, num_workers=opt.num_workers)
    # print(test_dataloader)
    print("come")
    results = []
    for ii, (data, path) in tqdm(enumerate(test_dataloader)):
        input = t.autograd.Variable(data, volatile=True)
        # print("data is {}".format(data))
        # print("path is {}".format(path))
        imgs = input
        if opt.use_gpu: input = input.cuda()
        import time
        print("time is ")
        print(time.time())
        score = model(input)
        print(time.time())
        # print("score is :{}".format(score))
        label = score.max(dim=1)[1].data.tolist()
        print("Label is {}".format(label))
        img = torchvision.utils.make_grid(imgs)
        img = img.numpy().transpose(1, 2, 0)
        std = [0.5, 0.5, 0.5]
        mean = [0.5, 0.5, 0.5]
        img = img * std + mean
        # print(img)
        plt.imshow(img)
        plt.show()
Beispiel #18
0
def test(**kwargs):
    '''
    猫狗大战 测试集 预测完成后写入cvs中每张图片为狗的概率
    '''
    # configure model
    # 直接使用指定的module
    model = getattr(models, opt.model)().eval()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu: model.cuda()

    # data
    # 加载测试集数据
    train_data = DogCat(opt.test_data_root, test=True)
    test_dataloader = DataLoader(train_data,
                                 batch_size=opt.batch_size,
                                 shuffle=False,
                                 num_workers=opt.num_workers)
    results = []
    for ii, (data, path) in enumerate(test_dataloader):
        input = t.autograd.Variable(data, volatile=True)
        if opt.use_gpu: input = input.cuda()
        # score代表分类后的每一项的得分
        score = model(input)
        # [:,0]全行,第一列,第一列为狗,计算是狗的得分,通过softmax计算概率
        probability = t.nn.functional.softmax(score)[:, 0].data.tolist()
        # label = score.max(dim = 1)[1].data.tolist()
        # zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
        # 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同(两个对象 path,probability)
        # 两个对象 path,probability  逐元素拿出来打包成一个元组,返回由这些元组组成的列表
        # 分模块迭代results
        batch_results = [(path_, probability_)
                         for path_, probability_ in zip(path, probability)]
        # 总的results
        results += batch_results
    # result_file 写入的文件地址
    write_csv(results, opt.result_file)
    return results
Beispiel #19
0
def test(**kwargs):
    # opt.parse(kwargs)
    # import ipdb
    # ipdb.set_trace()
    # configure model
    model = getattr(models, opt.model)().eval()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu: model.cuda()
    total_label = 0
    total_probability = 0.
    # data
    train_data = DogCat(opt.test_data_root, test=True)
    test_dataloader = DataLoader(train_data,
                                 batch_size=opt.batch_size,
                                 shuffle=False,
                                 num_workers=opt.num_workers)
    results = []
    for ii, (data, path) in enumerate(test_dataloader):
        input = data
        if opt.use_gpu: input = input.cuda()
        score = model(input)
        probability = t.nn.functional.softmax(score)[:, 0].data.tolist()
        label = score.max(dim=1)[1].data.tolist()
        total_label += sum(label)
        total_probability += sum(probability)
        batch_results = [
            (label_, path_, probability_)
            for label_, path_, probability_ in zip(label, path, probability)
        ]
        results += batch_results
    write_csv(results, opt.result_file)
    if total_label / 4 >= 50:
        print(1, total_label / 4, total_probability / 400,
              total_label / 4 - total_probability / 400)
    else:
        print(0, 100 - total_label / 4, 100 - total_probability / 400,
              (100 - total_label / 4) - (total_probability / 400))
Beispiel #20
0
def train(**kwargs):
    opt._parse(kwargs)
    vis = Visualizer(opt.env, port=opt.vis_port)

    # step1: configure model
    model = getattr(models, opt.model)()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    model.to(opt.device)

    # step2: data
    train_data = DogCat(opt.train_data_root, train=True)
    val_data = DogCat(opt.train_data_root, train=False)
    train_dataloader = DataLoader(train_data,
                                  opt.batch_size,
                                  shuffle=True,
                                  num_workers=opt.num_workers)
    val_dataloader = DataLoader(val_data,
                                opt.batch_size,
                                shuffle=False,
                                num_workers=opt.num_workers)

    # step3: criterion and optimizer
    criterion = t.nn.CrossEntropyLoss()
    lr = opt.lr
    optimizer = model.get_optimizer(lr, opt.weight_decay)
    # optimizer = torch.optim.Adam(model.parameters(), lr=lr, betas=(0.9, 0.99))

    # step4: meters
    loss_meter = meter.AverageValueMeter()
    confusion_matrix = meter.ConfusionMeter(2)
    previous_loss = 1e10

    # train
    for epoch in range(opt.max_epoch):

        loss_meter.reset()
        confusion_matrix.reset()
        print("trian epoch: ", epoch)
        for ii, (data, label) in tqdm(enumerate(train_dataloader)):

            # train model
            input = data.to(opt.device)
            target = label.to(opt.device)

            optimizer.zero_grad()
            score = model(input)
            loss = criterion(score, target)
            loss.backward()
            optimizer.step()

            # meters update and visualize
            loss_meter.add(loss.item())
            # detach 一下更安全保险
            confusion_matrix.add(score.detach(), target.detach())

            if (ii + 1) % opt.print_freq == 0:
                vis.plot('loss', loss_meter.value()[0])

                # # 进入debug模式
                # if os.path.exists(opt.debug_file):
                #     import ipdb;
                #     ipdb.set_trace()

        model.save()

        # validate and visualize
        print("start eval:")
        val_cm, val_accuracy = val(model, val_dataloader)

        vis.plot('val_accuracy', val_accuracy)
        vis.log(
            "epoch:{epoch},lr:{lr},loss:{loss},train_cm:{train_cm},val_cm:{val_cm}"
            .format(epoch=epoch,
                    loss=loss_meter.value()[0],
                    val_cm=str(val_cm.value()),
                    train_cm=str(confusion_matrix.value()),
                    lr=lr))

        # update learning rate
        if loss_meter.value()[0] > previous_loss:
            lr = lr * opt.lr_decay
            # 第二种降低学习率的方法:不会有moment等信息的丢失
            for param_group in optimizer.param_groups:
                param_group['lr'] = lr

        vis.plot('lr', lr)
        previous_loss = loss_meter.value()[0]
Beispiel #21
0
def train(**kwargs):
    """根据命令行参数更新配置"""
    opt.parse(kwargs)
    #vis = Visualizer(opt.env)
    """(1)step1:加载网络,若有预训练模型也加载"""
    #model = getattr(models,opt.model)()
    model = models.alexnet(pretrained=True)
    #model.aux_logits = False
    #num_ftrs = model.fc.in_features
    print(model)
    # 自己构建的分类模型有8个类
    #model.classifier = nn.Linear(2208, 2)
    model.classifier = nn.Sequential(
        nn.Dropout(p=0.5, inplace=False),
        nn.Linear(in_features=9216, out_features=4096, bias=True),
        nn.ReLU(inplace=True), nn.Dropout(p=0.5, inplace=False),
        nn.Linear(in_features=4096, out_features=4096, bias=True),
        nn.ReLU(inplace=True),
        nn.Linear(in_features=4096, out_features=2, bias=True))
    #model.fc = nn.Dropout(0.2)
    #model.fc = nn.Softmax(2)

    #if opt.load_model_path:
    #	model.load(opt.load_model_path)
    if opt.use_gpu:  #GPU
        model.cuda()
    """(2)step2:处理数据"""
    train_data = DogCat(opt.train_data_root, train=True)  #训练集
    val_data = DogCat(opt.train_data_root, train=False)  #验证集

    train_dataloader = DataLoader(train_data,
                                  opt.batch_size,
                                  shuffle=True,
                                  num_workers=opt.num_workers)
    val_dataloader = DataLoader(val_data,
                                opt.batch_size,
                                shuffle=False,
                                num_workers=opt.num_workers)
    """(3)step3:定义损失函数和优化器"""
    criterion = t.nn.CrossEntropyLoss()  #交叉熵损失
    lr = opt.lr  #学习率
    optimizer = t.optim.SGD(model.parameters(),
                            lr=opt.lr,
                            weight_decay=opt.weight_decay)
    """(4)step4:统计指标,平滑处理之后的损失,还有混淆矩阵"""
    loss_meter = meter.AverageValueMeter()
    confusion_matrix = meter.ConfusionMeter(2)
    previous_loss = 1e10
    """(5)开始训练"""
    for epoch in range(opt.max_epoch):

        loss_meter.reset()
        confusion_matrix.reset()

        for ii, (data, label) in enumerate(train_dataloader):

            #训练模型参数
            input = Variable(data)

            target = Variable(label)

            if opt.use_gpu:
                input = input.cuda()
                target = target.cuda()

            #梯度清零
            optimizer.zero_grad()
            score = model(input)
            #result = np.round(score.cpu().detach().numpy(),3)
            #print(score.data)
            #print(result)
            #print(target.cpu().detach().numpy())

            loss = criterion(score, target)
            loss.backward()  #反向传播

            #更新参数
            optimizer.step()

            #更新统计指标及可视化
            loss_meter.add(loss.item())
            #print score.shape,target.shape
            print(np.round(score.cpu().detach().numpy()).shape)
            print(np.round(target.cpu().detach().numpy()))
            confusion_matrix.add(score.detach(), target.detach())
            print("ii:", ii, 'loss', loss_meter.value()[0])

            if ii % opt.print_freq == opt.print_freq - 1:
                #vis.plot('loss',loss_meter.value()[0])
                #print('loss',loss_meter.value()[0])
                if os.path.exists(opt.debug_file):
                    import ipdb
                    ipdb.set_trace()
        """计算验证集上的指标及可视化"""
        val_cm, val_accuracy = val(model, val_dataloader)
        #vis.plot('val_accuracy',val_accuracy)
        #vis.log("epoch:{epoch},lr:{lr},loss:{loss},train_cm:{train_cm},val_cm:{val_cm}".
        #format(epoch=epoch,loss=loss_meter.value()[0],val_cm=str(val_cm.value()),train_cm=str(confusion_matrix.value()),lr=lr))

        print("epoch:", epoch, "loss:",
              loss_meter.value()[0], "accuracy:", val_accuracy)

        if val_accuracy == 100.0:
            break
        """如果损失不再下降,则降低学习率"""
        if loss_meter.value()[0] > previous_loss:
            lr = lr * opt.lr_decay
            for param_group in optimizer.param_groups:
                param_group["lr"] = lr

        previous_loss = loss_meter.value()[0]
        # model.save()
        name = time.strftime('model' + '%m%d_%H_%M_%S.pth')
        t.save(model.state_dict(), 'checkpoints/' + name)
    # model.save()
    name = time.strftime('model' + '%m%d_%H_%M_%S.pth')
    t.save(model.state_dict(), 'checkpoints/' + name)
                    default=1,
                    metavar='seed',
                    help='random seed(default=1)')
args = parser.parse_args()

print(args)

torch.manual_seed(args.seed)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

check_file = 'checkpoints/best_model.pkl'
########data
test_data_root = 'data/test1/'
train_data_root = 'data/train/'

train_data = DogCat(train_data_root, train=True)
test_data = DogCat(test_data_root, train=False, test=True)
val_data = DogCat(train_data_root, train=False)

train_dataloader = DataLoader(dataset=train_data,
                              batch_size=args.batch_size,
                              shuffle=True,
                              num_workers=num_workers)
val_dataloader = DataLoader(dataset=val_data,
                            batch_size=args.batch_size,
                            shuffle=False,
                            num_workers=num_workers)
test_dataloader = DataLoader(dataset=test_data,
                             batch_size=args.batch_size,
                             shuffle=False,
                             num_workers=num_workers)
Beispiel #23
0
def train(**kwargs):
    opt._parse(kwargs)
    vis = Visualizer(opt.env,port = opt.vis_port)

    # step1: configure model
    model = getattr(models, opt.model)()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    model.to(opt.device)

    # step2: data
    train_data = DogCat(opt.train_data_root,train=True)
    val_data = DogCat(opt.train_data_root,train=False)
    train_dataloader = DataLoader(train_data,opt.batch_size,
                        shuffle=True,num_workers=opt.num_workers)
    val_dataloader = DataLoader(val_data,opt.batch_size,
                        shuffle=False,num_workers=opt.num_workers)
    
    # step3: criterion and optimizer
    criterion = t.nn.CrossEntropyLoss()
    lr = opt.lr
    optimizer = model.get_optimizer(lr, opt.weight_decay)
        
    # step4: meters
    loss_meter = meter.AverageValueMeter()
    confusion_matrix = meter.ConfusionMeter(2)
    previous_loss = 1e10

    # train
    for epoch in range(opt.max_epoch):
        
        loss_meter.reset()
        confusion_matrix.reset()

        train_loss = 0.
        train_acc = 0.
        i = 0

        for ii,(data,label) in tqdm(enumerate(train_dataloader)):

            # train model 
            input = data.to(opt.device)
            target = label.to(opt.device)


            optimizer.zero_grad()
            score = model(input)
            loss = criterion(score,target)

            train_loss += loss.item()
            pred = t.max(score, 1)[1]
            train_correct = (pred==target).sum()
            train_acc += train_correct.item()
            print('epoch ', epoch, ' batch ', i)
            i+=1
            print('Train Loss: %f, Acc: %f' % (loss.item(), train_correct.item() / float(len(data))))

            loss.backward()
            optimizer.step()
            
            
            # meters update and visualize
            loss_meter.add(loss.item())
            # detach 一下更安全保险
            confusion_matrix.add(score.detach(), target.detach()) 

            if (ii + 1)%opt.print_freq == 0:
                vis.plot('loss', loss_meter.value()[0])
                
                # 进入debug模式
                if os.path.exists(opt.debug_file):
                    import ipdb;
                    ipdb.set_trace()

        print('Train Loss: {:.6f}, Acc: {:.6f}'.format(train_loss / (len(
            train_data)), train_acc / (len(train_data))))


        # model.save()
        prefix = 'checkpoints/' + opt.model + '_a'+str(epoch)+'.pth'
        t.save(model.state_dict(), prefix)

        # validate and visualize
        val_cm,val_accuracy = val(model,val_dataloader, criterion, val_data)

        vis.plot('val_accuracy',val_accuracy)
        vis.log("epoch:{epoch},lr:{lr},loss:{loss},train_cm:{train_cm},val_cm:{val_cm}".format(
                    epoch = epoch,loss = loss_meter.value()[0],val_cm = str(val_cm.value()),train_cm=str(confusion_matrix.value()),lr=lr))
        
        # update learning rate
        if loss_meter.value()[0] > previous_loss:          
            lr = lr * opt.lr_decay
            # 第二种降低学习率的方法:不会有moment等信息的丢失
            for param_group in optimizer.param_groups:
                param_group['lr'] = lr
        

        previous_loss = loss_meter.value()[0]
Beispiel #24
0
def train(**kwargs):
    opt.parse(kwargs)
    # vis = Visualizer(opt.env)

    # step1: configure model
    model = getattr(models, opt.model)()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu: model.cuda()

    # step2: data
    train_data = DogCat(opt.train_data_root, train=True)
    val_data = DogCat(opt.train_data_root, train=False)
    train_dataloader = DataLoader(train_data,
                                  opt.batch_size,
                                  shuffle=True,
                                  num_workers=opt.num_workers)
    val_dataloader = DataLoader(val_data,
                                opt.batch_size,
                                shuffle=False,
                                num_workers=opt.num_workers)

    # step3: criterion and optimizer
    criterion = t.nn.CrossEntropyLoss()
    lr = opt.lr
    optimizer = t.optim.Adam(model.parameters(),
                             lr=lr,
                             weight_decay=opt.weight_decay)

    # step4: meters
    loss_meter = meter.AverageValueMeter()
    confusion_matrix = meter.ConfusionMeter(2)
    previous_loss = 1e100

    # train
    for epoch in range(opt.max_epoch):

        loss_meter.reset()
        confusion_matrix.reset()

        for ii, (data, label) in tqdm(enumerate(train_dataloader),
                                      total=len(train_data)):

            # train model
            input = Variable(data)
            target = Variable(label)
            if opt.use_gpu:
                input = input.cuda()
                target = target.cuda()

            optimizer.zero_grad()
            score = model(input)
            loss = criterion(score, target)
            loss.backward()
            optimizer.step()

            # meters update and visualize
            # loss_meter.add(loss.data[0])
            loss_meter.add(loss.item())
            confusion_matrix.add(score.data, target.data)

            # if ii % opt.print_freq == opt.print_freq - 1:
            #     vis.plot('loss', loss_meter.value()[0])

            # 进入debug模式
            # if os.path.exists(opt.debug_file):
            #     import ipdb;
            #     ipdb.set_trace()

        model.save()

        # validate and visualize
        val_cm, val_accuracy = val(model, val_dataloader)

        # vis.plot('val_accuracy', val_accuracy)
        # vis.log("epoch:{epoch},lr:{lr},loss:{loss},train_cm:{train_cm},val_cm:{val_cm}".format(
        #     epoch=epoch, loss=loss_meter.value()[0], val_cm=str(val_cm.value()), train_cm=str(confusion_matrix.value()),
        #     lr=lr))

        # update learning rate
        if loss_meter.value()[0] > previous_loss:
            lr = lr * opt.lr_decay
            # 第二种降低学习率的方法:不会有moment等信息的丢失
            for param_group in optimizer.param_groups:
                param_group['lr'] = lr

        previous_loss = loss_meter.value()[0]
Beispiel #25
0
def train(**kwargs):
    opt.parse(**kwargs)
    # step1: configure model
    model = getattr(models,opt.model)(opt.num_class)
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu:
        model.cuda()

    # step2: data
    train_data = DogCat(opt.train_data_path, transform=opt.train_transform, train = True)
    val_data = DogCat(opt.train_data_path, transform=opt.test_val_transform, train = False, test= False)
    train_dataloader = DataLoader(train_data, batch_size= opt.batch_size, shuffle=opt.shuffle, num_workers=opt.num_workers)
    val_dataloader   = DataLoader(val_data,   batch_size= opt.batch_size, shuffle=opt.shuffle, num_workers=opt.num_workers)

    # step3: criterion and optimizer
    criterion = t.nn.CrossEntropyLoss()
    lr = opt.lr
    optimizer = t.optim.Adam(params=model.parameters(), lr=lr, weight_decay=opt.weight_decay)

    # step4: meters
    loss_meter = meter.AverageValueMeter()                   # 用于统计一个epoch内的平均误差
    confusion_matrix = meter.ConfusionMeter(opt.num_class)
    previous_loss=1e6
    # step5: train
    vis  = Visualizer(opt.env)
    for epoch in range(opt.max_epoch):
        loss_meter.reset()
        confusion_matrix.reset()

        for ii,(data, label) in tqdm(enumerate(train_dataloader)):
            # train model
            input = Variable(data)
            target  = Variable(label)
            if opt.use_gpu:
                input = input.cuda()
                target = target.cuda()
            optimizer.zero_grad()
            score = model(input)
            loss = criterion(score,target)
            loss.backward()
            optimizer.step()

            loss_meter.add(loss.data)
            confusion_matrix.add(score.data, target.data)

            # ipdb.set_trace()
            if ii%opt.print_freq == opt.print_freq-1:
                vis.plot(win='loss', y=loss_meter.value()[0])

        model.save()

        # step6: validate and visualize
        val_confusion_matrix, val_accuracy = val(model, val_dataloader)
        vis.plot(win='val_accuracy',y=val_accuracy)
        vis.log(win='log_text', info=
                'epoch:{epoch}, lr:{lr}, loss:{loss}, train_cm:{train_cm}, val_cm:{val_cm}'.format(
                    epoch=epoch,lr=lr,loss=loss_meter.value()[0],train_cm=str(confusion_matrix.value()),val_cm=str(val_confusion_matrix)
                )
                )

        # step7: update learning_rate
        if loss_meter.value()[0] > previous_loss:
            lr=lr*opt.lr_decay
            for param_group in optimizer.param_groups:
                param_group['lr']=lr

        previous_loss=loss_meter.value()[0]
Beispiel #26
0
def train(**kwargs):

    # 根据命令行参数更新配置
    opt.parse(kwargs)
    vis = Visualizer(opt.env)

    # step1: 模型
    model = getattr(models, opt.model)()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu: model.cuda()

    # step2: 数据
    train_data = DogCat(opt.train_data_root, train=True)
    val_data = DogCat(opt.train_data_root, train=False)
    train_dataloader = DataLoader(train_data,
                                  opt.batch_size,
                                  shuffle=True,
                                  num_workers=opt.num_workers)
    val_dataloader = DataLoader(val_data,
                                opt.batch_size,
                                shuffle=False,
                                num_workers=opt.num_workers)

    # step3: 目标函数和优化器
    criterion = t.nn.CrossEntropyLoss()
    lr = opt.lr
    optimizer = t.optim.Adam(model.parameters(),
                             lr=lr,
                             weight_decay=opt.weight_decay)

    # step4: 统计指标:平滑处理之后的损失,还有混淆矩阵
    loss_meter = meter.AverageValueMeter()
    confusion_matrix = meter.ConfusionMeter(2)
    previous_loss = 1e100

    # 训练
    for epoch in range(opt.max_epoch):

        loss_meter.reset()
        confusion_matrix.reset()

        for ii, (data, label) in tqdm(enumerate(train_dataloader)):

            # 训练模型
            input = Variable(data)
            target = Variable(label)
            if opt.use_gpu:
                input = input.cuda()
                target = target.cuda()

            optimizer.zero_grad()
            score = model(input)
            loss = criterion(score, target)
            loss.backward()
            optimizer.step()

            print('epoch:numerate={}:{}'.format(epoch, ii))
            # 更新统计指标以及可视化
            loss_meter.add(loss.data[0])
            confusion_matrix.add(score.data, target.data)
            # print('confusion_matrix',confusion_matrix)
            # print('score.data',score.data)
            # print('target.data',target.data)
            if ii % opt.print_freq == opt.print_freq - 1:
                vis.plot('loss', loss_meter.value()[0])

                # 如果需要的话,进入debug模式
                if os.path.exists(opt.debug_file):
                    import ipdb
                    ipdb.set_trace()

        model.save()
        print('model saved ')
        # 计算验证集上的指标及可视化
        val_cm, val_accuracy = val(model, val_dataloader)
        vis.plot('val_accuracy', val_accuracy)
        vis.log(
            "epoch:{epoch},lr:{lr},loss:{loss},train_cm:{train_cm},val_cm:{val_cm}"
            .format(epoch=epoch,
                    loss=loss_meter.value()[0],
                    val_cm=str(val_cm.value()),
                    train_cm=str(confusion_matrix.value()),
                    lr=lr))

        # 如果损失不再下降,则降低学习率
        print('loss_meter.value()[0]', loss_meter.value()[0])
        if float(loss_meter.value()[0]) > previous_loss:
            # if loss_meter.value().numpy().tolist[0] > previous_loss:
            lr = lr * opt.lr_decay
            for param_group in optimizer.param_groups:
                param_group['lr'] = lr

        previous_loss = loss_meter.value()[0]
Beispiel #27
0
def train(**kwargs):
    # opt.parse(kwargs)
    vis = Visualizer(opt.env)

    savingData = []  #
    # step1: configure model
    model = getattr(models, opt.model)()
    if opt.load_model_path:
        model.load(opt.load_model_path)
    if opt.use_gpu: model.cuda()

    # step2: data
    train_data = DogCat(opt.train_data_root, train=True)
    val_data = DogCat(opt.train_data_root, train=False)
    test_data = DogCat(opt.test_data_root, test=True)
    train_dataloader = DataLoader(train_data,
                                  opt.batch_size,
                                  shuffle=True,
                                  num_workers=opt.num_workers)
    val_dataloader = DataLoader(val_data,
                                opt.batch_size,
                                shuffle=False,
                                num_workers=opt.num_workers)
    test_dataloader = DataLoader(test_data,
                                 opt.batch_size,
                                 shuffle=False,
                                 num_workers=opt.num_workers)

    # step3: criterion and optimizer
    criterion = t.nn.CrossEntropyLoss()
    lr = opt.lr
    optimizer = t.optim.Adam(model.parameters(),
                             lr=lr,
                             weight_decay=opt.weight_decay)

    # step4: meters
    loss_meter = meter.AverageValueMeter()
    confusion_matrix = meter.ConfusionMeter(2)
    previous_loss = 1e100

    # train
    for epoch in range(opt.max_epoch + 1):

        # validate and visualize
        val_cm, val_accuracy = val(model, val_dataloader)
        test_cm, test_accuracy = val(model, test_dataloader)
        vis.plot('test_accuracy', test_accuracy)
        vis.plot('lr', lr)
        vis.plot('val_accuracy', val_accuracy)
        vis.log(
            "epoch:{epoch},lr:{lr},loss:{loss},train_cm:{train_cm},val_cm:{val_cm},test_cm:{test_cm}"
            .format(epoch=epoch,
                    loss=loss_meter.value()[0],
                    val_cm=str(val_cm.value()),
                    train_cm=str(confusion_matrix.value()),
                    test_cm=str(test_cm.value()),
                    lr=lr))
        print("epoch = ", epoch, "   loss = ",
              loss_meter.value()[0], "   lr = ", lr)
        batch_results = [(epoch, loss_meter.value()[0], lr,
                          str(val_cm.value()), str(confusion_matrix.value()),
                          str(test_cm.value()), val_accuracy, test_accuracy)
                         ]  #
        savingData += batch_results  #
        save_training_data(savingData, opt.traingData_file)  #
        # update learning rate
        # if loss_meter.value()[0] > previous_loss:
        lr = lr * opt.lr_decay
        # # 第二种降低学习率的方法:不会有moment等信息的丢失
        # for param_group in optimizer.param_groups:
        #     param_group['lr'] = lr

        if epoch == opt.max_epoch:
            return

        previous_loss = loss_meter.value()[0]
        loss_meter.reset()
        confusion_matrix.reset()
        for ii, (data, label) in tqdm(enumerate(train_dataloader),
                                      total=len(train_data) / opt.batch_size):

            # train model
            input = data
            target = label
            if opt.use_gpu:
                input = input.cuda()
                target = target.cuda()

            optimizer.zero_grad()
            score = model(input)
            loss = criterion(score, target)
            loss.backward()
            optimizer.step()

            # meters update and visualize
            loss_meter.add(loss.item())
            confusion_matrix.add(score.data, target.data)

            if ii % opt.print_freq == opt.print_freq - 1:
                vis.plot('loss', loss_meter.value()[0])

                # 进入debug模式
                if os.path.exists(opt.debug_file):
                    import ipdb
                    ipdb.set_trace()

        prefix = 'checkpoints/'
        name = time.strftime(prefix + '%m%d_%H:%M:%S_' + str(epoch + 1) +
                             '.pth')
        if epoch == 0:
            model.save(name)
        if np.mod(epoch + 1, 10) == 0:
            model.save(name)
Beispiel #28
0
def train():
    """
    train function
    :return:
    """

    vis = visualizer.Visualizer(config.visdom_env)

    # step1: configure model
    model = torchvision.models.densenet121(pretrained=False, num_classes=2)
    if config.use_gpu:
        model = torch.nn.DataParallel(model).cuda()

    # step2: data
    train_data = DogCat(config.train_data_root, train=True)
    val_data = DogCat(config.train_data_root, train=False)
    train_dataloader = DataLoader(train_data,
                                  config.batch_size,
                                  shuffle=True,
                                  num_workers=config.num_workers)
    val_dataloader = DataLoader(val_data,
                                config.batch_size,
                                shuffle=False,
                                num_workers=config.num_workers)

    # step3: criterion and optimizer
    criterion = torch.nn.CrossEntropyLoss()
    lr = config.lr
    optimizer = torch.optim.Adam(model.parameters(),
                                 lr=lr,
                                 weight_decay=config.weight_decay)

    # step4: meters
    loss_meter = meter.AverageValueMeter()
    confusion_matrix = meter.ConfusionMeter(2)
    previous_loss = 1e100

    # train
    model.train()
    best_acc = -1.0
    start_epoch = -1

    # optionally resume from a checkpoint
    state = dict()
    if config.load_model_path:
        logging.info('Loading checkpoint from {path}'.format(
            path=config.load_model_path))
        state = model_util.load(config.load_model_path)
        start_epoch = state['epoch']
        best_acc = state['accuracy']
        model.load_state_dict(state['state_dic'])
        optimizer.load_state_dict(state['optimizer'])
        logging.info('Loaded checkpoint from {path}'.format(
            path=config.load_model_path))

    for epoch in range(start_epoch + 1, config.max_epoch):

        logging.info('epoch = %d' % epoch)

        loss_meter.reset()
        confusion_matrix.reset()

        for ii, (data, label) in tqdm(enumerate(train_dataloader),
                                      total=len(train_data)):

            # train model
            input_var = Variable(data)
            target_var = Variable(label)
            if config.use_gpu:
                input_var = input_var.cuda()
                target_var = target_var.cuda()

            optimizer.zero_grad()
            score = model(input_var)
            loss = criterion(score, target_var)
            loss.backward()
            optimizer.step()

            # meters update and visualize
            loss_meter.add(loss.data[0])
            confusion_matrix.add(score.data, target_var.data)

            if ii % config.print_freq == config.print_freq - 1:
                vis.plot('loss', loss_meter.value()[0])

                # 进入debug模式
                # if os.path.exists(config.debug_file):
                #     import ipdb;
                #     ipdb.set_trace()

        # validate and visualize
        val_cm, val_accuracy = val(model, val_dataloader)

        vis.plot('val_accuracy', val_accuracy)
        vis.log(
            "epoch:{epoch},lr:{lr},loss:{loss},train_cm:{train_cm},val_cm:{val_cm}"
            .format(epoch=epoch,
                    loss=loss_meter.value()[0],
                    val_cm=str(val_cm.value()),
                    train_cm=str(confusion_matrix.value()),
                    lr=lr))

        is_best = val_accuracy > best_acc
        best_acc = max(val_accuracy, best_acc)

        logging.info(
            "epoch:{epoch},lr:{lr},loss:{loss},acc:{acc} train_cm:{train_cm},val_cm:{val_cm}"
            .format(epoch=epoch,
                    loss=loss_meter.value()[0],
                    acc=val_accuracy,
                    val_cm=str(val_cm.value()),
                    train_cm=str(confusion_matrix.value()),
                    lr=lr))

        state['epoch'] = epoch
        state['model'] = config.model
        state['state_dic'] = model.state_dict()
        state['accuracy'] = val_accuracy
        state['optimizer'] = optimizer.state_dict()
        model_util.save(state, config.checkpoint_dir, is_best)

        # update learning rate
        if loss_meter.value()[0] > previous_loss:
            lr = lr * config.lr_decay
            # 第二种降低学习率的方法:不会有moment等信息的丢失
            for param_group in optimizer.param_groups:
                param_group['lr'] = lr

        previous_loss = loss_meter.value()[0]
Beispiel #29
0
    # load best model weights
    model.load_state_dict(best_model_wts)

    return model, train_acc, valid_acc


TRAIN_DATA_ROOT = './dogs-vs-cats/train/'  # 训练集存放路径
TEST_DATA_ROOT = './dogs-vs-cats/test1'  # 测试集存放路径
BATCH_SIZE = 64
EPOCH = 10
LR = 0.001
MOMENTUM = 0.9
NUM_WORKER = 4

train_data = DogCat(TRAIN_DATA_ROOT, train=True)
val_data = DogCat(TRAIN_DATA_ROOT, train=False)
train_dataloader = Data.DataLoader(train_data,
                                   BATCH_SIZE,
                                   shuffle=True,
                                   num_workers=NUM_WORKER)
val_dataloader = Data.DataLoader(val_data,
                                 BATCH_SIZE,
                                 shuffle=False,
                                 num_workers=NUM_WORKER)
dataloaders = {'train': train_dataloader, 'val': val_dataloader}
#train_inputs, train_labels = train_dataloader
#val_inputs, val_labels = val_dataloader
datasizes = {'train': train_data.__len__(), 'val': val_data.__len__()}
print('data loaded!')
print(datasizes)
Beispiel #30
0
def train(**kwargs):
    opt._parse(kwargs)
    print(opt)
    # vis = Visualizer(opt.env,port = opt.vis_port)

    # step1: configure model
    model = getattr(models, opt.model)()
    if opt.load_model_path:
        model.load(opt.load_model_path, opt.use_gpu)
    model.to(opt.device)

    # step2: data
    train_data = DogCat(opt.train_data_root, train=True)
    val_data = DogCat(opt.train_data_root, train=False)
    train_dataloader = DataLoader(train_data,
                                  opt.batch_size,
                                  shuffle=True,
                                  num_workers=opt.num_workers)
    val_dataloader = DataLoader(val_data,
                                opt.batch_size,
                                shuffle=False,
                                num_workers=opt.num_workers)

    # step3: criterion and optimizer
    criterion = t.nn.CrossEntropyLoss()
    lr = opt.lr
    optimizer = model.get_optimizer(lr, opt.weight_decay)
    lr_scheduler = LRS.ExponentialLR(optimizer, gamma=opt.lr_decay)

    # step4: meters
    loss_meter = meter.AverageValueMeter()
    confusion_matrix = meter.ConfusionMeter(4)
    previous_loss = 1e10

    # train
    for epoch in range(opt.max_epoch):
        loss_meter.reset()
        confusion_matrix.reset()

        for ii, (data, label) in tqdm(enumerate(train_dataloader)):

            # train model
            input = data.to(opt.device)
            target = label.to(opt.device)

            optimizer.zero_grad()
            score = model(input)
            loss = criterion(score, target)
            loss.backward()
            optimizer.step()

            # meters update and visualize
            loss_meter.add(loss.item())
            # detach 一下更安全保险
            confusion_matrix.add(score.detach(), target.detach())

            if (ii + 1) % opt.print_freq == 0:
                print('Train Epoch: {} Loss: {:.6f}, lr={:.5f}'.format(
                    epoch,
                    loss_meter.value()[0], optimizer.param_groups[0]['lr']))
                # vis.plot('loss', loss_meter.value()[0])

                # 进入debug模式
                if os.path.exists(opt.debug_file):
                    import ipdb
                    ipdb.set_trace()

        if epoch % 100 == 99:
            model.save(epoch=epoch, label=opt.label_name)

        # validate and visualize
        val_cm, val_accuracy = val(model, val_dataloader)
        # update learning rate by lr_scheduler
        lr_scheduler.step(epoch=epoch)

        print('Val set: Average loss: {:.4f}, Accuracy: ({:.2f}%)\n'.format(
            loss_meter.value()[0], val_accuracy))
        with open(opt.loss_file, 'a') as f:
            f.write(str(loss_meter.value()[0]) + '\n')
        with open(opt.acc_file, 'a') as f:
            f.write(str(val_accuracy) + '\n')
        # vis.plot('val_accuracy',val_accuracy)
        # vis.log("epoch:{epoch},lr:{lr},loss:{loss},train_cm:{train_cm},val_cm:{val_cm}".format(
        #             epoch = epoch,loss = loss_meter.value()[0],val_cm = str(val_cm.value()),train_cm=str(confusion_matrix.value()),lr=lr))

        # update learning rate by validation
        if loss_meter.value()[0] > previous_loss:
            lr = lr * opt.lr_decay
            # 第二种降低学习率的方法:不会有moment等信息的丢失
            for param_group in optimizer.param_groups:
                param_group['lr'] = lr
        previous_loss = loss_meter.value()[0]