Solucionar problemas instalando nilmtk-contrib


Nilmtk-contrib es un repositorio de contribuciones de la comunidad para NILMTK que permite agregar nuevas funcionalidades, modelos de aprendizaje automático y algoritmos de desagregación de energía. Dado que el desarrollo del NILMTK principal ha sido más lento en los últimos años, nilmtk-contrib permite a los investigadores y desarrolladores mejorar la herramienta sin depender de actualizaciones en el repositorio principal.

Características de nilmtk-contrib

  1. Nuevos Algoritmos de Desagregación
    • Contiene implementaciones de modelos avanzados basados en redes neuronales, como Sequence-to-Sequence y Variational Autoencoders.
    • Se han añadido métodos híbridos que combinan enfoques basados en descomposición de señales y aprendizaje profundo.
  2. Soporte para Nuevos Datasets
    • Extiende la compatibilidad con bases de datos de consumo eléctrico no incluidas en NILMTK.
    • Simplifica la conversión de datos desde formatos comunes como CSV a HDF5, que es el formato utilizado por NILMTK.
  3. Mayor Flexibilidad y Mantenibilidad
    • Permite a los desarrolladores probar nuevas ideas sin modificar el código base del NILMTK original.
    • Se puede instalar y utilizar junto con NILMTK sin conflictos.

Para instalar nilmtk-contrib correctamente, debes cumplir con los requisitos de versiones específicas de Python y dependencias.

Requisitos clave

PaqueteVersión requeridaCompatibilidad con Python
NILMTK>=0.4Python 3.7 (recomendado)
scikit-learn>=0.21Python 3.5-3.7
Keras>=2.2.4Python 3.5+
cvxpy>=1.0.0Python >=3.7 (para cvxpy<=1.0.0)

Guia paso a paso para instalar nilmtk-contrib sin conflictos

Los pasos ajustados para crear un entorno limpio, instalando las versiones de las librerías necesarias y evitando los errores tipicos:

1. Crear y preparar el entorno virtual

Primero, elimina cualquier entorno anterior si es necesario y luego crea uno nuevo:

# Verificar los entornos existentes
conda env list

# Eliminar el entorno 'nilm' si ya existe
conda env remove --name nilm

# Limpiar cache
conda clean --all

Python 3.7 es la versión más estable que es usada para estas dependencias y la que los creadores de NILMTK recomiendas, luego, lo ideal es crear el entorno limpio con esa versión:

# Crear el entorno 'nilm' con Python 3.7
conda create -n nilm python=3.7 -y

# Activar el entorno recién creado
conda activate nilm

2. Instalar numpy compatible

Instalar una versión específica de numpy para asegurar la compatibilidad con NILMTK:

pip install numpy==1.19.5

3. Agregar canales de Conda

Para asegurar que las dependencias necesarias se encuentren:

conda config --add channels conda-forge
conda config --add channels nilmtk

4. Instalar nilmtk

Instala la versión compatible de NILMTK:

conda install -c nilmtk nilmtk=0.4.3 -y

5. Instalar matplotlib compatible

La versión de matplotlib requerida por NILMTK 0.4.3 es algo restrictiva. Debes instalar matplotlib-base primero:

# Instalar matplotlib-base y matplotlib compatibles
conda install matplotlib-base=3.1.3 matplotlib=3.1.3 -y

6. Instalar TensorFlow compatible

Instalar una versión de TensorFlow compatible con las bibliotecas:

pip install tensorflow==1.14.0

7. Instalar nilm_metadata

Instalar el paquete nilm_metadata desde GitHub:

pip install git+https://github.com/nilmtk/nilm_metadata

8. Instalar nilmtk-contrib

La instalación de nilmtk-contrib podría fallar debido a la falta de detección de la instalación de NILMTK por parte de pip. La solución es instalar nilmtk-contrib sin depender de las bibliotecas que necesita verificar:

pip install --no-deps git+https://github.com/nilmtk/nilmtk-contrib

Alternativa (si el paso anterior no funciona ): Si el paso anterior no funciona, puedes clonar el repositorio y hacer la instalación manualmente:

git clone https://github.com/nilmtk/nilmtk-contrib.git
cd nilmtk-contrib
pip install --no-deps .

9. Instalar otras dependencias necesarias

Es posible que necesites instalar otras dependencias, como cvxpy y protobuf:

pip install protobuf==3.20.*
pip install cvxpy==1.1.13

10. Crear archivo parche.py (muy importante)

Si ejecutamos algo que incluya el modulos niml_contrib con la instalacion actual, lo normal es tener con BinaryCrossentropy y MeanSquaredError. Si se presenta el error ImportError: cannot import name 'BinaryCrossentropy' from 'keras.losses', podriamos editar el archivo correspondiente (rnn_attention_classification.py) para reemplazar las importaciones incorrectas de Keras. Es decir en lugar de:

from keras.losses import BinaryCrossentropy, MeanSquaredError

Usar las funciones personalizadas para estas pérdidas:

from keras import backend as K

def BinaryCrossentropy():
def loss(y_true, y_pred):
return K.binary_crossentropy(y_true, y_pred)
return loss

def MeanSquaredError():
def loss(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
return loss

El problema es que si tocamos ficheros de la librería nos va a fallar el kernel, así que lo mejor es hacerlo lo mismo desde un parche (lo cual en el argot se llama monkey patche), que deberemos guardar en nuestro directorio de trabajo.

El contenido final del parche, por ejemplo que nombraremos como «parche.py» , es el siguiente:

import keras.losses
import keras.layers

# Parches para evitar errores de importación con versiones antiguas de Keras
if not hasattr(keras.losses, 'BinaryCrossentropy'):
    def BinaryCrossentropy(*args, **kwargs): pass
    keras.losses.BinaryCrossentropy = BinaryCrossentropy

if not hasattr(keras.losses, 'MeanSquaredError'):
    def MeanSquaredError(*args, **kwargs): pass
    keras.losses.MeanSquaredError = MeanSquaredError

if not hasattr(keras.layers, 'MultiHeadAttention'):
    class MultiHeadAttention:
        def __init__(self, *args, **kwargs): pass
        def __call__(self, *args, **kwargs): return self
    keras.layers.MultiHeadAttention = MultiHeadAttention

if not hasattr(keras.layers, 'LayerNormalization'):
    class LayerNormalization:
        def __init__(self, *args, **kwargs): pass
        def __call__(self, *args, **kwargs): return self
    keras.layers.LayerNormalization = LayerNormalization

Para usar el parche en nuestro código sin tener que tocar variables de entorno con el directorio de trabajo podemos usar este ejemplo adaptándolo a nuestra casuística particular:

import tensorflow as tf
print("TF version:", tf.__version__)

import sys
sys.path.append("D:/ruta/a/tu/directorio/del/parche")  # Asegúrate de que el parche.py esté allí

import parche  # Esto aplica los monkey patches

import nilmtk_contrib
print("nilmtk-contrib instalado correctamente")
  • El parche.py se encarga de que nilmtk_contrib no falle por capas o funciones modernas que no existen en Keras 2.2.4.
  • Si necesitas realmente usar MultiHeadAttention o BERT, requerirás migrar a TensorFlow 2.x (no recomendado si usas NILMTK 0.4.3).

11. Registrar el entorno en Jupyter (Muy recomndable)

Si deseas usar este entorno en Jupyter Notebook, regístralo como un nuevo kernel:

python -m ipykernel install --user --name nilm --display-name "Python (nilm)"

Para probar que todo ha ido bien, ejecuta este comando para confirmar que todo está instalado correctamente:

python -c «import nilmtk; import nilmtk_contrib; print(‘Éxito’)»

12. Salir del entorno

Cuando termines de trabajar en el entorno, puedes desactivarlo:

conda deactivate

13. Verificar el entorno

Finalmente, asegúrate de que el entorno esté configurado correctamente:

conda env list

Con estos pasos, tu entorno limpio debería estar correctamente configurado para trabajar con NILMTK, nilmtk-contrib, y otras bibliotecas necesarias. Si tienes algún problema en el proceso, seria recomendable empezar nuevamente desde el principio porque esta guia ha sido contrasatada y deberia de funcionar.

Módulos que puede que se necesite instalar si hay errores ( lo anexo simplemente por curiosidad pero no seran necesarios con los pasos anteriores):

1. Instalar Keras y TensorFlow compatibles

Para evitar conflictos con keras.optimizers, usa:

pip install tensorflow==2.5.0 keras==2.4.3 h5py==3.1.0

2. Instalar cvxpy 1.0.0 (versión compatible)

cvxpy 1.0.0 funcionaba con Python 3.7 pero ahora no es posible:

pip install cvxpy==1.0.0

El error ocurre porque CVXPY 1.0.0 no existe en PyPI, y las versiones disponibles requieren Python ≥3.8. Para resolverlo en tu entorno nilmtk-env (Python 3.7), sigue estos pasos:

3. Instalar CVXPY 1.3.4 (última versión compatible con Python 3.7):

pip install cvxpy==1.3.4 numpy==1.19.5 scipy==1.6.3

Verificar instalación:

python -c "import cvxpy; print(cvxpy.__version__)"
# Debe mostrar: 1.3.4

Resolución de otros conflictos comunes

ErrorSolución
ImportError: cannot import name 'SGD'Asegúrate de usar tensorflow.keras.optimizers en lugar de keras.optimizers.
ModuleNotFoundError: No module named 'tensorflow'Revisa que tensorflow==2.5.0 esté instalado.
numpy.ufunc size changedFija numpy==1.19.5 y evita actualizaciones automáticas.

Notas adicionales

  • GPU: Si tienes una tarjeta NVIDIA, instala CUDA 11.2 y cuDNN 8.1.0 para acelerar el entrenamiento.
  • Entornos alternativos: Si persisten errores, clona los repositorios manualmente y configura el PYTHONPATH:bashgit clone https://github.com/nilmtk/nilm_metadata.git git clone https://github.com/nilmtk/nilmtk.git git clone https://github.com/nilmtk/nilmtk-contrib.git set PYTHONPATH=%PYTHONPATH%;C:\ruta\a\nilm_metadata;C:\ruta\a\nilmtk;C:\ruta\a\nilmtk-contrib

Con estos pasos, nilmtk-contrib debería funcionar sin conflictos en Windows.

Ejemplo de Uso

Después de instalarlo, puedes importar y utilizar algoritmos de desagregación avanzados como:

from nilmtk_contrib.disaggregate import Seq2Point

model = Seq2Point()
# Cargar datos y entrenar el modelo...

Conclusión

nilmtk-contrib es una excelente opción si trabajas en NILM y necesitas herramientas más actualizadas y flexibles que las que ofrece NILMTK por defecto. Es especialmente útil para investigadores que desean experimentar con nuevos modelos de desagregación energética.

2024 03 31 12 37 03 INSTALAR NILMTK EN UBUNTU Busqueda de Google y 6 paginas mas Personal  Micro

Cómo Modificar el Voltaje de un Adaptador o un cargador de Móvil


Es muy habitual encontrar videos de como modificar fuentes conmutadas AC/DC concebidas para un uso especifico, como por ejemplo cargar un smartphone que ofrecen una salida de unos 5V, para obtener otra tensión que podamos necesitar para alimentar cualquier otro dispositivo electrónico cuyo cargador por ejemplo hayamos perdido o se haya averiado . Ciertamente con esta sencilla modificación, que vamos a ver, se podrán variar el voltaje de 5V a 12V o incluso de 12V a 30V sin mayores complicaciones , usando los mínimos componentes y sobre todo reutilizando con cosas que quizás ya no usemos.

Como punto importante, a destacar es que con el simple cambio modificamos la tensión de salida de la fuente hasta un limite que podria llegar incluso hasta los 30v, pero la corriente que sea capaz de suministrar será la misma, es decir si la fuente de 500mA , esa será la corriente máxima que pueda soportar la fuente modificada .

Un esquema real

Antes de empezar veamos un ejemplo de una fuente real 220/5v DC cuyo esquema interno se ha obtenido por ingeniería inversa

El circuito proporciona hasta 10W de potencia, suficiente para cargar dispositivos como tabletas o iPads. Se trata de una fuente conmutada del tipo flyback converter auto-oscilante, la cual aísla la red eléctrica mediante un transformador y un circuito óptico, proporcionando seguridad siempre que se utilicen componentes de calidad. No obstante, se deben tomar precauciones debido a los altos voltajes DC presentes en el circuito.

El funcionamiento del circuito se divide en cuatro etapas: 1-rectificación y filtrado, donde un puente de diodos y un condensador convierten la corriente alterna en corriente continua; 2-oscilador y driver primario, que usa transistores para conmutar el transformador; 3-circuito de retroalimentación, que regula la salida mediante un optoacoplador y un devanado auxiliar; y 4-adecuación del voltaje de salida, donde un diodo Schottky se encarga de la rectificación final.

La parte que nos va a ser útil para nuestro propósito es la Etapa 3,circuito de retroalimentación, donde cualquier desvío en el voltaje de salida se corrige a través de dos señales, la primera viene del devanado secundario marcado como FBACK y la segunda viene de un opto-acoplador. Las dos señales son tomadas de tal manera que existe un aislamiento eléctrico entre el voltaje de salida y el voltaje de entrada. El aislamiento es óptico en el caso del opto-acoplador y magnético en el caso del transformador. El opto-acoplador usa un diodo zener de 4.3 voltios en su entrada, que sumado a la caída de voltaje de 0.9 voltios del propio dispositivo suman aproximadamente 5.2 voltios. Si el voltaje de salida sube más de 5.2 voltios, la salida del dispositivo opto-acoplador disminuye su resistencia aparente y esto modifica el ciclo de trabajo de la onda que alimenta el transformador.

Principios Básicos: ¿Cómo se Regula el Voltaje en una fuente conmutada a groso modo?

Bien hemos visto un esquema real anteriormente, ahora revisemos algunos conceptos esenciales. Las fuentes de alimentación conmutadas, como los cargadores de móviles, controlan su voltaje de salida mediante un optoacoplador y un diodo Zener.

El circuito de regulación inicia con un voltaje bajo, por ejemplo, 1V, y aumenta progresivamente hasta que el optoacoplador y el diodo Zener entran en acción. Por ejemplo, si utilizamos un diodo Zener de 4.7V y el optoacoplador requiere 1V, el sistema se estabiliza cuando el voltaje supera los 5.7V. En este punto, el transistor del circuito de control recibe una señal que detiene el incremento de voltaje.

Modificando el Voltaje de Salida Para cambiar el voltaje de salida, reemplazaremos el diodo Zener por otro con un valor diferente. Sigamos estos pasos:

  1. Confirmamos el voltaje de salida del cargador (aproximadamente 5V, en nuestro caso, 5.4V).
  2. Sustituimos el diodo Zener original por uno de 10V.
  3. Verificamos el nuevo voltaje de salida, que ahora será de aproximadamente 11V, debido a la interacción con el optoacoplador.

Implementando un Voltaje Ajustable Si queremos un voltaje variable, utilizaremos un TL431, un diodo Zener programable de tres terminales (referencia, ánodo y cátodo):

  1. Conectamos el cátodo del TL431 al cátodo del diodo Zener original.
  2. Su ánodo se conecta al ánodo del diodo original.
  3. El pin de referencia se enlaza con el terminal central de un potenciómetro o trimmer.

Antes de soldar, ajustamos el potenciómetro a la mitad de su valor total para mayor seguridad. Por ejemplo, si es de 5 kΩ, lo fijamos en 2.5 kΩ. Luego, instalamos el TL431 y verificamos las conexiones.

Resultados y Consideraciones Finales Al probar nuestro circuito, observamos que podemos variar el voltaje entre diferentes valores según nuestras necesidades, por ejemplo:

  • 4.3V
  • 9V
  • 12V

Es fundamental asegurarnos de no exceder la capacidad de los componentes, especialmente la de la tensión máxima del condensador de salida (en este caso, 16V).

Con este método, podemos readaptar casi cualquier cargador para diferentes proyectos electrónicos de manera segura y eficiente de modo que reusemos estos que de otra manera tal vez estaban olvidado en el fondo de un cajón.