#!/usr/bin/python3 # -*- coding: utf-8 -*- """ Perceptrón para reconocer imágenes de cifras. """ import httpimport with httpimport.remote_repo('https://personales.unican.es/crespoj/redes/redespytorch.zip'): import lecturaurl import lectura import particion import tipored import ajuste import registro import torch import numpy import error import random from torch import nn import activaciones GPU= torch.cuda.is_available() datos,datpru=lecturaurl.leemat('mnist_uint8.mat','train_x','train_y','test_x','test_y') numvarent=len(datos[0])-10 numuestras=len(datos) #Son 784 píxels: no podemos analizar cada variable pixel por separado, pero podemos usar su distribucion frel,vals=lectura.grafica(list(range(numvarent)),datos,False) #Podemos analizar el conjunto de píxels. Comenta este bloque cuando ya lo hayas hecho pixels=datos[:,:-10][:].reshape((-1,1)) lectura.estadistica(['pixels'],pixels) lectura.mapa(datos[:,:-10],[numpy.mean,numpy.std]) # un par de variables mapeadas #los pixels son homógeneos entre sí: no los vamos a preprocesar """ Cosas que tienes que definir y probar: Ratio ajuste/validación Número de procesadores ocultos Parámetros del método de ajuste Criterio de parada por validación """ #Son demasiadas variables para hacer estratificación tea,tsa,tev,tsv=particion.ajazar(datos,numuestras,0.5) # ¿No será poco un 50% para ajuste? tep,tsp=lectura.numpytorch(datpru,10) red=tipored.lineal(numvarent,10) #red=tipored.lineallineal(numvarent,10) # la regresión lineal normal #red.perceptron(numvarent,[5],10,nn.Tanh,nn.Sigmoid) # ¿5 ocultos serán suficientes? notorchs=['lineallineal'] if GPU and modelo not in notorchs: tea=tea.cuda() tsa=tsa.cuda() tev=tev.cuda() tsv=tsv.cuda() tep=tep.cuda() tsp=tsp.cuda() red=red.cuda() if modelo not in notorchs: red(tep) print(red) # velocidad iteraciones muestras_para_actualizar_gradiente _,red,_=ajuste.ajustar(red,tea,tsa,tev,tsv,tep,tsp,regiter=registro.clasiter,regfin=registro.clasprueba,kaj=0.1,numiter=200,minibatch=20) #Como los resultados son clases discretas, no entramos a los residuos numéricos. Se supone que la matriz de confusión ya nos informa if modelo not in notorchs: red.eval() #Vemos un caso concreto. Si no te interesa, comenta el siguiente bloque print('\nEjemplo') quien=random.randrange(len(tsp)) caso=tep[quien].cpu() registro.imagen(caso.detach(),'Ejemplo',True) dice=red(tep[quien:quien+1]) print('Red dice',error.clases(dice)) #Las explicaciones se basan en remuestrear. En un espacio de tan alta dimensión lleva mucho tiempo