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')
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() m.end_run() m.save('results')
# loss = F.mse_loss(preds.type(torch.FloatTensor),torch.tensor(one_hot_labels,dtype = torch.float32),reduction="mean") # ****为什么梯度为None,因为我的标签是0~9的类别编号,并没有转换成独热码。分类问题拟合的是一个概率分布,就是在每一个位置的分布律。 # 回归问题才是用具体的数值 loss = F.cross_entropy( preds, labels ) # 直接输入preds 因为crossEntropy内部封装了softMax,它需要把每一行的预测结果装换成对应的概率 # 不同批次的遗留梯度清零 optimizer.zero_grad() # calculate gradients loss.backward() # print(torch.max(network.conv1.weight.grad)) # Update weights optimizer.step() # calculate each batch's total loss m.track_loss(loss, batch) # accumulate the num of correct prediction m.track_num_correct(preds, labels) # calculate accuracy and write run_data to file m.end_epoch() # # show information # string = 'epoch:%d loss = %f accuracy = %f' % (epoch,loss.item()) # print(string) m.end_run() # input file name to save hyper-parameters results m.save(str(time.time()) + 'results') # 四、评价模型 from sklearn.metrics import confusion_matrix from plotcm import plot_confusion_matrix from matplotlib import pyplot as plt
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