You are on page 1of 7
+ Modelo para clasificar digitos manuscritos. Objetivo: Desarrollar un clasificador de digitos manuscritos a través del modelo lineal de regresién logistica entrenado el conjuntos de datos MNIST. Debe realizar lo siguiente: 1. Bajar los datos 2 Disefiar el madelo (regresién logistica) 3. Implemente la funcién de costo 4. Use el optimizador SCD 5. Use Dataloader (Opeional) 6. Graficar el loss vs accuracy + Datos MNIST Se utllzaré los datos del clisico muzst dataset, que consiste en imagenes blanco y negro de digitos manuscritos entre 0 y 9. fron pathlib import Path Amport requests DATA.PATH = Path(vdata”) PATH = OATA PATH / “nnist PaTi.nkdie(parentenTrue, exist. rue) URL = "hetps://github.con/pytorch/tutorials/rau/master/_static/” nist. pkl.g2” Af not (PATH / FILENAME) exists()2 content = requests. get URL + FILENAME) content (PATH / FILENAME) .opent"wb) serite(content) import pickle Seport grip vith gzip.open((PATH / FILENAME) 08_posix(), *rb") as #: ((xctrain, ytrain), (valid, y.valia), _) = plckle.load(f, encoding="Latio Cada imagen es de 28x28 y esta almacenada como una fila de longitud 784(=28x28). Vamos a dibujar la primera fila: fron natplotlib inport pyplot Snport unpy as 9p pyplot. inshow(x_train[@}.reshape((28, 28)), caap="eray") print (x train.shape) (s000e, 788) as Como sabemos torch usa tensor y no numpy.array por lo que hay que convertir los. datos. xtrain, y_train, xyalid, y_valsd = nap( torch.tensor, (train, y_train, x valid, y_valid) ) fy € = x train. shape print train, y_train) paintOxctrain shape) print(y_train.nin(), ytrain.nax()) Tensor(L LB. By By sie Bey Bey Be)y [er Oy cis Oe By B.)e [ey e,e, Le, ey 8), [85 0, By cer By By B)y Tere, 8, le, e, 8), ee, 0. 8; 8, 8.)}) tensor((S, @, 4 cove Bs 4s 8)) torch. size(seeeo, 756] " ‘eensor(@) tensor(3) + Modelo Crear el modelo a partir de torch.nn. Module como se aprendi en clase. Inicialice los pesos (weights) y el bias (Intercepién) aleatoriamente Con el método forward()impimente la formula de la regresién. n_sanples, n_features = x train. shape print(n_sanples, n_festures) so00e 784 y.train = y_train.view(y_train.shape[@],2) Yivalid = y_valid.view(y_valid.shape[@],2) y.srain.size() ‘torch. size({5ee08, 1]) snport nunpy as actrein = torch. sLyalid = toreh yltrain = toreh Yivalid = toreh wrein.t0) eensor(U 1 wvalid.t0) eensor(U1, ysraint0) ‘eensor({1, yivatia.t0) eensor({1, » -tensor((), dtypertorch.Floats4) -tensor((), dtypertorch.Float6) -tensor((), dtypestorch.Floaté4) ‘eensor((), atypentorch.float6s) Atypestorch.floates) Atypestorch.#loates) dtypestorch.floatea) Atypestorch.floatea) lass Lt_Nodel(torch.nn.Module): tnodelo de regresisn logistics Geof _init_(self, n features): supar(LA fodel, se1f)._init_() self-layert = torch.nnsLinear(n_features, 22) self layer? = torch.nn, Linear(28,1) def Fornard(self, x): testo va calculande de uno capa a otra, es decin para hacer el caleulo de nuestra predicctén, de nuestro mod yihat = self.layer3(x) aya aqui envianos los dates hat =torch.sigrotd(self.layera(y hat) # se utiliza el signoide return y_hat ef plot_loss(epochs, loss, loss_test, acc): xin = Len(I0ss) ‘epochs = np-Linspace(1,xlin,x2in).astype(int) plt.plot(epochs, loss) #linea que grafica plt.plot(epochs, loss_test) #linea que grafica plt-plot(epachs,ace) #1inea que grafic pt xlabel(“Epochs*) plt-ylabel(*value") plt-Legend((‘Train loss’, “Test loss", ‘Accuracy'),loce"center right", shadowsTeve) plt.title("Train and Test Loss vs Accuracy’) def train(nam epochs, optinizer, criterion, model): toss_vals = (] oss_test_vals = () ace_vals = {] ‘epoch_vals = () for epoch in range(nus_epocs): Yy.nat = model(x train) fel y_hat ya viene en ténminos de unos y ceros oss = criterion(y_hat,y_train) #calculo el loss 3oss.backward() #propago el loss optinizer.step() optintzer.zero_grad() AF (epochei)25 == 8: #eapturanos de 5 en 5 20s epoch with torch. ne_gradc) 10ss_vals.append(loss.iten()) Yy.nat_test = model(x valid) #evaluanos el nodelo Joss test = criterion(y_hat_test, y_valid) 3oss_test_vals.append(loss_test.iter()) y.hat_elass = y_hat_test.round() accuracy = (y_hat_class.eq(y_val{d).sun())/Float(y_hat_test. shape(®)) ace_vals.append(accuracy.iten()) epoch_vals.append(epoch) print(#epoch:{epoch+t} loss=(loss.iten()} loss_test= plot loss (epocn_vals,loss_vals, lose_tert_vals,ace_ vale) loss_test.tten()} accuracy=(accuracy.4ten()}") An_model = LR Model(n_features) conto = torch.nn,eceLoss() optin = torch.optin.SGD(1r_nodel.parancters(),r=8.01) ‘rain(nun_epochs-200, optinizersoptin, criterionscosto, rodel: ode) Runtinetrror Traceback (nost recent cai last) ‘cipython-ingut-47-24f042e73072> in cmodule>() 2 costo = torch.nn.BCELoss() F_node) 2 are: $$ usr Local/14b/qython3, 7/dS Tensor: o> 183 return F-lingar(input, self.weight, self.blas) 104 105 def extra_repr(seif) -> str: funtimeError: mati and mat2 shapes cannot be multiplied (1x8 and 786x22) © 05 completado alas 73:48

You might also like