Esempio n. 1
0
def train():

    train_set = torchvision.datasets.FashionMNIST(
        root='./data/FashionMNIST',
        train=True,
        download=True,
        transform=transforms.Compose([
            transforms.ToTensor()
        ])
    )

    params = OrderedDict(
        lr=[0.01, 0.001],
        batch_size=[100, 1000],
        shuffle=[True, False],
        num_workers=[2]
    )

    runManager = RunManager()

    for run in RunBuilder.get_runs(params):

        network = finalModel()
        loader = DataLoader(
            train_set, batch_size=run.batch_size, shuffle=run.shuffle, num_workers=run.num_workers)

        optimizer = optim.Adam(network.parameters(), lr=run.lr)

        runManager.begin_run(run, network, loader)

        for epoch in range(10):
            runManager.begin_epoch()
            for batch in loader:

                images, labels = batch
                # support computation based on device type
                images = images.to(get_device_type())
                labels = labels.to(get_device_type())

                preds = network(images)
                loss = F.cross_entropy(preds, labels)

                optimizer.zero_grad()
                loss.backward()
                optimizer.step()

                runManager.track_loss(loss)
                runManager.track_num_correct(preds, labels)

            runManager.end_epoch()

        runManager.end_run()
    runManager.save('results')
    int(trainingSize * numOfTrainingSamples),
    int(validationSize * numOfTrainingSamples)
]
# splits = splits.astype(int)
print(f"{splits}")
train_set, val_set = dataset.random_split(init_train_data, splits)

for run in RunBuilder.get_runs(params):
    network = MyConvNet()
    loader = DataLoader(train_set,
                        batch_size=run.batch_size,
                        num_workers=run.num_workers,
                        shuffle=run.shuffle)
    optimizer = optim.Adam(network.parameters(), lr=run.lr)

    m.begin_run(run, network, loader)
    for epoch in range(50):
        m.begin_epoch()
        for batch in loader:
            print(m.epoch_count)
            images, labels = batch
            preds = network(images)
            loss = F.cross_entropy(preds, labels)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

            m.track_loss(loss)
            m.track_num_correct(preds, labels)
        m.end_epoch()
Esempio n. 3
0
    # 三、训练网络
    for run in RunBuilder.get_runs(params):

        device = torch.device(run.device)
        # 生成模型实例
        network = Network().to(device)
        # 指定优化器,learning rate
        optimizer = optim.Adam(network.parameters(), lr=run.lr)
        # batch_size
        data_loader = DataLoader(trainsets[run.trainset],
                                 run.batch_size,
                                 shuffle=run.shuffle,
                                 num_workers=run.num_workers)
        # record hyper-parameters
        m.begin_run(run, network, data_loader)
        # 循环训练
        for epoch in range(5):
            # record accuracy,loss……
            m.begin_epoch()
            for batch in data_loader:
                # 解包
                images = batch[0].to(device)
                labels = batch[1].to(device)
                # # 对标签进行独热编码
                # enc = OneHotEncoder(sparse=False)
                # # 一个train_data含有多个特征,使用OneHotEncoder时,特征和标签都要按列存放, sklearn都要用二维矩阵的方式存放
                # one_hot_labels = enc.fit_transform(
                #     labels.reshape(-1, 1))  # 如果不加 toarray() 的话,输出的是稀疏的存储格式,即索引加值的形式,也可以通过参数指定 sparse = False 来达到同样的效果

                # 预测
    def __train_network(self, model, train_set, run, save_logistics_file_path, epochs, type_of_model, show_plot):
        device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
        print("-------------------------------------------------------------------", device)
        loss_val = []
        acc_val = []
        batch_size = run.batch_size
        lr = run.lr
        shuffle = run.shuffle

        # set batch size
        data_loader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=shuffle, num_workers=1,
                                                  pin_memory=True)

        save_file_name = save_logistics_file_path + self.__get_file_name(type_of_model, shuffle, lr, batch_size)
        # model = self.__getModel(type_of_model)
        tb_summary = self.__get_tb_summary_title(type_of_model)

        # set optimizer - Adam

        optimizer = optim.Adam(model.parameters(), lr=lr)

        # initialise summary writer
        run_manager = RunManager()

        run_manager.begin_run(run, model, data_loader, device, tb_summary)

        torch.backends.cudnn.enabled = False

        # start training
        for epoch in range(epochs):
            run_manager.begin_epoch()

            for batch in data_loader:
                images, labels = batch
                images = images.to(device)
                labels = labels.to(device)

                # forward propagation
                predictions = model(images)

                loss = F.cross_entropy(predictions, labels)

                # zero out grads for every new iteration
                optimizer.zero_grad()

                # back propagation
                loss.backward()

                # update weights
                # w = w - lr * grad_dw
                optimizer.step()

                run_manager.track_loss(loss)
                run_manager.track_total_correct_per_epoch(predictions, labels)

            run_manager.end_epoch()
            loss_val.append(run_manager.get_final_loss_val())
            acc_val.append(run_manager.get_final_accuracy())

        run_manager.end_run()
        run_manager.save(save_file_name)
        if show_plot:
            self.plot_loss_val(loss_val, run)
            self.plot_accuracy_val(acc_val, run)

        return model