[PYTHON] J'ai fait un générateur de réseau neuronal qui fonctionne sur FPGA

Aperçu

J'ai fait un générateur de réseau neuronal qui fonctionne sur FPGA.

une fonction

Le référentiel est ici https://github.com/kotauchisunsun/NN_FPGA

Environnement d'exploitation

--Python 2.7 ou supérieur et inférieur à 3

Python2.7 est requis pour les générateurs, mais Icurus Verilog n'est pas requis sans simulation. Aucune bibliothèque spéciale n'est requise, seule la bibliothèque standard Python fonctionne.

Licence

Affero GPL v3

Comment utiliser

Partie structurelle du réseau neuronal La grammaire de base est

$ python script/main.py width input_num structure output_num

width: largeur de bit fractionnaire input_num: nombre de signaux d'entrée structure: affiche la structure du réseau. La structure en plusieurs étapes peut être exprimée en séparant par des virgules (décrit plus loin) output_num: nombre de signaux de sortie

Exemple)

$ python script/main.py 16 2 2 2
> NN_NL_016_0002_0002_NL_016_0002_0002
> saved to generate.v
> None

En conséquence, un réseau neuronal appelé NN_NL_016_0002_0002_NL_016_0002_0002 qui fonctionne avec une fraction de 16 bits est construit dans generate.v. Cela représente un réseau neuronal comme le montre la figure ci-dessous. image

Le sens de chacun entrée *: entrée sortie *: sortie w *: facteur de poids pour l'entrée b *: biais du réseau neuronal

Par exemple, la condition pour que le réseau neuronal supérieur gauche se déclenche est

if input1 * w1 + input2 * w3 + b1 > 0:
    return 1
else:
    return 0

Il est.

Aussi, l'ordre des arguments passés à NN_NL_016_0002_0002_NL_016_0002_0002,

  1. input*
  2. w*
  3. b*
  4. output* C'est l'ordre de. Par conséquent, si vous notez tout ce cas
input1,input2,w1,w2,w3,w4,w5,w6,w7,w8,b1,b2,b3,b4,ouput1,output2

Il est. Le résultat de la déduction du réseau neuronal est dans output1 et output2.

De plus, ce main.py peut également créer un réseau de neurones à plusieurs étages.

$ python main.py 16 32 64,32,48 16

Ensuite, il peut gérer des fractions de 16 bits de large.

couche Nombre d'unités dans le réseau neuronal
Couche d'entrée 32
Couche cachée 1 64
Couche cachée 2 32
Couche cachée 3 48
Couche de sortie 16

Vous pouvez construire un réseau neuronal appelé.

Expression fractionnelle

Le réseau neuronal cette fois ne prend pas en charge la virgule flottante couramment utilisée. Par conséquent, il faut un certain temps pour remplacer le coefficient de poids et l'entrée.

Les spécifications de la fraction sont les suivantes. Lorsque largeur = 16 1 à 8 bits: chaque bit de la partie fractionnaire représente 2 ^ (-8 + i-1). (C) 9 à 15 bits: partie entière Chaque bit représente 2 ^ (i-8-1). (N) 16 bits: indicateur de nombre négatif (F)

bit 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
sens F N N N N N N N C C C C C C C C

Il est. Les bits jusqu'à largeur / 2 sont la partie fractionnaire, le bit supérieur est le drapeau de nombre négatif et les autres sont la partie entière.

C'est compliqué d'entendre ça, alors j'ai préparé un scénario.

$ python script/convert_number.py width number
``
width:Largeur de bits mineure
number:Valeur que vous souhaitez convertir

Exemple:

$ python script/convert_number.py 16 5.5

16b'0000010110000000 ABS ERROR = 0.000000e+00


En conséquence, 5 avec une fraction de 16 bits.Lorsque 5 est exprimé, 16b'Vous pouvez voir qu'il devient 0000010110000000.
Vous pouvez voir que vous pouvez saisir cette valeur lors de la création avec Verilog.
Ici, ABS ERROR est une erreur exprimée sous forme de fraction. Lorsqu'un nombre décimal est exprimé sous la forme d'un nombre binaire de 16 bits, le taux d'erreur absolu généré est exprimé en notation décimale.

Exemple:

$ python script/convert_number.py 16 -1.1

16b'1111111011100111 ABS ERROR = 2.343750e-03


-1.Lorsque 1 est représenté par une fraction fixe de 16 bits, ABS ERROR= 2.343750e-Puisqu'il est 03, vous pouvez voir qu'il y a une erreur. Par conséquent, s'il est exprimé sous la forme d'une fraction fixe de 32 bits,

Exemple:

$ python script/convert_number.py 32 -1.1

32b'11111111111111101110011001100111 ABS ERROR = 9.155273e-06


ABS ERROR = 9.155273e-Il devient 06, et on peut voir que l'erreur est réduite par rapport à lorsqu'elle est exprimée en 16 bits. Si vous augmentez la largeur de bits, la précision augmentera, mais l'échelle du circuit augmentera et cela ne fonctionnera pas sur le FPGA, alors réglez tout en équilibrant.

#À la fin

Cela fait 4 mois que j'ai commencé Verilog HDL et FPGA. Si vous avez des bogues, des erreurs, des politiques d'extension, etc., veuillez nous en informer.


Recommended Posts

J'ai fait un générateur de réseau neuronal qui fonctionne sur FPGA
J'ai couru le réseau neuronal sur le FPGA réel
J'ai créé une VM qui exécute OpenCV pour Python
J'ai essayé de mettre en œuvre un réseau de neurones à deux couches
J'ai essayé de créer un environnement serveur qui fonctionne sous Windows 10
Création d'un modèle de discrimination d'image (cifar10) à l'aide d'un réseau neuronal convolutif
J'ai créé un robot LINE qui envoie des images recommandées tous les jours à l'heure
J'ai créé un Linebot qui m'informe des sites d'évacuation à proximité sur AWS
J'ai essayé un réseau de neurones Π-Net qui ne nécessite pas de fonction d'activation
〇✕ J'ai fait un jeu
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
[Django] Appuyez sur une commande que vous avez effectuée à partir du processus qui s'exécute sur manage.py.
Une histoire qui a trébuché lorsque j'ai créé un bot de chat avec Transformer
J'ai essayé de mettre en œuvre le modèle de base du réseau neuronal récurrent
Implémenter un réseau neuronal à 3 couches
Je veux un générateur de mox
Créez une application Web qui reconnaît les nombres avec un réseau neuronal
unixtime ← → J'ai essayé de créer une classe qui effectue facilement la conversion datetime
J'ai fait une putain d'application qui ne te laisse pas sauter
Je veux un générateur mox (2)
J'ai fait un modèle VGG16 en utilisant TensorFlow (en chemin)
J'ai créé un modèle de détection d'anomalies qui fonctionne sur iOS
J'ai fait une minuterie pomodoro dure qui fonctionne avec CUI
J'ai fait un texte Python
J'ai fait un robot discord
J'ai essayé de classer la musique en majeur / mineur sur Neural Network
Construction d'un réseau neuronal qui reproduit XOR par Z3
J'ai essayé un réseau de neurones convolutifs (CNN) avec un tutoriel TensorFlow sur Cloud9-Classification des images manuscrites-
J'ai créé un plug-in qui peut faire "Daruma-san tombé" avec Minecraft
J'ai créé un générateur brouillé qui encode vos phrases préférées de UTF-8 à Shift-JIS (cp932) en Python
J'ai créé une caméra réseau simple en combinant ESP32-CAM et RTSP.
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
J'ai installé Taiga.IO sur CentOS7 (j'ai fait un script pendant que j'y étais)
J'ai créé un programme qui résout la recherche d'erreur en quelques secondes
Facile! Implémenter un bot Twitter qui s'exécute sur Heroku en Python
J'ai créé un robot Twitter qui marmonne le Pokémon capturé par #PokemonGO
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
J'ai fait une commande lo qui est plus utile que ls
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
[python] J'ai créé une classe qui peut écrire rapidement une arborescence de fichiers
J'ai créé un site d'apprentissage C ++
J'ai fait un Line-bot avec Python!
J'ai créé un script de traduction basé sur CUI (2)
Implémentation d'un réseau de neurones à deux couches 2
J'ai fait une loterie avec Python.
J'ai créé un script de traduction basé sur CUI
[Python] J'ai créé un robot qui me dit la température actuelle lorsque j'entre un nom de lieu sur LINE
J'ai fait un calendrier qui met à jour automatiquement le calendrier de distribution de Vtuber
[Python] J'ai fait un décorateur qui ne semble pas avoir d'utilité.
J'ai fait un générateur de mot de passe pour enseigner Python3 aux enfants (bonus) * Complètement refait
J'ai créé une application Web en Python qui convertit Markdown en HTML
J'ai créé un plug-in "EZPrinter" qui génère facilement des PDF cartographiques avec QGIS.
Attaques suspectes survenues dès que j'ai lancé un blog sur EC2
J'ai créé un bot Discord en Python qui se traduit quand il réagit
[Python] J'ai créé un utilitaire qui peut accéder au type dict comme un chemin
J'ai fait une simple minuterie qui peut être démarrée depuis le terminal