brochero / TFM_DanSer

0 stars 1 forks source link

Keras #6

Open brochero opened 1 year ago

brochero commented 1 year ago

Keras

El tutorial que tienes que seguir es el:

https://root.cern.ch/doc/master/ClassificationKeras_8py.html

La estructura es similar. Simplemente cambia como adicionas las branches que quieres entrenar con el:

for branch in signal.GetListOfBranches():
    dataloader.AddVariable(branch.GetName())

Para correr KERAS sin problema en gridui tienes que:

  1. loggearte en login1 o login2
  2. inicia session en un nodo de grid con:
    srun --time=1:00:00 --ntasks 2 --nodes=1 --partition=cloudcms --mem-per-cpu=5G --pty /bin/sh -l

    Si se queja, sube a --mem-per-cpu=10G

  3. Luego carga el framework de CMS:
    source /cvmfs/cms.cern.ch/cmsset_default.sh
  4. Crea un CMS framework con:
    cmsrel CMSSW_11_0_0
  5. Entra al directorio CMSSW_11_0_0/src
  6. Carga el environment
    cmsenv
  7. Ya debe funcionar el ClassificationKeras.py (despues de borrar el tensorflow del import)
    python ClassificationKeras.py

    Nota Lo de borrar el tensorflow es cambiar (en todos los import):

    from tensorflow.keras.models import Sequential

    por

    from keras.models import Sequential
brochero commented 1 year ago

Con respecto a tu error.... a mi me va bien. Podrias intentarlo de nuevo conectandote via login2. Si sigue fallando, seguramente es un problema de acceso (para el grid noi estas como CMS). Podrias abrir un ticket con el fallo. Para ello:

  1. Ve a la pagina de tickets del GRID:

https://support.ifca.es/rt/

  1. parte superior derecha: new ticket con CMS
  2. escribe el comando de srun que usas y el correspondiente error.
  3. indica que es posible que se deba a problemas de accesso al cloudcms.

En mi caso funciona sin problema:

[login1]:users/brochero$ 
srun --time=1:00:00 --ntasks 2 --nodes=1 --partition=cloudcms --mem-per-cpu=5G --pty /bin/sh -l
srun: job 1314680 queued and waiting for resources
srun: job 1314680 has been allocated resources
                                          _     _  ___   ___  _ 
               __      ___ __   __ _ _ __(_) __| |/ _ \ ( _ )/ |
               \ \ /\ / / '_ \ / _` | '__| |/ _` | | | |/ _ \| |
                \ V  V /| | | | (_| | |  | | (_| | |_| | (_) | |
                 \_/\_/ |_| |_|\__, |_|  |_|\__,_|\___/ \___/|_|
                               |___/                            

[wngrid081]:users/brochero$ 
DaniloSerna commented 1 year ago

Permisos solucionados! ya logra crear el job

image

Se crean dos archivos en la ruta:

Se usa la misma arquitectura que en el caso con TMVA

image

brochero commented 1 year ago

Si, intenta:

root

   ------------------------------------------------------------------
  | Welcome to ROOT 6.26/10                        https://root.cern |
  | (c) 1995-2021, The ROOT Team; conception: R. Brun, F. Rademakers |
  | Built for linuxx8664gcc on Nov 16 2022, 10:42:54                 |
  | From tags/v6-26-10@v6-26-10                                      |
  | With c++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0                   |
  | Try '.help', '.demo', '.license', '.credits', '.quit'/'.q'       |
   ------------------------------------------------------------------

[0] TMVA::TMVAGui("TMVA_Keras.root")
brochero commented 1 year ago

In order to convert the weights file from Keras to our standard TMVA structure:

From Conrado:


Lo he estado mirando. El problema es como le da las variables al training en la penúltima línea. Los X_train_val son los valores de las variables (mezclando señal y fondo), y los Y_train_val sería 1 si las variables son señal y 0 si son fondo. Pero nostros no tenemos así los datos organizados. Nosotros cargamos en un dataloader las branches para el tree de señal y las branches para el tree de fondo.

No sé como pasar de dataloader a esos numpy.arrays. Había pensado crearlos desde un inicio cuando hacemos los tress con señal y fondo, pero el numpy es de python y eso lo hacemos en c++. No sé si se pueden guardar matrices con root.

PD: usando la estructura de la red propuesta, y simplemente cambiando el training (la penúltima línea) por la forma con la que se entrena la red en el tutorial, el output vuelve a ser siempre 1. Además, siguiendo la forma de entrenar del tutorial, la última capa debe ser de dimensión 2, al tener señal y background como posibles respuestas. Digamos que la forma que propone Sergio devolvería un valor entre 0 y 1 indicando si es señal o fondo, y la forma del tutorial devolvería la probabilidad de que el evento señal y la de que sea fondo (en este caso son complementarias al haber solo dos categorías en la clasificación).


Novedades con el Keras. SOLUCIONADO. Ya puedo obtener las respuestas de la red entrenada, y son siempre diferentes de 1. El problema era con el archivo para el fondo de W. Como tengo dos redes, tenía dos funciones guess_digit, y entonces pensé en llamar a una guess_digit_Top y a la otra guess_digit_W. La del Top siempre fue bien, pero la del W, debe de haber algún problema con ese nombre en concreto, que no me devolvia más que 1 siempre, incluso poniendo en el archivo, en la parte del if (flag==0) return buffer_in[0]; poniendo if (flag==0) return 0.5; para comprobar si hacía lo que le pedía (aún así devolvía 1).

Ahora simplemente he llamado a la del Top igual que antes, pero la del W le he quitado el _W del nombre, y funciona. He obtenido una eficiencia para el Keras para todas las categorias juntas del 0.601556. Estoy corriendo ahora por categorías. Luego discutimos resultados.

Dale las gracias a Sergio de mi parte.

brochero commented 1 year ago

Any luck with this?

DaniloSerna commented 1 year ago

Now I can run the BDTValidation, but do you have an example of how the output should look like? Because I am running the following command:

./BDTNanoValidation.exe -i FNano2017-v7_TTToSemiLeptonic_TuneCP5_13TeV-powheg-pythia8.files -o TestVal_1 -B DT ../TMVAClassification_BDT.weights.xml

and I am getting the following root file for both TMVA and Keras weights:

image