From 820f6790679723c292878040454cdaf026dd5309 Mon Sep 17 00:00:00 2001 From: unlockable Date: Sat, 18 May 2024 00:12:06 +0800 Subject: [PATCH] SVM and PCA not working --- hw3/code/data_preprocess.py | 21 +++--- hw3/code/svm_hw.py | 29 +++++--- hw3/code/test_svm.py | 32 +++++---- hw3/code/train_svm.py | 67 ++++++++++-------- hw3/report/img/check/check.png | Bin 0 -> 19287 bytes hw3/report/img/preprocess/preprocess_test.png | Bin 0 -> 17927 bytes .../img/preprocess/preprocess_train.png | Bin 0 -> 18415 bytes hw3/report/img/preprocess/preprocess_val.png | Bin 0 -> 16952 bytes 8 files changed, 85 insertions(+), 64 deletions(-) create mode 100644 hw3/report/img/check/check.png create mode 100644 hw3/report/img/preprocess/preprocess_test.png create mode 100644 hw3/report/img/preprocess/preprocess_train.png create mode 100644 hw3/report/img/preprocess/preprocess_val.png diff --git a/hw3/code/data_preprocess.py b/hw3/code/data_preprocess.py index 5f09006..af110ed 100644 --- a/hw3/code/data_preprocess.py +++ b/hw3/code/data_preprocess.py @@ -3,8 +3,8 @@ # Homework 3 Support Vector Machine # data_preprocess.py - Using pretrained convolutional layers to extract feature, # and using PCA for dimensionality reduction -# Student ID: -# Name: +# Student ID: 2022010639 +# Name: Yixuan Gao # Tsinghua University # (C) Copyright 2024 # ======================================================== @@ -29,7 +29,9 @@ def preprocess(pre_conv, data_root, image_size, classes): data_mean, u = PCA(train_data, 2) # TODO: using PCA to compress the dimensionality of the train_data after subtracting the mean vector - train_data_pca = ??? + print(train_data) + print(data_mean) + train_data_pca = (train_data - data_mean) @ u visualize(train_data_pca, train_label, "train") savedata(train_data_pca, train_label, data_root+"/train.pt") @@ -40,7 +42,7 @@ def preprocess(pre_conv, data_root, image_size, classes): val_data, val_label = loaddata(pre_conv, data_root, 'val', image_size, classes) # TODO: using PCA to compress the dimensionality of the val_data after subtracting the mean vector - val_data_pca = ??? + val_data_pca = (val_data - data_mean) @ u visualize(val_data_pca, val_label, "val") savedata(val_data_pca, val_label, data_root+"/val.pt") @@ -51,7 +53,7 @@ def preprocess(pre_conv, data_root, image_size, classes): test_data, test_label = loaddata(pre_conv, data_root, 'test', image_size, classes) # TODO: using PCA to compress the dimensionality of the test_data after subtracting the mean vector - test_data_pca = ??? + test_data_pca = (test_data - data_mean) @ u visualize(test_data_pca, test_label, "test") savedata(test_data_pca, test_label, data_root+"/test.pt") @@ -95,14 +97,15 @@ def PCA(data, dim=2): # TODO 2: complete the algorithm of PCA, calculate the mean value of the data and the projection matrix # TODO: compute the mean of train_data - data_mean = ??? + data_mean = data.mean(dim=0) # TODO: compute the covariance matrix of train_data - data_cov = ??? + diff = data - data_mean + data_cov = diff.T @ diff # TODO: compute the SVD decompositon of data_cov using torch.linalg.svd # reference: https://pytorch.org/docs/1.11/generated/torch.linalg.svd.html - ??? + u, s, v = torch.linalg.svd(data_cov) # TODO: return the proper 'data_mean' and 'u[]' - return ??? + return data_mean, u[:, :dim] def loaddata(pre_conv, data_root, mode, image_size, classes): diff --git a/hw3/code/svm_hw.py b/hw3/code/svm_hw.py index 54dbce3..abfb47a 100644 --- a/hw3/code/svm_hw.py +++ b/hw3/code/svm_hw.py @@ -2,8 +2,8 @@ # Media and Cognition # Homework 3 Support Vector Machine # svm_hw.py - The implementation of SVM using hinge loss -# Student ID: -# Name: +# Student ID: 2022010639 +# Name: Yixuan Gao # Tsinghua University # (C) Copyright 2024 # ======================================================== @@ -34,7 +34,7 @@ class LinearFunction(torch.autograd.Function): ''' # TODO - y = ??? + y = torch.matmul(x, W.T) + b ctx.save_for_backward(x, W) return y @@ -59,9 +59,9 @@ class LinearFunction(torch.autograd.Function): # you can use torch.matmul(A, B) to compute matrix product of A and B # TODO - grad_input = ??? - grad_W = ??? - grad_b = ??? + grad_input = torch.matmul(grad_output, W) + grad_W = torch.matmul(grad_output.T, x) + grad_b = grad_output.sum(0) return grad_input, grad_W, grad_b @@ -85,7 +85,11 @@ class Hinge(torch.autograd.Function): # TODO: compute the hinge loss (together with L2 norm for SVM): loss = 0.5*||w||^2 + C*\sum_i{max(0, 1 - y_i*output_i)} # you may need F.relu() to implement the max() function. - loss = ??? + # print("product", label * output.reshape_as(label)) + # print("minus", 1 - label * output.reshape_as(label)) + # print("relu", F.relu(1 - label * output.reshape_as(label))) + # print("sum", (F.relu(1 - label * output.reshape_as(label))).sum()) + loss = 1/2 * (W @ W.T) + C * (F.relu(1 - label * output.reshape_as(label))).sum() ctx.save_for_backward(output, W, label, C) return loss @@ -102,8 +106,11 @@ class Hinge(torch.autograd.Function): """ output, W, label, C = ctx.saved_tensors # TODO: compute the grad with respect to the output of the linear function and W: dL/doutput, dL/dW - grad_output = ??? - grad_W = ??? + # print("output", output, "label", label, "product", (1 - label.reshape_as(output) * output)) + # print("grad_loss size", grad_loss.size()) + # print("sizeof l / output", (C * torch.heaviside(1 - label.reshape_as(output) * output, torch.tensor(0).type_as(output)) * (-label.reshape_as(output))).size()) + grad_output = grad_loss * C * (torch.heaviside(1 - label.reshape_as(output) * output, torch.tensor(1).type_as(output)) * (-label.reshape_as(output))) + grad_W = grad_loss * W return grad_output, grad_W, None, None @@ -124,8 +131,8 @@ class SVM_HINGE(nn.Module): please use torch.randn() to initialize W and b """ - self.W = ??? - self.b = ??? + self.W = nn.Parameter(torch.rand(1, in_channels), requires_grad=True) + self.b = nn.Parameter(torch.rand(1, ), requires_grad=True) self.C = torch.tensor([[C]], requires_grad=False) def forward(self, x, label=None): diff --git a/hw3/code/test_svm.py b/hw3/code/test_svm.py index 0a2a917..4aa1ceb 100644 --- a/hw3/code/test_svm.py +++ b/hw3/code/test_svm.py @@ -2,8 +2,8 @@ # Media and Cognition # Homework 3 Support Vector Machine # test_svm.py - Test svm model for traffic sign -# Student ID: -# Name: +# Student ID: 2022010639 +# Name: Yixuan Gao # Tsinghua University # (C) Copyright 2024 # ======================================================== @@ -14,6 +14,7 @@ import torch from datasets import Traffic_Dataset from svm_hw import SVM_HINGE from torch.utils.data import DataLoader +import os.path # ==== Part 2: testing @@ -33,25 +34,25 @@ def test( # TODO 1: =================== load the pretrained SVM model ================================== # TODO: construct testing data loader with 'Traffic_Dataset' and DataLoader, and set 'batch_size=1' and 'shuffle=False' - test_data = ??? - test_loader = ??? + test_data = Traffic_Dataset(os.path.join(data_root, 'test.pt')) + test_loader = DataLoader(test_data, shuffle=False) # TODO: load state dictionary of pretrained SVM model - model_svm = ??? + model_svm = torch.load(os.path.join(model_save_path)) # TODO: initialize the SVM model using 'model_svm["configs"]["feature_channel"]' and 'model_svm["configs"]["C"]' - svm = ??? + svm = SVM_HINGE(model_svm["configs"]["feature_channel"], model_svm["configs"]["C"]) # TODO: load model parameters (model_svm['state_dict']) we saved in model_path using svm.load_state_dict() - ??? + svm.load_state_dict(model_svm["model_state"]) # TODO: put the model on CPU or GPU - ??? + svm.to(device) # TODO 2 : ================================ testing ============================================== # TODO: set the model in evaluation mode - ??? + svm.eval() # to calculate and save the testing accuracy n_correct = 0. # number of images that are correctly classified @@ -59,19 +60,22 @@ def test( with torch.no_grad(): # we do not need to compute gradients during validation # TODO: inference on the testing dataset, similar to the training stage but use 'test_loader'. - for ??? in ???: + for input, label in test_loader: # TODO: set data type (.float()) and device (.to()) - ??? + input, label = ( + input.type(torch.float).to(device), + label.type(torch.float).to(device) + ) # TODO: run the model; at the validation step, the model only needs one input: feas # _ refers to a placeholder, which means we do not need the second returned value during validating - ??? + out, _ = svm(input) # TODO: sum up the number of images correctly recognized. note the shapes of 'out' and 'labels' are different - n_correct += ??? + n_correct += (out.reshape_as(label) == label).sum().item() # TODO:sum up the total image number - n_feas += ??? + n_feas += label.numel() # show prediction accuracy acc = 100 * n_correct / n_feas diff --git a/hw3/code/train_svm.py b/hw3/code/train_svm.py index 091a1e5..9dca8a7 100644 --- a/hw3/code/train_svm.py +++ b/hw3/code/train_svm.py @@ -2,8 +2,8 @@ # Media and Cognition # Homework 3 Support Vector Machine # train_svm.py - Train svm model for traffic sign -# Student ID: -# Name: +# Student ID: 2022010639 +# Name: Yixuan Gao # Tsinghua University # (C) Copyright 2024 # ======================================================== @@ -17,6 +17,7 @@ import random from datasets import Traffic_Dataset from svm_hw import SVM_HINGE from torch.utils.data import DataLoader +import os.path # ==== Part 2: training and validation @@ -44,22 +45,22 @@ def train( """ # TODO 1: construct training and validation data loader with 'Traffic_Dataset' and DataLoader, and set proper values for 'batch_size' and 'shuffle' - train_data = ??? - train_loader = ??? - val_data = ??? - val_loader = ??? + train_data = Traffic_Dataset(os.path.join(data_root, 'train.pt')) + train_loader = DataLoader(train_data, batch_size=batch_size, shuffle=True) + val_data = Traffic_Dataset(os.path.join(data_root, 'val.pt')) + val_loader = DataLoader(val_data, batch_size=batch_size, shuffle=True) # scale the regularization coefficient C = C * len(train_loader) # TODO: initialize the SVM model - svm = ??? + svm = SVM_HINGE(feature_channel, C) # TODO: put the model on CPU or GPU - ??? + svm.to(device) # TODO: define the Adam optimizer - optimizer = ??? + optimizer = torch.optim.Adam(svm.parameters(), lr) # to save the training loss, training accuracy, validation accuracy, and the epoch index of each training epoch train_loss = [] @@ -69,11 +70,11 @@ def train( for epoch in range(n_epoch): # TODO: save the index of current epoch in the array 'epochs' - ??? + epochs.append(epoch + 1) # TODO 2: ========================= training ======================= - # TODO: set the model in training mode - ??? + # TODO: set the model in training mode› + svm.train() # to calculate and save the training loss and training accuracy total_loss = 0. # to save total training loss in one epoch @@ -82,42 +83,45 @@ def train( # TODO: get a batch of data; you may need enumerate() to iteratively get data from 'train_loader'. # you can refer to previous homework, for example hw2 - for ??? in ???: + for step, (input, label) in enumerate(train_loader): # TODO: set data type (.float()) and device (.to()) - ??? + input, label = ( + input.type(torch.float).to(device), + label.type(torch.float).to(device) + ) # TODO: clear gradients in the optimizer - ??? + optimizer.zero_grad() # TODO: run the model with hinge loss; the model needs two inputs: feas and labels - ??? + out, loss = svm(input, label) # TODO: back-propagation on the computation graph - ??? + loss.backward() # TODO: sum up of total loss, loss.item() return the value of the tensor as a standard python number - total_loss += ??? + total_loss += loss.item() # TODO: call a function to update the parameters of the models - ??? + optimizer.step() # TODO: sum up the number of images correctly recognized. note the shapes of 'out' and 'labels' are different - n_correct += ??? + n_correct += (out.reshape_as(label) == label).sum().item() # TODO: sum up the total image number - n_feas += ??? + n_feas += label.numel() # average of the total loss for iterations acc = 100 * n_correct / n_feas avg_loss = total_loss / len(train_loader) - train_acc.append(acc.cpu().numpy()) + train_acc.append(acc) train_loss.append(avg_loss) print('Epoch {:02d}: loss = {:.3f}, training accuracy = {:.1f}%'.format(epoch + 1, avg_loss, acc)) # TODO 3: ========================== Validation ====================================== # TODO: set the model in evaluation mode - ??? + svm.eval() # to calculate and save the validation accuracy n_correct = 0. # number of images that are correctly classified @@ -125,24 +129,27 @@ def train( with torch.no_grad(): # we do not need to compute gradients during validation # TODO: inference on the validation dataset, similar to the training stage but use 'val_loader'. - for ??? in ???: + for input, label in val_loader: # TODO: set data type (.float()) and device (.to()) - ??? + input, label = ( + input.type(torch.float).to(device), + label.type(torch.float).to(device) + ) # TODO: run the model; at the validation step, the model only needs one input: feas # _ refers to a placeholder, which means we do not need the second returned value during validating - ??? + out, _ = svm(input) # TODO: sum up the number of images correctly recognized. note the shapes of 'out' and 'labels' are different - n_correct += ??? + n_correct += (out.reshape_as(label) == label).sum().item() # TODO: sum up the total image number - n_feas += ??? + n_feas += label.numel() # show prediction accuracy acc = 100 * n_correct / n_feas print('Epoch {:02d}: validation accuracy = {:.1f}%'.format(epoch + 1, acc)) - val_acc.append(acc.cpu().numpy()) + val_acc.append(acc) # save model parameters in a file torch.save({'state_dict': svm.state_dict(), @@ -157,7 +164,7 @@ def train( # TODO 4: calculate the index of support vectors in training samples using 'train_data.datas' and 'train_data.labels' # 'sv' should be a list in python structure with the shape of [K], where K is the number of support vectors. - sv = ??? + sv = [idx for idx, (data, label) in enumerate(zip(train_data.datas, train_data.labels)) if label * ((W @ data) + b) <= 1] plot(train_loss, train_acc, val_acc, epochs) plot_feature(train_features=train_data.datas, val_features=val_data.datas, train_labels=train_data.labels, diff --git a/hw3/report/img/check/check.png b/hw3/report/img/check/check.png new file mode 100644 index 0000000000000000000000000000000000000000..2907b96c71173143e1811fc364479917604853cb GIT binary patch literal 19287 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 C!uzfO literal 0 HcmV?d00001 diff --git a/hw3/report/img/preprocess/preprocess_train.png b/hw3/report/img/preprocess/preprocess_train.png new file mode 100644 index 0000000000000000000000000000000000000000..99590adc635b7b50e7575f0d72b34528c3ce6188 GIT binary patch literal 18415 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 literal 0 HcmV?d00001 diff --git a/hw3/report/img/preprocess/preprocess_val.png b/hw3/report/img/preprocess/preprocess_val.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a6dc8e768b48782499b7fbec5224a51dd8e371 GIT binary patch literal 16952 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 T1@+D0p%6J4W$D~&ruY9F!9