31 de agosto de 2020

Ubuntu nativo en windows 10

Hola, 

durante años he utilizado MobaXterm como herramienta para poder conectarme a servidores Linux por SSH y SFTP desde mi portátil con Windows 10. Esta herramienta te ofrece un terminal Linux, con casi todas las características que esperas, dentro de un sistema Windows. Además, te permite instalar componentes de Linux que van más allá del terminal BASH. Por ejemplo, te permite instalar paquetes de python o perl de manera sencilla. 

Pego aquí una imagen de mi MobaXterm en la carpeta /mnt/c, que corresponde al disco C:\


Pero de lo que  quería hablar hoy en realidad es de que Windows 10 ya soporta Ubuntu de manera nativa y de esa manera podemos tener un sistema Linux completo, no solamente un terminal, sin salir de nuestra sesión Windows. Para instalar debes seguir estos pasos:

1) Asegúrate de que tienes una versión de Windows10 con la versión 1709 o superior, como se explica en https://www.protocols.io/view/ubuntu-on-windows-for-computational-biology-sfuebnw 

2) En la tienda de Microsoft (Microsoft Store) busca e instala el software "Ubuntu". Hay otras opciones, yo elegí Ubuntu a secas.

3) Busca en el sistema la aplicación "Activar o desactivar las características de Windows" (en inglés Turn Windows Features on or off) y selecciona el subsistema de Windows para Linux.

4) Reinicia y arranca la aplicación Ubuntu. Tras unos minutos de instalación deberás elegir tu usuario y seña para Linux. Después deberás ver algo como:

Puedes ver que las particiones de mi sistema Windows (C y Q) se montan de manera automática en /mnt, como en MobaXterm, y que mi home de Linux está en una partición diferente: /home.

Ahora ya puedes hacer algo tan importante, por ejemplo, como instalar un compilador: sudo apt-get install gcc

Hasta pronto,

Bruno

24 de junio de 2020

Conferencia en la nube

Hola,
los próximos 3 días puedes seguir las charlas en torno a los lenguajes Perl y Raku (perl6) en https://tpc20cic.sched.com. Puedes verlas en directo, con la diferencia horaria de EEUU, en https://www.youtube.com/yapcna , o más tarde cuando te venga bien, puesto que serán grabadas, como las de otros años,
hasta luego,
Bruno

6 de junio de 2020

Entrenando una red neuronal keras en linux

Hola,
tras la última entrada creo que ha llegado el momento de comenzar a programar redes neuronales profundas con la ayuda del libro Deep Learning Illustrated. En este caso el autor ha programado sus ejemplos en python, uno de los lenguajes más utilizados en este campo, y por tanto deberás crearte un ecosistema adecuado con todas las herramientas y dependencias necesarias, en este caso tensorflow y su interfaz keras. En un sistema CentOS Linux lo hice de la siguiente manera, con pyenv:
sudo curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

# agrego pyenv a .bashrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

# instalo python 3.6 y actualizo pip
pyenv install 3.6.0
pyenv local 3.6.0
pip install --upgrade pip
pip install jupyter
# creo un ecosistema/virtualenv al que llamo DL
pyenv virtualenv 3.6.0 DL
pyenv shell DL
# instalo las dependencias del libro de Jon Krohn
# en mi caso tuve que poner TMPDIR=/particion_grande/ antes de pip
# porque se llenaba la particion /tmp
pip install tensorflow
pip install keras

# otra librería de aprendizaje prodfundo alternativa a keras & tensorflow
pip install mxnet

Y ya está, ahora cuando quiero usar este ecosistema  solamente tengo que hacer:
$ pyenv shell DL
Todos los ejemplos de libro están disponibles en https://github.com/the-deep-learners/deep-learning-illustrated, en forma de cuadernos jupyter que puedes explorar directamente desde GitHub o en tu navegador. Si quieres probarlos directamente en el terminal deberás convertirlos a scripts .py y luego ejecutarlos:
jupyter nbconvert --to script deep-learning-illustrated/notebooks/regression_in_keras.ipynb
python deep-learning-illustrated/notebooks/regression_in_keras.py
En este caso obtendremos la siguiente salida, que resume la arquitectura de la red especificada en regression_in_keras.ipynb y su entrenamiento a lo largo de 32 épocas:

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
dense_1 (Dense)              (None, 32)                448
_________________________________________________________________
batch_normalization_1 (Batch (None, 32)                128
_________________________________________________________________
dense_2 (Dense)              (None, 16)                528
_________________________________________________________________
batch_normalization_2 (Batch (None, 16)                64
_________________________________________________________________
dropout_1 (Dropout)          (None, 16)                0
_________________________________________________________________
dense_3 (Dense)              (None, 1)                 17
=================================================================
Total params: 1,185
Trainable params: 1,089
Non-trainable params: 96

Train on 404 samples, validate on 102 samples
Epoch 1/32

  8/404 [..............................] - ETA: 30s - loss: 865.3292
 80/404 [====>.........................] - ETA: 2s - loss: 720.8563
152/404 [==========>...................] - ETA: 1s - loss: 644.4068
232/404 [================>.............] - ETA: 0s - loss: 602.0502
304/404 [=====================>........] - ETA: 0s - loss: 578.7887
376/404 [==========================>...] - ETA: 0s - loss: 588.8638
404/404 [==============================] - 1s 2ms/step - loss: 583.1135 - val_loss: 786.3666
....

  8/404 [..............................] - ETA: 0s - loss: 18.8216
 88/404 [=====>........................] - ETA: 0s - loss: 34.8777
168/404 [===========>..................] - ETA: 0s - loss: 37.6842
248/404 [=================>............] - ETA: 0s - loss: 48.3836
328/404 [=======================>......] - ETA: 0s - loss: 45.0179
404/404 [==============================] - 0s 761us/step - loss: 43.5160 - val_loss: 133.9931

Hasta pronto,
Bruno

30 de mayo de 2020

Sobreentrenamiento de una red neuronal

Hola,
en la última entrada repasé como aprende una red neuronal y cómo se calcula el coste en un conjunto de entrenamiento. Hoy me detengo en el problema del sobreentrenamiento (overfitting en la literatura), para lo cual necesitamos un conjunto de datos independiente, que llamamos conjunto de validación.

Primero definiré el sobreentrenamiento con las palabras de J Krohn: "es la situación en la que el coste de entrenamiento desciende a la vez que aumenta en el conjunto de validación". El objetivo del entrenamiento debe ser obtener un modelo general, y el sobreentrenamiento es por tanto un obstáculo, porque al sobreentrenar lo que ocurre es que el modelo se particulariza para tu conjunto de entrenamiento.

Figura 9.5 de Krohn J (2019) Deep Learning Illustrated

En la figura se ilustran 4 modelos ajustados a los mismos datos. Arriba a la izquierda un modelo como un solo parámetro, con un ajuste muy pobre. A su derecha un modelo parabólico con con dos parámetros se ajusta bastante bien. Abajo se muestran un modelo multiparamétrico que sobreajustan los datos y que no generaliza bien cuando se agregan nuevos datos (abajo derecho). El sobreentrenamiento es un problema de sobreajuste.

En su libro, J Krohn presenta ideas para limitar el sobreentrenamiento. En primer lugar, habla del número de épocas que debemos entrenar una red:
  • Si el coste de entrenamiento en un conjunto de datos de validación alcanza el mínimo en la última época es buena idea agregar más épocas al entrenamiento.
  • Si el coste empieza a aumentar a partir de una época de entrenamiento, es normalmente un indicio de sobreentrenamiento
En segundo lugar, describe la técnica de eliminación neuronas (dropout) al azar en capas ocultas durante el proceso de entrenamiento:

Figura 9.6 de Krohn J (2019) Deep Learning Illustrated

El próximo día programaremos las primeras redes,
Bruno