La estructura y algunas partes fundamentales de este código están adaptadas del aprendizaje profundo de la pila completa (FSDL).
Puede ver este proyecto en acción en la demostración y la publicación acompañadas, o ejecutar el código en este cuaderno.
La carpeta /cloud imita los datos de almacenamiento en la nube. En la configuración del mundo real, el conjunto de datos se almacenará en un servicio de almacenamiento en la nube como Amazon S3. El código real vive en la carpeta /codebase . Existe una clara separación entre el código de capacitación (en /codebase/training ) y todo lo demás, incluidos modelos, redes, conjuntos de datos y otras utilidades (bajo /codebase/font_classifier ). Esta separación hace que la implementación del sistema sea más fácil y limpia.
Como se presenta en el curso FSDL, para controlar las versiones los datos, no verificamos las imágenes reales en GIT. En cambio, se crea un archivo JSON que contiene una entrada por instancia de datos. Cada entrada consta de la URL de la instancia de datos (almacenamiento en la nube), la etiqueta y otros metadatos, si es relevante. Este archivo JSON es lo que Git rastreó y, por lo tanto, podemos obtener los datos en la versión requerida verificando la confirmación de GIT correspondiente. A medida que el conjunto de datos se hace más grande, el tamaño del archivo JSON se hace más grande, en cuyo caso se puede usar GIT-LFS. Beneficios de esta forma de manejar datos:
Reproducibilidad: dado que es rastreado por Git, podemos obtener los datos exactos que usamos hace una semana o hace un año.
Extendibilidad: el conjunto de datos se puede extender para incorporar nuevos datos mientras se asegura de nunca usar las instancias de prueba previas como instancias de entrenamiento y Vise Versa.
Portabilidad: Reduce el espacio de disco requerido para el proyecto, lo que lo hace portátil sobre GIT o cualquier otro medio.
Para ejecutar el código localmente:
Requisitos de instalación:
$ pip install -r requirements.txtObtener y extraer datos de las versiones a la carpeta /nube:
$ wget ' https://github.com/mhmoodlan/arabic-font-classification/releases/download/v0.1.0/rufa.tar.gz ' -O ./cloud/rufa.tar.gz
$ cd /cloud && tar -xzf ' rufa.tar.gz ' Gire un servidor simple en la carpeta /cloud en http://0.0.0.0:8000/:
$ cd /cloud && python -m http.serverEjecutar un experimento:
$ cd /codebase/code && export PYTHONPATH=. && python training/run_experiment.py --save
' {"dataset": "RuFaDataset", "model": "FontModel", "network": "cnn", "train_args": {"epochs": 6, "mode": "test", "validate_mismatch": "False"}} ' La configuración 'mode' en 'train_args' toma uno de dos valores: 'val' o 'test' .
En el modo 'val' : el modelo está entrenado y validado solo en datos sintéticos. Si 'validate_mismatch' se establece en True, se realiza una validación de desajuste de datos adicional en un subconjunto de los datos reales.
En el modo 'test' : el modelo está entrenado en todos los datos sintéticos + la parte de los datos reales utilizados en la validación de desajuste de datos en el modo 'val' . Después del entrenamiento, el error de generalización final se informa sobre el resto de los datos reales.
Este comando debería generar algo similar a lo siguiente:
Epoch 1/6
1254/1254 [==============================] - 119s 95ms/step - loss: 0.3185 - accuracy: 0.8751
Epoch 2/6
1254/1254 [==============================] - 40s 32ms/step - loss: 0.0539 - accuracy: 0.9918
Epoch 3/6
1254/1254 [==============================] - 40s 32ms/step - loss: 0.0386 - accuracy: 0.9953
Epoch 4/6
1254/1254 [==============================] - 40s 32ms/step - loss: 0.0270 - accuracy: 0.9976
Epoch 5/6
1254/1254 [==============================] - 40s 32ms/step - loss: 0.0264 - accuracy: 0.9973
Epoch 6/6
1254/1254 [==============================] - 40s 32ms/step - loss: 0.0246 - accuracy: 0.9979
Training took 323.854642 s
In test mode, mismatch data isn't validated since it's used during training.
14/14 [==============================] - 0s 10ms/step - loss: 0.2316 - accuracy: 0.9712
Test score: [0.2316255271434784, 0.971222996711731]