clc; clear; data_length = 3072; num_classes = 10; svm_buffer = 1; step_size = 0.001; %Might want to make these random values smaller W = rand(num_classes, data_length); %Load CIFAR-10 data load('data_batch_1.mat'); num_imgs = length(data); loss_log = zeros(1,num_) for i = 1:num_imgs %Calculate score of image i img = im2double(data(i,:)); score_i = W*img'; %Get the label of image i y = double(labels(i)); tmp = score_i' - score_i(y+1) + svm_buffer; maxed = max(0,tmp); loss = sum(tmp)-svm_buffer; %Subtract loss contributed by the correct image %Compute gradient bin_mask = find(maxed); bin_array = zeros(1,num_classes); bin_array(bin_mask) = 1; bin_array(y+1) = 0; gradient = bin_array' * img; W = W - step_size * gradient; end