{"id":39119015,"url":"https://github.com/croko22/vit-cpp","last_synced_at":"2026-01-17T20:26:13.663Z","repository":{"id":291803265,"uuid":"978833340","full_name":"croko22/vit-cpp","owner":"croko22","description":"An implementation of the Transformer model architecture (\"Attention Is All You Need\") in pure C++17 from scratch","archived":false,"fork":false,"pushed_at":"2025-07-26T00:40:04.000Z","size":194,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-26T05:55:24.380Z","etag":null,"topics":["cpp","cuda","deep-learning","machine-learning","neural-network","transformer"],"latest_commit_sha":null,"homepage":"https://arxiv.org/abs/1706.03762","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/croko22.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-06T15:19:13.000Z","updated_at":"2025-07-26T00:40:09.000Z","dependencies_parsed_at":"2025-07-06T23:24:54.023Z","dependency_job_id":"872addf9-6ef6-4d86-a12f-f9a9b72ed167","html_url":"https://github.com/croko22/vit-cpp","commit_stats":null,"previous_names":["croko22/marian","croko22/vit-cpp"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/croko22/vit-cpp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/croko22%2Fvit-cpp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/croko22%2Fvit-cpp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/croko22%2Fvit-cpp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/croko22%2Fvit-cpp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/croko22","download_url":"https://codeload.github.com/croko22/vit-cpp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/croko22%2Fvit-cpp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28517574,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T18:55:29.170Z","status":"ssl_error","status_checked_at":"2026-01-17T18:55:03.375Z","response_time":85,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","cuda","deep-learning","machine-learning","neural-network","transformer"],"created_at":"2026-01-17T20:26:12.927Z","updated_at":"2026-01-17T20:26:13.654Z","avatar_url":"https://github.com/croko22.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- omit from toc --\u003e\n# Vision Transformer\n\n- Kevin Joaquin Chambi Tapia\n- Victor Alejandro Quicaño Miranda\n- Eduardo German Ruiz Mamani\n- Sebastian Agenor Zamalloa Molina\n\nEste proyecto implementa un modelo **Vision Transformer (ViT)** utilizando únicamente **CUDA y C++**. La implementación es educativa y busca comprender los fundamentos del paper [\"An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale\" (Dosovitskiy et al., 2020)](https://arxiv.org/pdf/2010.11929).\n\nA diferencia de las redes neuronales convolucionales tradicionales, este enfoque transforma una imagen en pequeños *patches* que son procesados como secuencias, permitiendo el uso de la arquitectura Transformer originalmente diseñada para tareas de procesamiento de lenguaje natural.\n\n\u003c!-- omit from toc --\u003e\n## Contenido\n- [Objetivo](#objetivo)\n- [¿Qué es Vision Transformer?](#qué-es-vision-transformer)\n- [Cómo compilar y ejecutar](#cómo-compilar-y-ejecutar)\n- [Explicación del código](#explicación-del-código)\n- [Entrenamiento](#entrenamiento)\n- [Predicción](#predicción)\n- [Resultados](#resultados)\n  - [MNIST](#mnist)\n  - [Fashion-MNIST](#fashion-mnist)\n  - [Blood-MNIST](#blood-mnist)\n\n\n## Objetivo\n\nEl objetivo principal es explorar cómo los Transformers pueden aplicarse al reconocimiento visual desde cero, sin depender de frameworks de alto nivel, y acelerando el entrenamiento e inferencia mediante **CUDA** y **programación en bajo nivel con C++**.\n\n## ¿Qué es Vision Transformer?\n\nEl **Vision Transformer (ViT)** divide una imagen en bloques fijos (por ejemplo, de 16x16 píxeles), los aplane y los trate como \"palabras\" o tokens. Estos tokens se procesan mediante una serie de capas Transformer, seguidas por una capa final de clasificación.\n\u003c!-- omit from toc --\u003e\n### Características clave:\n- División de imágenes en *patches*.\n- Uso de embeddings aprendidos para cada patch.\n- Inserción de un token especial `[CLS]` para la clasificación.\n- Uso de atención multi-cabeza y posiciones absolutas aprendidas.\n\n![architecture](docs/img/architecture.png)\n\n\u003c!-- ## Referencias\n\n- [An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale](https://arxiv.org/pdf/2010.11929)\n- [Attention Is All You Need](https://arxiv.org/abs/1706.03762)\n\n## Notebooks\n- [ViT - Keras](https://colab.research.google.com/drive/1OlspI87qJouwFWuTzH2k29ai4XsfYnrT?usp=sharing)\n- [ViT - Pytorch](https://colab.research.google.com/drive/1J_GLR-PMsMiuiRqsPXpJXCT8LMaOfuq1?usp=sharing) --\u003e\n\n## Cómo compilar y ejecutar\n\nEste proyecto utiliza un `Makefile` para la compilación y un script `run.sh` para simplificar la ejecución.\n\u003c!-- omit from toc --\u003e\n### Requisitos\n\n  * Un compilador de C++ compatible con C++17 (ej. `g++`).\n  * La utilidad `make`.\n  * Python 3 para scripts auxiliares.\n\u003c!-- omit from toc --\u003e\n### Uso del script `run.sh`\n\n**1. Dar permisos de ejecución (solo una vez):**\n\n```bash\nchmod +x run.sh\n```\n\n2. Comandos disponibles:\n\nEntrenar el modelo:\nUsa un archivo de configuración para definir todos los hiperparámetros.\n\n```bash\n./run.sh train \u003cruta_a_config.cfg\u003e\n```\n\nEjemplo:\n\n```bash\n./run.sh train models/configs/mnist_small.cfg\n```\n\nEvaluar un modelo:\nGenera la matriz de confusión para un modelo entrenado.\n\n```\n./run.sh evaluate \u003cruta_al_modelo.bin\u003e \u003cnombre_dataset\u003e\n```\n\nEjemplo:\n\n```bash\n./run.sh evaluate models/mnist/vit_...bin mnist\n```\n\nPredecir con una imagen aleatoria:\nExtrae una imagen al azar de un dataset y usa el modelo más reciente.\n\n```bash\n./run.sh predict [nombre_dataset]\n```\n\nEjemplo (usa mnist por defecto):\n\n```bash\n./run.sh predict fashionmnist\n```\n\nHacer inferencia directa:\nRealiza una predicción sobre un archivo de imagen específico.\n\n```bash\n./run.sh infer \u003cmodelo.bin\u003e \u003cimagen.csv\u003e\n```\n\nLimpiar el proyecto:\nElimina los archivos de compilación.\n\n```bash\n./run.sh clean\n```\n\nPerfecto, con base en tu estructura de archivos y el contenido actual del `README`, podrías insertar una sección **\"Explicación del código\"** que detalle la arquitectura y módulos principales. Aquí te dejo una versión integrada para que simplemente pegues en tu `README.md` (después de la sección de \"Referencias\" o antes de \"Cómo compilar y ejecutar\"):\n\n---\n\n## Explicación del código\n\u003c!-- omit from toc --\u003e\n### Arquitectura general\n\nEl modelo está dividido modularmente en componentes inspirados en la arquitectura Transformer original:\n\n```bash\nsrc/\n├── core/           # Componentes fundamentales como tensores y funciones de activación\n├── model/          # Arquitectura del modelo Transformer\n├── optimizer/      # Optimizadores implementados manualmente\n```\n\u003c!-- omit from toc --\u003e\n### Atención Multi-Cabeza\n\nLa atención se implementa en `model/multihead_attention.cpp`. Se construye a partir de:\n\n* Proyecciones lineales para `Q`, `K`, `V` (query, key, value).\n* Normalización por raíz de la dimensión (`1/sqrt(dk)`).\n* Softmax sobre las similitudes `QK^T`.\n* Producto con `V` para obtener el resultado por cabeza.\n* Concatenación y proyección final.\n\nEsto permite al modelo enfocarse en distintas partes de la imagen simultáneamente.\n\u003c!-- omit from toc --\u003e\n### Codificador (Transformer Encoder)\n\nUbicado en `model/encoder.cpp`, cada bloque encoder tiene:\n\n* Atención multi-cabeza (`MultiHeadAttention`)\n* Normalización (`LayerNorm`)\n* MLP residual (Feed Forward)\n* Normalización final\n\nSe repiten en stack (definido por `n_layers` en config).\n\u003c!-- omit from toc --\u003e\n### Modelo Vision Transformer\n\nEn `model/vit.cpp`, se definen:\n\n* División de imagen en *patches*.\n* Embedding lineal para cada patch + posición.\n* Inserción del token `[CLS]`.\n* Stack de `Encoder` + capa final lineal de clasificación.\n\u003c!-- omit from toc --\u003e\n### Núcleo del sistema\n\u003c!-- omit from toc --\u003e\n#### `core/tensor.cpp`\n\nDefine un tipo de tensor liviano con soporte para operaciones básicas (suma, producto, reshape). Es la base para todos los cálculos.\n\u003c!-- omit from toc --\u003e\n#### `core/activation.cpp`\n\nContiene activaciones como ReLU, GELU, y Softmax.\n\u003c!-- omit from toc --\u003e\n#### `optimizer/*.cpp`\n\nImplementaciones manuales de `SGD`, `Adam`, y `AdamW` siguiendo fórmulas originales con soporte para `weight decay`.\n\n## Entrenamiento\n![train](docs/img/train1.png)\n...\n![train](docs/img/train2.png)\n\n## Predicción\n![infer](docs/img/predict1.png)\n\n## Resultados\n### MNIST\nConfiguración: Se utilizó la configuración definida en configs/mnist.cfg.\n\nMétricas Finales:\n| Métrica              | Valor     |\n| :------------------- | :-------- |\n| Precisión (Accuracy) | 96.44%    |\n| F1-Score (Macro)     | 0.9638    |\n\nCurva de Entrenamiento:\n![infer](docs/img/mnist1.png)\n\nMatriz de Confusión:\n![infer](docs/img/mnist_cm.png)\n\n### Fashion-MNIST\nConfiguración: Se utilizó la configuración definida en configs/fashionmnist.cfg.\n\nMétricas Finales:\n| Métrica              | Valor     |\n| :------------------- | :-------- |\n| Precisión (Accuracy) | 86.79%    |\n| F1-Score (Macro)     | 0.8678    |\n\n\nCurva de Entrenamiento:\n![infer](docs/img/fashion1.png)\n\nMatriz de Confusión:\n![infer](docs/img/fashion_cm.png)\n\n### Blood-MNIST\nConfiguración: Se utilizó la configuración definida en configs/bloodmnist.cfg.\n\nMétricas Finales:\n| Métrica              | Valor     |\n| :------------------- | :-------- |\n| Precisión (Accuracy) | 0.77%    |\n| F1-Score (Macro)     | 0.7513    |\n\nCurva de Entrenamiento:\n![infer](docs/img/bloodmnist1.png)\n\nMatriz de Confusión:\n![infer](docs/img/bloodmnist_cm.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcroko22%2Fvit-cpp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcroko22%2Fvit-cpp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcroko22%2Fvit-cpp/lists"}