1. Empecemos con una red profunda convencional. Coge el fichero que utilizaste la primera vez que vimos este problema y ponle unas cuantas capas ocultas. Pruébalo. Entre las pruebas que hagas asegúrate de probar la combinación de función final Softmax con error CrossEntropy
  2. Sobre esa red prueba:
  3. Probemos una red convolutiva

    Para empezar, aquí tienes un fichero base para empezar a trastear Las líneas en las que están cosas a tocar se han marcado con una hilera comentario final: ################

    Aparte de todo lo que se te ocurra (en la línea 84 si punes numpasos un poco alto tardará menos, pero el ajuste será peor), haz los siguientes experimentos:

  4. Otros enfoques para poder poner redes grandes y que no se dispare el número de pesos:
    Matrices de pesos simplificadas
    Prueba a poner que las capas tengan matrices de pesos parametrizadas, por ejemplo, mediante una simplificación a ortogonales (enlace a documentación) Lo haces sustituyendo las Conv2d(...) por nn.utils.parametrizations.orthogonal(nn.Conv2d(...)) Esto hace que el tamaño de una matriz m × n pase a m( n+1 ) 2 (podemos pensar en aproximadamente la mitad)

    Prepara y ajusta. en principio a las de más impacto (más pesos) y vete ampliando hasta que veas que la precisión cae significativamente. Donde te quedes, anota otra línea en la tabla de comparación.

    Aplicación de filtros separables
    Sustituye las convoluciones normales por separables. El cambio es del estilo de:
    Original Con filtro separable
    nn.Conv2d(4, 2, kernel_size=(5, 5), padding=2) nn.Conv2d(4, 4, kernel_size=(5, 1), padding=(2, 0)),
    nn.Conv2d(4, 2, kernel_size=(1, 5), padding=(0, 2))

    Fíjate que en ese ejemplo, hemos pasado de 25 pesos a 10 (aunque como hay 4,4 en la primera capa, el ahorro no es así de directo)

    Prepara, ajusta primero las capas de más pesos, hasta que veas que la precisión se degrada. Hasta donde llegues, anota otra línea