J'ai fait un générateur de réseau neuronal qui fonctionne sur FPGA.
Le référentiel est ici https://github.com/kotauchisunsun/NN_FPGA
--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.
Affero GPL v3
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.
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,
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é.
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